繁体   English   中英

如何以sudo方式运行多行bash命令

[英]How to run multiline bash commands as sudo

我试图启动一个需要很多开关才能运行的应用程序,所以我使用\\运算符对其进行了多行处理。 现在,我需要运行此应用程序以及一些导出才能以另一个用户的身份运行。

我目前正在尝试做的是

sudo -u user bash <<EOF
export AUDIO_DRV=alsa
export ...
exec application --switch1 \
    --switch2 \
    --switch3 \
    --switch4 \
    ... \
    "$@"
EOF

我将运行sudo myscript.sh以便root可以在放弃运行主应用程序的特权之前进行一些设置。 问题在于多线开关并未全部传递给应用程序,从而导致意外结果。

有什么方法可以使这项工作像以前一样整洁,还是我为了将其全部添加到一行上而坚持使用?

独立的示例是查看出现问题和原因的好方法。

这是一个独立的示例,演示您对多行参数的使用很好:

touch myfile.txt
bash << eof
find . \
  -name '*.txt' \
  -type f
eof

这是另一个独立的示例,说明您对"$@"是错误的:

touch foo bar
set -- foo bar
bash << eof
  ls "$@"
eof

预期结果是bar foo (因为ls列出了两个文件),但是实际结果是ls: cannot access foo bar: No such file or directory (因为ls尝试列出了一个)。

这是因为$@在传递给bash之前已被扩展,因此,您不必将$@替换为文字双引号之间的变量串联,而不必使用"$@"的神奇引用行为。

您应该改为将参数传递给bash并让bash扩展它们:

touch foo bar
set -- foo bar
bash -s -- "$@" << eof
  ls "\$@"
eof

我认为这就是答案: 如何在sudo中运行两个命令?

一般而言:

sudo -s-'whoami; 我是谁'

 sudo -u user -s -- ' \
    whoami; \
    whoami; \
    "$@"
'

您可以将命令写到文件中,然后使用sudo作为脚本执行它们。 该脚本不需要包含多行转义符“ \\” -如果需要,您可以只在一行中编写整个命令。

另外,您可以构建一个函数并使用sudo执行该函数。

MyFuncion(){
    application --switch1 --switch2 --switch3 --switch4 "$@"
    cmd 2
    # etc
}
sudo MyFunction

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM