【问题标题】:compute engine startup script can't execute as a non-root user计算引擎启动脚本无法以非 root 用户身份执行
【发布时间】:2024-04-19 11:05:01
【问题描述】:

将我的问题归结为最简单的情况,我将 Compute Engine 与以下启动脚本一起使用:

#! /bin/bash
sudo useradd -m drupal
su drupal
cd /home/drupal
touch test.txt

我可以在这个命令之后确认drupal用户存在,测试文件也是如此。但是我希望测试文件的所有者是'drupal'(因此是su)。但是,当我将其用作启动脚本时,我仍然可以确认 ROOT 是文件的所有者:

意思是我的

su drupal

没用。 sudo su drupal 也没有任何区别。我使用的是 Google Container OS,但在 Debian 8 映像上也是如此。

【问题讨论】:

    标签: google-cloud-platform google-compute-engine google-container-os containeros


    【解决方案1】:

    sudo su 不是在 shell 中运行的命令——它会启动一个新的 shell。

    新的 shell 不再运行您的脚本,而运行脚本的旧 shell 会等待新的 shell 退出后再继续。

    sudo su 命令将启动一个新的 shell。旧 shell 等待旧 shell 退出并继续执行其余代码。 您的脚本在“旧”shell 中运行,这意味着这些命令:

    cd /home/drupal
    touch test.txt
    

    仍然以 root 身份执行,因此这些文件的所有者也是 root。

    您可以将脚本修改为:

    #! /bin/bash
    sudo useradd -m drupal
    sudo -u drupal bash -c 'cd ~/; touch text2.txt'
    

    它应该可以工作。 -u 标志按照用户指定的方式执行命令,在本例中为“drupal”

    【讨论】:

      【解决方案2】:

      我在下面写了一些东西 - 但看起来应该可以: how to run script as another user without password

      另一种选择是以其他用户身份 ssh 进入您自己的计算机,您可以使用 sshpass 发送密码,或获取您自己的公钥。

      当我测试一个类似的脚本时:

      su [my username]
      touch test.txt
      

      它实际上以我的身份登录,直到我 ctrl-d 才完成

      进一步的测试表明,拥有该文件的唯一方法是我从 shell 调用脚本,即:

      su me
      touch test.txt
      ./test2.sh
      

      test2.sh: 触摸test2.txt

      将这两个文件都提供给 root,即使我拥有这两个脚本。 这意味着你所做的一切都是你的,你不能为别人做点什么。

      【讨论】:

        最近更新 更多