我可以在Vagrant引导shell脚本中切换用户吗?
编辑显然,问题是我本应该这样做的我可以在Vagrant引导shell脚本中切换用户吗?,shell,vagrant,Shell,Vagrant,编辑显然,问题是我本应该这样做的 su-postgres-c“命令,命令,命令”, 也就是说,将任何命令传递给su,而不是尝试在su下面列出它们,因为那些命令(在su下面)不受su的影响/Edit 编辑2:有关更好的解决方案,请参见David Braun的答案: 我不能在一个飘忽不定的引导shell配置脚本中切换用户(su-postgres)?(为什么不呢?) 我在写这样的剧本。在该脚本中,我执行以下操作: echo '===== Creating PostgreSQL databases a
su-postgres-c“命令,命令,命令”
,也就是说,将任何命令传递给
su
,而不是尝试在su
下面列出它们,因为那些命令(在su
下面)不受su
的影响/Edit
编辑2:有关更好的解决方案,请参见David Braun的答案:
我不能在一个飘忽不定的引导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:致命:角色“根”不存在
将su-postgres
替换为sudo-su-postgres
没有效果(我认为脚本已经作为root运行了)
我在su-postgres
之前和之后添加了id
(它打印当前用户id),并且id
在调用su
之前和之后打印uid=0(root)gid=0(root)groups=0(root)
。就我所知,su-postgres
被忽视了?当我稍后尝试切换回root用户时,某个退出
,会完全退出引导脚本:-(
但是,在执行了vagrant ssh
之后,我能够sudo su-postgres
很好,然后启动psql
。但不能从配置脚本中启动
(一种解决方法是在调用
psql
时指定-h 127.0.0.1--username postgres
(而不是将用户切换到postgres)。还可以为VM本地连接启用基于PostgreSQL信任的身份验证。)我不确定您是否可以在Vagrant shell脚本中切换用户,因为这可能需要用户输入,而当脚本在provisioner中运行时,您无法提供用户输入……但为什么不使用psql命令指定用户呢
psql --username=postgres -c "..."
我只是在寻找一种以非根用户身份运行Vagrant提供程序脚本的方法时发现了这一点,并想为观察到的行为添加一个解释,这是非常基本的Unix知识,对读者来说非常有用
在shell脚本中运行程序(如/bin/sh、sudo或su)无法更改其运行的上下文(工作目录、正在运行的用户等)中的任何内容,只能为其创建的进程设置上下文(如果以root-uid 0运行,则仅更改正在运行的uid)。这也是为什么cd是shell中的内置命令。su是setuid程序(尝试命令“ls-l
which su
”)时请注意“s”,这意味着它将以拥有程序(root)的用户的身份运行,而不是以运行程序的用户的身份运行。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数据库”上,而不是如何在一个随意的脚本中切换用户。echo'===创建PostgreSQL数据库和用户的
echo '===== Creating PostgreSQL databases and users'
su postgres << EOF
psql -c "
create user SomeUserName password '...';
alter user ...;
"
EOF
su postgres回复:“因为这可能需要用户输入”-好的,我没有想到。所以如果我指定了--command-command
作为su
选项,我最终可能会让所有东西都工作起来。我想这就解释了一切,问题是我对Bash不是太熟悉,而不是与Vagrant相关的任何东西。(?)感谢--username
的建议。(我在问题的最后提到:“一个解决方法是指定-h127.0.0.1--username postgres
。)是的,对不起,我刚才看到你也提到了用户名部分…太快地跳进了答案,呵呵…你错过了每个案例结尾的;
。除此之外,我正在寻找一个很好的解决方案。使用“
在echo执行流浪用户任务的第行”
!正确的语法应该是echo“执行流浪用户任务”
@Doka:尽管这完全不相关,但我看不到任何支持您索赔的文档,这就是您处理该问题的方式:很好,我测试过它:-)我从问题本身添加了一个链接。我收到一个错误:无法从函数或多命令字符串执行CREATE DATABASE