计算引擎启动脚本无法以非根用户身份执行

compute engine startup script can't execute as a non-root user

将我的问题归结为最简单的情况,我将 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 容器 OS,但在 Debian 8 映像上也会发生同样的情况。

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

另一种选择是以其他用户身份通过​​ ssh 连接到您自己的计算机,您可以使用 sshpass 发送密码,或者获取您自己的 public 密钥。

当我测试类似的脚本时:

su [my username]
touch test.txt

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

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

su me
touch test.txt
./test2.sh

test2.sh: 触摸 test2.txt

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

sudo su 不是 shell 中的命令 运行 -- 它会启动一个新的 shell.

新的 shell 不再 运行ning 您的脚本,旧的 shell 即 运行ning 脚本等待新脚本退出它继续。

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

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'