通过 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' 的未知选项 [重复]的主要内容,如果未能解决你的问题,请参考以下文章