编辑: 显然,问题在于我应该执行
su - postgres -c "commands, commands, commands"
也就是将任何命令传递给 su
,而不是试图在 su
下面列出它们,因为那些命令(在 su
下面)不受 su
的影响。 /编辑
编辑 2: 请参考David Braun的回答,他提供了更好的解决方案:https://dev59.com/JWQn5IYBdhLWcg3wg3eR#22947716
在 Vagrant 启动脚本中,我不能切换用户 (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: FATAL: role "root" does not exist
用 sudo su - postgres
替换 su - postgres
没有任何效果(我认为脚本已经以 root 运行了)。
我在 su - postgres
前后添加了 id
(打印当前用户 ID),id
在调用 su
之前和之后都打印 uid=0(root) gid=0(root) groups=0(root)
。所以据我所知,su - postgres
被忽略了?当我试图切换回 root 用户时,某个 exit
命令会完全退出引导脚本 :-(
但是。在执行 vagrant ssh
后,我可以非常好地执行 sudo su - postgres
,然后启动 psql
。但无法从配置脚本中执行。
(一种解决方法是在调用 psql
时指定 -h 127.0.0.1 --username postgres
(而不是切换用户到 postgres)。并为 VM 本地连接启用基于 PostgreSQL trust 的身份验证。)