我需要让这个命令工作:
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'"
让我的第一个命令工作的解决方案是什么?
答案 0 :(得分:2)
我会这样说:
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'\""
双引号由ssh执行的整个命令,然后在命令中转义双引号。
或者,使用here-doc:
sshpass -p XXXX ssh -T -oStrictHostKeyChecking=no wsuser@192.168.0.100 <<-'EOF'
sudo docker exec -u postgres postgres-container \
/bin/bash -c "psql -d crawl-configuration -c 'select * from schema_version'"
EOF
由于引用的'EOF'
分隔符,不需要引用。 -T
禁用伪终端的分配。