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

时间:2015-12-23 09:15:02

标签: bash shell terminal root

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

到目前为止:

手动我会输入:

sudo bash

进入终端并出现root shell,我可以执行所有命令。

问题:

当我尝试在我的脚本中自动执行此过程时,会出现root shell但我的命令都没有执行,一旦我用exit关闭root shell,然后执行命令。

如何解决此问题?

4 个答案:

答案 0 :(得分:4)

sudo可以作为 root 运行任何命令,而不仅仅是bash。 实际上,建议使用的是运行所需的命令,而不是打开具有root访问权限的通用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 正确输入了密码,那么它就赢了再次问你 cmd3

最后,如果这很繁琐,你也可以通过sudo运行整个脚本(尽管再次最好将超级用户权限保持在最低限度,所以我不会推荐这个) :

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

答案 1 :(得分:2)

自定义脚本有多种方法可以与超级用户一起执行所有命令:

使用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

答案 2 :(得分:1)

关于:

  

当我尝试在我的脚本中自动执行此过程时,root shell   一旦我关闭root shell,就会出现但我的命令都没有执行   然后执行命令exit

这是因为执行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一次。

修改

这可以根据需要为您提供根子壳:

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

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

答案 3 :(得分:0)

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