【问题标题】:sed over ssh connection + unknown option to `s' [duplicate]通过 ssh 连接的 sed + `s' 的未知选项 [重复]
【发布时间】:2013-06-06 08:16:46
【问题描述】:

我在 bash 脚本中有一个 sed 命令,如下所示:

sed -i 's/db.url=.*/db.url='$URL'/' config.properties

并且 URL var 被分配为:

$URL=jdbc\:oracle\:thin\:@\/\/hostname\:12345\/XYZ

当我在主机上运行此 bash 脚本时,它会按预期工作,将 url 替换为 URL 中指定的 URL。但是,当我在 bash 脚本中添加命令以在我的其他主机上执行此操作时,如下所示:

ssh user@host02 <<EOF
 sed -i 's/db.url=.*/db.url='$URL'/' config.properties
exit
EOF

我收到此错误:

sed: -e expression #1, char 47: unknown option to `s'

有人知道这里发生了什么吗?

【问题讨论】:

    标签: bash ssh sed


    【解决方案1】:

    如果 sed 表达式在本地主机上运行,​​您已经正确引用了它,但是字符串随后被传递到 remote 主机上的 shell,* 现在在该主机上未引用并扩展为全局。最简单的做法是通过标准输入将命令通过管道传送到远程 shell,因此您不必担心引用:

    echo "sed -i 's/db.url=.*/db.url=$URL/' config.properties" | ssh user@host02 bash
    

    如果有多个命令,可以考虑使用here文档:

    ssh user@host02 bash <<EOF
    command1
    sed -i 's/db.url=.*/db.url=$URL/' config.properities
    command2
    EOF
    

    【讨论】:

    • 我可以在 ssh 中引用命令吗?除了这个之外,我还有很多命令被调用,显然不想管道每一个,我也不想让它成为一个独立的命令。
    • 您可能还想简单地考虑 scp 编写本地编写的脚本并通过 ssh 远程执行该脚本。试图获得正确的报价充其量是棘手的,最坏的情况是不可能的。此处的文档也可能有用。
    • 我已经使用了此处的文档,如我原来的示例中所示
    • 另外,我确实将文件 scp 到另一台主机,我使用 ssh 运行它被移动到的 bash 脚本。
    • 不同之处在于,我在远程端明确地运行了一个bash 实例。
    【解决方案2】:

    解决方案是在 $URL 周围使用双单引号 ('),如下所示:''$URL''

    【讨论】:

      猜你喜欢
      • 2013-04-28
      • 2016-03-19
      • 2014-09-02
      • 2014-12-08
      • 2013-03-08
      • 2014-04-06
      • 2020-11-25
      • 2018-04-25
      • 2014-07-09
      相关资源
      最近更新 更多