编辑显然,问题是我本应该做的
su - postgres -c "commands, commands, commands"
,
也就是说,将任何命令传递给su
,而不是尝试在su
下面列出它们,因为这些命令(su
下方)不受su
的影响。的 /修改
编辑2:请参阅David Braun的答案以获得更好的解决方案:https://stackoverflow.com/a/22947716/694469
我是否可以在Vagrant引导程序shell配置脚本中切换用户(su - postgres
)? (为什么不呢?)
我正在写这样一个剧本。在那个剧本中,我这样做:
echo '===== Creating PostgreSQL databases and users'
su - postgres
psql -c "
create user SomeUserName password '...';
alter user ...;
"
此处,psql
应尝试以用户postgres
身份登录。但是,会发生su - postgres
显然失败,并且shell尝试以用户 root 登录。 (显然, root 是运行Vagrant引导程序shell脚本的用户。)
因此出现此错误并且未调用psql命令:
psql:致命:角色“root”不存在
用su - postgres
替换sudo su - postgres
无效(我认为该脚本已作为 root 运行。)
我在id
之前和之后添加了su - postgres
(打印当前用户ID),并在调用id
之前和之后uid=0(root) gid=0(root) groups=0(root)
打印su
。据我所知,su - postgres
有点被忽略了吗?还有一个exit
,稍后当我尝试切换回 root 用户时,完全退出引导脚本: - (
然而。完成vagrant ssh
后,我可以sudo su - postgres
就好了,然后开始psql
。但不是来自配置脚本。
(解决方法是在我调用-h 127.0.0.1 --username postgres
时指定psql
(而不是将用户切换到 postgres )。并且还为VM本地连接启用基于PostgreSQL信任的身份验证。 )
答案 0 :(得分:23)
echo '===== Creating PostgreSQL databases and users'
su postgres << EOF
psql -c "
create user SomeUserName password '...';
alter user ...;
"
EOF
答案 1 :(得分:14)
我在寻找一种以非root方式运行Vagrant提供程序脚本的方法时发现了这一点,并希望为观察到的行为添加一个解释,这是非常基础的Unix知识,对读者来说很有用。< / p>
在shell脚本中运行程序(例如/ bin / sh,sudo或su)不能更改运行它的上下文(工作目录,运行用户等)中的任何内容,只为它创建的进程设置上下文(并且只在以root身份运行时更改正在运行的uid - uid 0)。这也是为什么cd是shell中的内置命令的原因。 su是一个setuid程序(当你尝试命令“ls -l which su
”时注意“s”)这意味着它将作为拥有程序(root)的用户而不是运行它的用户运行。
答案 2 :(得分: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
这可能对某人有用,但另一个明显的解决方案是使用sudo运行第二个脚本。
固定:谢谢Macattack。我直接在stackoverflow中写了它,但它仍未经过测试。
编辑:问题已被编辑,现在它的描述和大多数答案都集中在“如何使用正确的用户创建postgres数据库”,而不是如何在流浪脚本中切换用户。答案 3 :(得分:3)
我不确定你是否可以在Vagrant shell脚本中切换用户,因为这可能需要用户输入,当脚本在配置器中运行时你无法提供它...但为什么不用psql命令指定用户?
psql --username=postgres -c "..."