8

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

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

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

ls -l 结果

意思是我的

su drupal

不工作。sudo su drupal 也没有任何区别。我正在使用 Google Container OS,但在 Debian 8 映像上也会发生同样的情况。

4

2 回答 2

11

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

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

sudo su命令将启动一个新的 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”

于 2017-05-10T19:02:11.393 回答
0

我在下面写了一些东西-但看起来应该可以: 如何以另一个用户身份运行脚本而无需密码

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

当我测试类似的脚本时:

su [my username]
touch test.txt

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

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

su me
touch test.txt
./test2.sh

test2.sh:触摸 test2.txt

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

于 2017-05-10T18:52:06.783 回答