将我的问题归结为最简单的情况,我使用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容器操作系统,但在Debian 8映像上也是如此。
答案 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,即使我拥有这两个脚本。 这是因为你所做的一切都是你的,你不能为别人做点什么。