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

qre*_*est 38 unix linux bash scripting

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

( whoami ; whoami )
Run Code Online (Sandbox Code Playgroud)

但我不能这样做:

sudo ( whoami ; whoami )
Run Code Online (Sandbox Code Playgroud)

我该如何解决这个问题?

Gil*_*il' 59

在里面运行一个shell sudo: sudo bash -c 'whoami; whoami'

您可以'在单引号内使用除自身之外的任何字符.如果你真的想在该命令中使用单引号,请使用'\''(技术上是:end single-quote literal,literal 'character,start single-quoted literal;但实际上这是一种在单引号中注入单引号的方法文字字符串).

  • 正确引用是一个婊子. (4认同)

Max*_*kin 55

您可以使用here文档将命令作为标准输入传递给sudo'ed bash :

sudo bash <<"EOF"
whoami
id
EOF
Run Code Online (Sandbox Code Playgroud)

这样就没有必要摆弄正确的引用,特别是如果你有多个级别,例如:

sudo bash <<"EOF"
whoami
echo $USER ~
sudo -u apache bash <<"DOF"
whoami
echo $USER ~
DOF
EOF
Run Code Online (Sandbox Code Playgroud)

生产:

root
root /root
apache
apache /usr/share/httpd
Run Code Online (Sandbox Code Playgroud)

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


小智 8

如果您想从编辑器中获得语法突出显示,而不是在代码周围使用引号,并有适当的缩进,您可以在函数中编写命令并使用以下命令将其发送到 bash declare

function run_as_root() {
    whoami
    id
    echo $USER
}

sudo bash -c "$(declare -f run_as_root); run_as_root"
Run Code Online (Sandbox Code Playgroud)