如何在根子 shell 中执行多个 bash 命令?

How to execute multiple bash commands in a root sub shell?

我有一个 shell 脚本可以执行一系列终端命令。我想做的是通过 root shell 使用这些命令 运行,因为它们需要 root 权限。

到目前为止:

手动输入:

sudo bash

进入终端,然后会出现根 shell,我可以执行所有命令。

问题:

当我尝试在我的脚本中自动执行此过程时,根 shell 出现,但我的命令 none 执行,一旦我用 [=13= 关闭根 shell ] 然后执行命令。

我该如何解决这个问题?

关于 :

When I try to automate this process in my script, the root shell appears but none of my commands execute, once I close the root shell with exit the commands then execute.

这是因为执行 sudo bash 会生成一个子 shell,即使它具有 root 权限也是无用的,因为您希望执行的命令在父 shell 中.所以一旦你退出这个 root shell 你的后续命令 运行 在正常 shell 中具有正常权限。

你可以这样做:

#!/bin/bash
function do_on_demand()
{
#The commands that you wish to execute as root goes here.
}
export -f do_on_demand
su root -c "do_on_demand"

保存为 supercow,执行 chmod u+x supercow 和 运行。

这样做,您可以 运行 以 root 身份输入一组命令 root password一次。

编辑:

这可能会给你根子 shell 如你所愿:

su - -c "bash -c 'command1;command2'"

但是这个问题是这里不能使用父环境,所以要注意在 bash 命令中提供脚本的完整路径。

sudo 可以 运行 任何命令作为 root,而不仅仅是 bash。 实际上,建议使用 运行 您需要的命令,而不是打开具有根访问权限的通用 shell。

所以通常,您会在脚本中找到类似于以下内容的内容,仅将超级用户权限授予需要它们的命令:

 $ cat myscript
 # cmd1 doesn't require supercow powers
 cmd1
 # but cmd2 and cmd3 do
 sudo cmd2
 sudo cmd3
 # cmd4 doesn't require supercow either
 cmd4
 $ ./myscript
 $

好的部分是,sudo 将为您缓存授权:因此,如果您 只需 正确输入 cmd2[ 的密码=27=],它不会再询问您 cmd3.

最后,如果这太乏味了,您还可以通过 sudo 运行 整个脚本(尽管最好还是将超级用户权限保持在最低限度,所以我不会完全 推荐这个:

 $ cat myscript
 cmd1
 cmd2
 cmd3
 cmd4
 $ sudo ./myscript
 $

在我的脚本中,我只需在任何需要更高权限的命令前键入 sudo。您可以将 sudo su 作为脚本中的第一个命令。当您 运行 脚本时,它会询问您的密码,然后根据需要完成。

自定义脚本可以通过多种方式使用超级用户执行所有命令:

使用heredoc:

sudo -s <<EOF
#all root commands
#here
EOF

在每个命令中使用sudo

sudo cmd1
sudo cmd2
...

与 heredoc 方法相比,它有一个缺点:如果任何命令花费很长时间 sudo 会话过期,那么下一个 sudo 将再次要求输入密码。

运行使用 sudo 运行脚本将 运行 所有命令都具有超级用户权限。

sudo /path/to/myscript
#all commands inside myscript gets sudo privilege