bash:执行 su -c 中断 $@

bash:执行 su -c 中断 $@

Bash 版本:GNU bash,版本 4.1.2(1)-release (x86_64-redhat-linux-gnu)

这工作正常:

#!/bin/bash
exec /usr/local/bin/python2.7 /app/add_container_host.py $@

但我需要以特定用户身份运行它,所以我将其更改为:

#!/bin/bash
su -c '/usr/local/bin/python2.7 /app/add_container_host.py $@' $USER

并且 Python 脚本不再获取参数。

我尝试将单引号更改为双引号,这将提供$@su -c自身,而不是Python脚本。

有没有办法$@在运行时传递给 python 脚本su -c

答案1

您的问题是您使用的引号。您需要使用双引号,以便可以扩展 , 中的变量$@,否则它们将保留文字并且永远不会扩展。

这是一个例子

$ cat runme.bash
#!/bin/bash

echo "run with double quotes"
su -c "echo $@" user1

echo "run with single quotes"
su -c 'echo $@' user1

$ ./runme.bash "a b c"
run with double quotes
a b c
run with single quotes

$

您还必须将参数列表作为带引号的列表传递,否则命令su -c ...会变得混乱并开始尝试将第二个参数解析为您想要的用户su

另一个例子

$ ./runme.bash a b c
run with double quotes
su: user b does not exist
run with single quotes

$

调试技巧

如果您想查看脚本实际执行的操作,可以通过-x切换到 来运行它bash

赤裸裸的论点
$ bash -x ./runme.bash a b c
+ echo 'run with double quotes'
run with double quotes
+ su -c 'echo a' b c user1
su: user b does not exist
+ echo 'run with single quotes'
run with single quotes
+ su -c 'echo $@' user1

$
引用的论点
$ bash -x ./runme.bash "a b c"
+ echo 'run with double quotes'
run with double quotes
+ su -c 'echo a b c' user1
a b c
+ echo 'run with single quotes'
run with single quotes
+ su -c 'echo $@' user1

$

答案2

您可能会考虑将 shell 位置参数su作为参数传递给命令,而不是依赖于在参数字符串中正确扩展它们-c

例如:

#!/bin/sh

su testuser -c 'for arg; do echo "$0 ($(whoami)): $arg"; done' -- su "$@"

然后

$ ./suscript foo "bar baz"
Password: 
su (testuser): foo
su (testuser): bar baz

答案3

将命令封装在here-doc块中可能会对您有所帮助。

#!/bin/sh

su testuser -s /bin/sh <<EOF
 add_container_host.py "$@"
EOF

你也可以尝试像下面这样

su testuser -c 'add_container_host.py "$@"' -- argv0 "$@"

除了它苏执行也是一个不错的选择。

相关内容