Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我可以在Vagrant引导shell脚本中切换用户吗?_Shell_Vagrant - Fatal编程技术网

我可以在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