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 "$@"
除了它苏执行也是一个不错的选择。