[英]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.