【发布时间】:2017-05-11 22:14:31
【问题描述】:
我需要使这个命令起作用:
sshpass -p XXXX ssh -oStrictHostKeyChecking=no wsuser@192.168.0.100 sudo docker exec -u postgres postgres-container /bin/bash -c \" psql -d crawl-configuration -c 'select * from schema_version'\"
但是结果表明 * 被 shell 扩展并且所有匹配的文件都作为参数传递给 psql 命令。于是就搜索了如何保护命令不被扩展,但没有成功。
我的实验给了我以下结果。
A - 以下命令有效,TOTO 显示在我的 shell 上
sshpass -p XXXX ssh -oStrictHostKeyChecking=no wsuser@192.168.0.100 sudo docker exec -u postgres postgres-container /bin/bash -c \"echo TOTO\"
B - 以下命令不起作用,我的 shell 上显示一个空行
sshpass -p XXXX ssh -oStrictHostKeyChecking=no wsuser@192.168.0.100 sudo docker exec -u postgres postgres-container /bin/bash -c "echo TOTO"
C - 这行得通,显示 ls 的结果。我不明白为什么它有效但案例 B 无效?
sshpass -p XXXX ssh -oStrictHostKeyChecking=no wsuser@192.168.0.100 sudo docker exec -u postgres postgres-container /bin/bash -c "ls"
D - 这行得通,我有预期的结果
sshpass -p XXXX ssh -oStrictHostKeyChecking=no wsuser@192.168.0.100 sudo docker exec -u postgres postgres-container /bin/bash -c \" psql -d crawl-configuration -c \'select version from schema_version\' \"
E - 在主机上执行此命令而不通过 ssh 有效
sudo docker exec -u postgres postgres-container /bin/bash -c " psql -d crawl-configuration -c 'select * from schema_version'"
使我的第一个命令起作用的解决方案是什么?
【问题讨论】:
-
在 B 中,
echo TOTO作为单个单词传递,这不太可能是有效命令。要将星号传递给远程命令,您可以尝试以下步骤: a) 星号本身应该被引用(在单引号内时); b)在它之前放置足够的(引用的)反斜杠以进一步远程引用它。 -
@CharlesDuffy 老骗子? stackoverflow.com/questions/6621777/…
-
@BenjaminW.,谢谢;也将其添加到列表中。