编辑显然,问题是我应该完成
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 - postgres
为sudo 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数据库",而不是如何在流浪脚本中切换用户.
我不确定您是否可以在 Vagrant shell 脚本中切换用户,因为这可能需要用户输入,而当脚本在配置程序中运行时您无法提供这些输入...但为什么不直接使用 psql 命令指定用户呢?
psql --username=postgres -c "..."
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
11138 次 |
最近记录: |