我正在编写一个需要sudo多个命令的bash脚本。我可以这样做:
( whoami ; whoami )
但我不能这样做:
sudo ( whoami ; whoami )
我该如何解决这个问题?
答案 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可能是系统上的安全漏洞。