2跳ssh运行远程sed命令(转义sed命令)

时间:2013-08-13 23:34:04

标签: shell ssh sed

我通常不会尝试多次ssh跳,但由于限制,这是我唯一的选择。

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

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

在混合中添加第二个ssh hop,我认为shell正在剥离某些内容并导致this命令永远不会在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"

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

非常感谢任何帮助

2 个答案:

答案 0 :(得分: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"

答案 1 :(得分: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 \""

请注意我是否需要在第二跳上再封一个字符串,我可以使用单引号而不用任何特殊字符的转义(但是从你的例子来看,我认为你甚至不需要它)。