【问题标题】:How to pass commands as arguments to ssh [duplicate]如何将命令作为参数传递给 ssh [重复]
【发布时间】: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.,谢谢;也将其添加到列表中。

标签: bash shell ssh quoting


【解决方案1】:

我会这样说:

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

【讨论】:

  • 第一个解决方案对我有用。坦克很多。
猜你喜欢
  • 1970-01-01
  • 2012-09-12
  • 1970-01-01
  • 1970-01-01
  • 2017-12-25
  • 1970-01-01
  • 1970-01-01
  • 2014-12-03
  • 2010-09-11
相关资源
最近更新 更多