通过 ssh 连接的 sed + `s' 的未知选项 [重复]

Posted

技术标签:

【中文标题】通过 ssh 连接的 sed + `s\' 的未知选项 [重复]【英文标题】: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'

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

【问题讨论】:

【参考方案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''

【讨论】:

以上是关于通过 ssh 连接的 sed + `s' 的未知选项 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

不断重新连接到 websocket / 会话 ID 未知 / Etherpad

shell sed语法详解

shell常用监控脚本

如何用 sed 的变量替换单引号字符串? [复制]

使用 sed 连接 xml 标签 [重复]

我的内部连接不起作用 未知列