如何将命令作为参数传递给ssh

时间:2017-05-11 22:14:32

标签: bash shell ssh quoting

我需要让这个命令工作:

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'"

让我的第一个命令工作的解决方案是什么?

1 个答案:

答案 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禁用伪终端的分配。