如何以sudo

时间:2015-11-12 23:49:26

标签: linux bash

我正在尝试启动一个需要很多开关才能运行的应用程序,所以我使用\运算符对它们进行多行排列。现在我需要运行此应用程序以及一些导出作为另一个用户运行。

我目前正在尝试做的是

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

我会运行sudo myscript.sh,以便root可以在删除运行主应用程序的权限之前设置一些内容。问题是多行开关并未全部传递给应用程序,从而导致意外结果。

有没有什么方法可以让这项工作变得干净,或者我将所有开关附加到一行以使其工作?

3 个答案:

答案 0 :(得分:2)

自包含的示例是查看错误和原因的好方法。

这是一个自包含的示例,演示了您对多行参数的使用很好:

JSON.stringify

这是另一个自包含的示例,它表明您使用touch myfile.txt bash << eof find . \ -name '*.txt' \ -type f eof 是错误的:

"$@"

预期结果为touch foo bar set -- foo bar bash << eof ls "$@" eof (因为ls列出了两个文件),但实际结果为bar foo(因为ls会尝试列出一个)。

这是因为ls: cannot access foo bar: No such file or directory在传递给bash之前已经展开,因此,$@代替了"$@"的魔术引用行为,只需将$@替换为文字之间的变量串联双引号。

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

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

答案 1 :(得分:0)

我认为这是答案:how to run two commands in sudo?

一般来说:

sudo -s - &#39; whoami; WHOAMI&#39;

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

答案 2 :(得分:0)

您可以在文件中编写命令,并使用sudo将其作为脚本执行。该脚本不需要包含多行转义&#34; \&#34; - 如果需要,您可以在一行中编写整个命令。

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

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