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

时间:2013-05-27 08:01:22

标签: shell vagrant

编辑显然,问题是我本应该做的 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信任的身份验证。 )

4 个答案:

答案 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 "..."