计算引擎启动脚本无法作为非root用户执行

时间:2017-05-10 18:38:30

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

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

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

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

ls -l result

意思是我的

su drupal

没用。 sudo su drupal也没有任何区别。我正在使用Google容器操作系统,但在Debian 8映像上也是如此。

2 个答案:

答案 0 :(得分:5)

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”

答案 1 :(得分:0)

我在下面写了一些东西 - 但看起来这应该有效: 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:     touch test2.txt

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