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

如何在根子shell中执行多个bash命令?,bash,shell,terminal,root,Bash,Shell,Terminal,Root,我有一个执行一系列终端命令的shell脚本。我想做的是让这些命令在根shell中运行,因为它们需要根权限。 到目前为止: sudo -s <<EOF #all root commands #here EOF sudo cmd1 sudo cmd2 ... 我会手动键入: sudo bash 进入终端,就会出现一个根shell,我可以执行所有命令 问题: sudo -s <<EOF #all root commands #here EOF sudo cmd1 sud

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

到目前为止:

sudo -s <<EOF
#all root commands
#here
EOF
sudo cmd1
sudo cmd2
...
我会手动键入:

sudo bash
进入终端,就会出现一个根shell,我可以执行所有命令

问题:

sudo -s <<EOF
#all root commands
#here
EOF
sudo cmd1
sudo cmd2
...
当我尝试在脚本中自动执行此过程时,一旦我使用
exit
关闭根shell,就会出现根shell,但没有任何命令执行

如何解决此问题?

关于:

当我尝试在脚本中自动化此过程时,根shell 关闭根shell后,将显示,但不会执行任何命令 使用
退出
命令,然后执行

这是因为执行
sudobash
会生成一个子shell,即使该子shell具有root权限,也将无效,因为您希望执行的命令位于父shell中。因此,一旦退出此
根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"
另存为say
supercow
,do
chmod u+x supercow
并运行它

这样,只需输入
根密码
一次

编辑:

sudo -s <<EOF
#all root commands
#here
EOF
sudo cmd1
sudo cmd2
...
这可能会根据需要为您提供根子shell:

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

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

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运行整个脚本(不过最好还是将超级用户权限保持在最低限度,所以我不建议这样做):


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

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

使用:

sudo -s <<EOF
#all root commands
#here
EOF
sudo cmd1
sudo cmd2
...
与herdoc方法相比,它有一个缺点:如果任何命令在
sudo
会话过期时花费大量时间,那么下一个sudo将再次请求密码

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

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

您可以检查脚本的权限吗?要获得问题的最佳或最相关的答案,您应该添加更多详细信息,例如脚本中使用sudo的地方的摘录。这将允许任何人以root用户身份运行脚本,这是一个安全问题。@umläute:即使我们
setuid
对root用户的权限仍然会被拒绝,例如
chown
。所以我完全改变了代码,这现在是有意义的。我如何通过子shell执行命令?我不知道您为什么要在这里生成子shell。您可以像我所做的那样将命令分组到一个函数中,导出函数并将其提供给
su
命令。这里的优点是,您不必多次键入
sudo
。我明白了,这很有帮助。尽管打开根shell的是我的脚本,但如何从同一脚本将命令传递到根shell?缓存是短期的(默认情况下为5分钟),这意味着如果
cmd2
需要更长时间,则
cmd3
可能需要重新授权。干净的方法是将
sudo
配置为允许脚本运行程序在不使用密码的情况下运行某些(尽可能具体的)命令。@SyntaxErr0r为什么需要
根shell
(这到底是什么意思)?这与我的第二个建议(以root身份运行脚本)有什么不同?真是太酷了!这实际上满足了@syntaxerr0r的要求,即他需要打开并运行根shell中的命令。