【问题标题】:Can I switch user in Vagrant bootstrap shell script?我可以在 Vagrant 引导 shell 脚本中切换用户吗?
【发布时间】:2013-05-22 01:12:51
【问题描述】:

编辑显然,问题是我应该这样做
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: FATAL: 角色“root”不存在

su - postgres 替换为sudo su - postgres 无效(我认为脚本已经以root 身份运行。)

我在su - postgres 之前和之后添加了id(打印当前用户ID),并且id 在调用su 之前和之后都打印uid=0(root) gid=0(root) groups=0(root)。据我所知,su - postgres 有点被忽视了?而某个exit,稍后当我尝试切换回 root 用户时,完全退出引导脚本:-(

但是。做vagrant ssh之后,我可以sudo su - postgres就好了,然后开始psql。但不是来自配置脚本。

(一种解决方法是在我调用psql 时指定-h 127.0.0.1 --username postgres(而不是将用户切换到postgres)。并且还为VM 本地连接启用基于PostgreSQL 信任的身份验证。)

【问题讨论】:

    标签: shell vagrant


    【解决方案1】:

    我不确定你是否可以在 Vagrant shell 脚本中切换用户,因为这可能需要用户输入,当脚本在配置器中运行时你不能给它......但为什么不只使用 psql 命令指定用户?

    psql --username=postgres -c "..."
    

    【讨论】:

    • 回复:“因为这可能需要用户输入”——好吧,我没想到。因此,如果我将--command COMMAND 指定为su 选项,我最终可能会一切正常。我想这可以解释一切,问题是我不太熟悉 Bash,而不是任何与 Vagrant 相关的东西。 (?)
    • 感谢--username 的建议。 (我确实在问题的末尾提到:“一种解决方法是指定-h 127.0.0.1 --username postgres”。)
    • 是的,抱歉,我刚刚看到您也提到了用户名部分...跳得太快了,呵呵...
    【解决方案2】:

    我只是在寻找一种以非 root 身份运行 Vagrant 提供程序脚本的方法时发现了这一点,并想为观察到的行为添加一个解释,这是对读者有用的非常基本的 Unix 知识。

    在 shell 脚本中运行程序(例如 /bin/sh、sudo 或 su)不能更改它运行的上下文(工作目录、运行用户等)中的任何内容,只能为其创建的进程设置上下文(并且仅在以 root 身份运行时更改正在运行的 uid - uid 0)。这也是为什么 cd 是 shell 中的内置命令的原因。 su 是一个 setuid 程序(当您尝试命令“ls -l which su”时请注意“s”),这意味着它将以拥有程序(root)的用户身份运行,而不是以运行它的用户身份运行。

    【讨论】:

    【解决方案3】:

    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 数据库”而不是如何在 vagrant 脚本中切换用户。

    【讨论】:

    • 您在每个case 末尾缺少;;。除此之外,很棒的解决方案正是我想要的。
    • echo doing the vagrant user's tasks 行使用"!正确的语法是echo "doing the vagrant user's tasks"
    • @Doka:尽管这完全不相关,但我没有看到任何文件支持您的主张
    【解决方案4】:
    echo '===== Creating PostgreSQL databases and users'
    
    su postgres << EOF
    psql -c "
      create user SomeUserName password '...';
      alter user ...;
      "
    EOF
    

    【讨论】:

    • 很好,我测试过它有效 :-) 我添加了问题本身的链接。
    • 我收到一个错误:无法从函数或多命令字符串执行 CREATE DATABASE
    猜你喜欢
    • 1970-01-01
    • 2016-09-22
    • 1970-01-01
    • 2013-02-05
    • 1970-01-01
    • 2015-03-07
    • 1970-01-01
    • 2018-07-19
    • 2011-11-26
    相关资源
    最近更新 更多