0

我通常不会在多个 ssh 跃点上尝试此操作,但由于限制,这是我唯一的选择。

我正在尝试运行以下远程命令,它可以像这样正常工作:

ssh -i ~/.ssh/host-rsync-key user\@server1 "'sed -i /ADD_NEW_BELOW/a <server>domain</server>' /config.xml"

添加第二个 ssh 跃点,我认为 shell 正在剥离一些东西,导致这个命令永远不会在 server2 上执行,而是似乎在 server1 上执行。

ssh -A -t -o -i ~/.ssh/host-rsync-key user\@server1 ssh -A -o -i ~/.ssh/host-rsync-key user2\@server2 "'sed -i /ADD_NEW_BELOW/a <server>domain</server>' /config.xml"

任何人都可以提供有关此 sed 命令通过 ssh 所需的正确转义的帮助吗?我可以在 2 跳上运行 grep 命令没问题,所以我认为这是特定于与 sed 命令相关的转义字符。

任何帮助将不胜感激

4

2 回答 2

0

看起来你可能有你的报价错误。

这可能有效:

ssh -A -t -o -i ~/.ssh/host-rsync-key user\@server1 "ssh -A -o -i ~/.ssh/host-rsync-key user2\@server2 sed -i '/ADD_NEW_BELOW/a <server>domain</server>' /config.xml"

于 2013-08-13T23:41:56.463 回答
0

我遇到了类似的问题并进行了更多挖掘,因为我不想逃避字符串中的每个空格。一种调试方法是尝试回显一个字符串并将其写入文件,然后查看该字符串在远程主机上的样子。我最终得到的解决方案是在整个过程中使用双引号,并将它们转义,即:

ssh -A -t -o -i ~/.ssh/host-rsync-key user@server1 "ssh -A -o -i ~/.ssh/host-rsync-key user2@server2 \"sed -i /ADD_NEW_BELOW/a <server>domain</server>\" /config.xml"

我需要一个类似的解决方案,它绝对有效,可以在 2 个跃点上触发 mysql 命令行查询:

ssh -C user@firsthop "ssh -C user@secondhop \"echo 'SELECT field FROM database.table WHERE term=condition' | mysql -u mysqluser --password=mysqlpassword -B \""

请注意,我需要在第二跳中再包含一个字符串,我可以使用单引号来完成,而无需任何特殊字符的转义(但从您的示例来看,我认为您甚至不需要它)。

于 2013-12-06T07:56:08.720 回答