尝试进行叠瓦式逃生,但这显然不起作用。
我的空格参数为customer
,其值为NAME WITH SPACE
。
chroot /sites/FOLDER1 /bin/su FOLDER2 -c "/data/batch/myScript.sh -v -g -action params -customer NAME WITH SPACE"
我得到了:
错误:未知参数WITH
我在主题上阅读了几个主题,但无法找到解决方案: https://superuser.com/questions/360966/how-do-i-use-a-bash-variable-string-containing-quotes-in-a-command http://mywiki.wooledge.org/BashFAQ/050
尝试使用单引号和双引号,将param存储在变量等中但没有骰子。
如果我使用
chroot /sites/FOLDER1 /bin/su FOLDER2 -c '/data/batch/myScript.sh -v -g -action params -customer 'NAME WITH SPACE''
它工作得好一点,因为我没有得到未知参数,但它只将NAME作为参数并忽略空格后的内容
答案 0 :(得分:3)
su -c "script-text"
启动一个单独的shell解释器,它将script-text
解析为代码。因此,该文本需要以eval
安全的方式进行转义。 printf '%q'
为bash执行此操作(如果您的/bin/sh
是bash的符号链接,则会完全健壮。)
那是:
printf -v cmd '%q ' /data/batch/myScript.sh -v -g -action params -customer "NAME WITH SPACE"
chroot /sites/FOLDER1 /bin/su FOLDER2 -c "$cmd"
如果bash提供的/bin/sh
不,那么您应该考虑生成纯POSIX兼容输出的替代实现,例如Python pipes.quote()
库提供的输出功能:
pyquote() {
python -c 'import pipes, sys; print " ".join(pipes.quote(a) for a in sys.argv[1:])' "$@"
}
cmd=$(pyquote /data/batch/myScript.sh -v -g -action params -customer "NAME WITH SPACE")
chroot /sites/FOLDER1 /bin/su FOLDER2 -c "$cmd"