如何在另一个使用sudo的用户的bash子shell中执行一系列命令?

时间:2010-08-08 17:29:57

标签: linux bash unix scripting

我正在编写一个需要sudo多个命令的bash脚本。我可以这样做:

( whoami ; whoami )

但我不能这样做:

sudo ( whoami ; whoami )

我该如何解决这个问题?

6 个答案:

答案 0 :(得分:59)

sudo内运行shell: sudo bash -c 'whoami; whoami'

您可以在单引号内使用除'之外的任何字符。如果你真的想在该命令中使用单引号,请使用'\''(技术上是:结束单引号文字,文字'字符,启动单引号文字;但实际上这是一种方式在单引号文字字符串中注入单引号。)

答案 1 :(得分:52)

您可以将命令作为标准输入传递给带有here document的sudo'ed bash:

sudo bash <<"EOF"
whoami
id
EOF

这种方式不需要纠正正确的引用,特别是如果你有多个级别,例如:

sudo bash <<"EOF"
whoami
echo $USER ~
sudo -u apache bash <<"DOF"
whoami
echo $USER ~
DOF
EOF

产地:

root
root /root
apache
apache /usr/share/httpd

(请注意,你不能缩进内部终结符 - 它必须单独在它的行上。如果你想在这里的文档中使用缩进,你可以使用<<-而不是<< ,但是你必须缩进标签,而不是空格。)

答案 2 :(得分:3)

例如尝试这个,我测试了它:

sudo bash -c "cd /;ls;ls|grep o"

在此示例中,您首先将dir更改为/ root,将下一个列表根目录更改为根目录,然后仅将名称带有字母'o'的目录过滤。

但我更好的方法是编写脚本,完成你所需要的一切,并为所有复杂的动作提供exitcode。然后你可以sudo脚本而不是一组单个命令,如上面的例子。

答案 3 :(得分:2)

如果您想从编辑器中突出显示语法,而不在代码中使用引号,并且具有适当的缩进,则可以在函数中编写命令,然后使用declare命令将其发送到bash:< / p>

function run_as_root() {
    whoami
    id
    echo $USER
}

sudo bash -c "$(declare -f run_as_root); run_as_root"

答案 4 :(得分:-2)

Brackets意味着在新的bash中执行命令。它以分号的间隔执行命令。只需使用下面的代码。

(sudo whoami;sudo whoami)

BYW:使用'()'时不需要空格。

答案 5 :(得分:-3)

sudo第一次只询问你的passwd。默认情况下,passwd有效约5分钟。你可以将这个值更改为this告诉。所以只需要担心你的passwd提示脚本,然后您可以使用 sudo 。 更改默认值:user_name timestamp_timeout的值为-1可能是系统上的安全漏洞。