如何在根子 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
我有一个 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