【问题标题】:How to execute multiple bash commands in a root sub shell?如何在根子 shell 中执行多个 bash 命令?
【发布时间】:2015-12-23 09:15:02
【问题描述】:

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

到目前为止:

我会手动输入:

sudo bash

进入终端,会出现一个 root shell,我可以执行我的所有命令。

问题:

当我尝试在我的脚本中自动执行此过程时,会出现 root shell,但我的任何命令都不会执行,一旦我使用 exit 关闭 root shell,命令就会执行。

我该如何解决这个问题?

【问题讨论】:

  • 你能检查你的脚本的权限吗?
  • 要获得对您问题的最佳或最相关的答案,您应该添加更多详细信息,例如使用 sudo 的脚本摘录。

标签: bash shell terminal root


【解决方案1】:

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
 $

【讨论】:

  • 我明白了,这很有帮助。虽然如果它是我打开根 shell 的脚本,我将如何从同一个脚本将命令传递到根 shell?
  • 缓存是短暂的(默认为 5 分钟),这意味着如果 cmd2 需要更长的时间,cmd3 可能需要重新授权。干净的方法是配置sudo 以允许脚本运行器在没有密码的情况下运行某些(尽可能具体)命令。
  • @SyntaxErr0r 你为什么要root shell(你到底是什么意思)?这与我的第二个建议有什么不同(以 root 身份运行脚本?)
【解决方案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

【讨论】:

  • 确实很酷!这实际上满足了@syntaxerr0r 的要求,即他需要在root shell 中打开运行命令。
【解决方案3】:

关于:

当我尝试在我的脚本中自动执行此过程时,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 命令中提供脚本的完整路径。

【讨论】:

  • 这将允许 anybody 以 root 身份运行脚本,这是一个安全问题。
  • @umläute :即使我们setuid 获得root 权限,对于chown 之类的命令仍然会被拒绝。于是我彻底改了代码,
  • 现在说得通了。我将如何通过子 shell 执行命令?
  • 我不确定你为什么要在这里生成一个子shell。您可以像我一样将命令分组到一个函数中,导出该函数并将其提供给su 命令。
  • 这里的好处是,您不必多次输入sudo
【解决方案4】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-11
    • 2015-05-02
    • 1970-01-01
    • 1970-01-01
    • 2017-11-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多