我可以在Vagrant bootstrap shell脚本中切换用户吗?

Kaj*_*nus 29 shell vagrant

编辑显然,问题是我应该完成
su - postgres -c "commands, commands, commands",
即传递任何命令su,而不是尝试在下面列出它们su,因为这些命令(下面su)不受影响su./编辑

编辑2:请参阅David Braun的答案以获得更好的解决方案:https://stackoverflow.com/a/22947716/694469


我是否可以su - postgres在Vagrant引导程序shell配置脚本中切换user()?(为什么不?)

我正在写这样一个剧本.在那个剧本中,我这样做:

echo '===== Creating PostgreSQL databases and users'

su - postgres

psql -c "
  create user SomeUserName password '...';
  alter user ...;
  "
Run Code Online (Sandbox Code Playgroud)

在这里,psql应该尝试以用户身份登录postgres.然而,发生的事情su - postgres显然是失败,并且shell尝试以root用户身份登录.(显然,root是运行Vagrant引导程序shell脚本的用户.)

因此出现此错误并且不调用psql命令:

psql:致命:角色"root"不存在

替换su - postgressudo su - postgres没有效果(我认为脚本已经以root身份运行.)

我添加id(其输出当前用户ID)之前和之后su - postgres,和id打印uid=0(root) gid=0(root) groups=0(root)之前和之后su被调用.据我所知,su - postgres有点被忽视了吗?还有一点exit,稍后当我尝试切换回root用户时,完全退出bootstrap脚本:-(

然而.在做完之后vagrant ssh,我能够sudo su - postgres很好,然后开始psql.但不是来自配置脚本.

(解决方法是指定-h 127.0.0.1 --username postgres何时调用psql(而不是将用户切换到postgres).并且还为VM本地连接启用基于PostgreSQL信任的身份验证.)

Dav*_*aun 24

echo '===== Creating PostgreSQL databases and users'

su postgres << EOF
psql -c "
  create user SomeUserName password '...';
  alter user ...;
  "
EOF
Run Code Online (Sandbox Code Playgroud)


LHP*_*LHP 14

我在寻找一种以非root方式运行Vagrant提供程序脚本的方法时发现了这一点,并希望为观察到的行为添加一个解释,这是非常基本的Unix知识,对读者来说很有用.

在shell脚本中运行程序(例如/ bin/sh,sudo或su)不能更改运行它的上下文(工作目录,运行用户等)中的任何内容,只为它创建的进程设置上下文(并且仅如果以root身份运行,则更改正在运行的uid - uid 0).这也是为什么cd是shell中的内置命令的原因.su是一个setuid程序(当你尝试命令"ls -l"时注意"s" which su)这意味着它将作为拥有程序(root)的用户而不是运行它的用户运行.


oli*_*der 10

LHP是对的:它不是一个真正的流浪者问题.我不久前需要这样做,这就是我解决它的方法:

#!/bin/bash

case $(id -u) in
    0) 
         echo first: running as root
         echo doing the root tasks...
         sudo -u vagrant -i $0  # script calling itself as the vagrant user
         ;;
    *) 
         echo then: running as vagrant user
         echo doing the vagrant user's tasks
         ;;
esac
Run Code Online (Sandbox Code Playgroud)

也许这对某人有用,但另一个明显的解决方案是使用sudo运行第二个脚本.

固定:谢谢Macattack.我直接在stackoverflow中写道,它仍然没有经过测试.

编辑:问题已被编辑,现在它的描述和大多数答案都集中在"如何使用正确的用户创建postgres数据库",而不是如何在流浪脚本中切换用户.


Mat*_*per 3

我不确定您是否可以在 Vagrant shell 脚本中切换用户,因为这可能需要用户输入,而当脚本在配置程序中运行时您无法提供这些输入...但为什么不直接使用 psql 命令指定用户呢?

psql --username=postgres -c "..."
Run Code Online (Sandbox Code Playgroud)