【问题标题】:2 hop ssh running remote sed command( escaping of sed command)2 跳 ssh 运行远程 sed 命令(转义 sed 命令)
【发布时间】:2013-08-13 23:34:03
【问题描述】:

我通常不会在多个 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 命令相关的转义字符。

任何帮助将不胜感激

【问题讨论】:

标签: shell ssh sed


【解决方案1】:

看来您的引号可能有误。

这可能有效:

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 -A -t -o TCPKeepAlive=yes -o ServerAliveInterval=50 -i ~/.ssh/host-rsync-key user1\@server1 ssh -A -o TCPKeepAlive=yes -o ServerAliveInterval=50 -i ~/ .ssh/host-rsync-key user2\@server2 "sed -i '/ADD_NEW_BELOW/a\\\ \\\$domain\\\' 配置.xml"
【解决方案2】:

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

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-04-05
    • 1970-01-01
    • 2017-01-24
    • 2013-07-08
    • 1970-01-01
    • 1970-01-01
    • 2017-04-03
    • 2018-03-03
    • 2018-03-21
    相关资源
    最近更新 更多