我有一个执行一系列终端命令的shell脚本。我想要做的是让这些命令通过root shell运行,因为它们需要root权限。
到目前为止:
手动我会输入:
sudo bash
进入终端并出现root shell,我可以执行所有命令。
问题:
当我尝试在我的脚本中自动执行此过程时,会出现root shell但我的命令都没有执行,一旦我用exit
关闭root shell,然后执行命令。
如何解决此问题?
答案 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
作为第一个命令。运行脚本时,它会询问您的密码,然后根据需要完成。