![更改用户后继续执行脚本](https://linux22.com/image/119074/%E6%9B%B4%E6%94%B9%E7%94%A8%E6%88%B7%E5%90%8E%E7%BB%A7%E7%BB%AD%E6%89%A7%E8%A1%8C%E8%84%9A%E6%9C%AC.png)
我想在更改用户后继续执行脚本,脚本将如下所示
echo "xauth add" `xauth 列表 | grep ${DISPLAY:10:2}` >> test.sh
须藤苏
./test.sh
脚本 test.sh 应该在更改用户后运行,但在“sudo su”之后,命令 ./test.sh 将不会运行。我们能让这成为可能吗
答案1
您无法在脚本中间更改用户身份,然后以新用户身份继续运行脚本。
但是,您可以使用以下命令以其他用户身份执行另一个命令或脚本sudo
:
sudo ./test.sh
如果需要以另一用户身份运行多个命令,则将这些命令添加到脚本中test.sh
,或者,如果只需要运行一两个以上的命令,请使用
sudo sh -c './test.sh; other_command'
sudo
一旦sudo
正在执行的任何内容终止,控制权就会交还给父脚本(调用的脚本)。
答案2
您可以更改用户中间脚本,但这需要将输入提供给外壳,并且可能无法移植到旧的和可怕的风格),sh
并且可能是一个坏主意:
$ cat changemidscript
who am i
sudo -i
who am i
$ bash < changemidscript
jhqdoe tty?? Oct 5 14:21
root tty?? Oct 5 14:21
$
然而!bash changemidscript
或者./changemidscript
两者的行为都不会与上面相同,这再次表明这是一个坏主意,因为只有通过标准输入提供输入将允许用户更改,然后后续命令将作为新命令用户。 (我有没有提到你可能想使用不同的方式?你应该!)
strace
可能有助于说明此方法为何有效; shell 可能会费尽心思逐行读取输入,因此要么以一个字符增量读取(这样它们可以在\n
找到 a 时停止读取),要么读入缓冲区,然后将文件句柄返回到下一个字符的开头每行的行,具体取决于\n
找到的位置。
答案3
编辑:实际上,您想要执行以下任一操作sudo su -l -c ./test.sh
(如果您需要登录 shell)或sudo ./test.sh
.
查看su
和的手册页sudo
。