如何在 shell 脚本中使用 ssh 在远程服务器上 运行 sed(包括变量)

How to run sed on remote server using ssh inside a shell script(variables included)

我这里有一个情况,我正在尝试 运行 我的 shell 脚本中的远程 shell 上的 sed 命令,并使用动态变量并最终得到同样的错误一次又一次。

这是 sed 命令,运行在本地 shell 上运行良好,没有任何错误。我在彻底测试后使用了这个正则表达式,相信我,它没有问题。

sed -i 's/  #0\t30718/ 0\t30718/' ./config.txt

正在尝试 运行 使用 ssh 在远程 shell 中执行此操作:

ssh root@sys_name sed -i 's/  #0\t30718/ 0\t30718/' /absolute-path/vconfig.txt

当我尝试 运行 使用变量的命令时。 (30718和文件路径为变量):

ssh root@sys_name 'sed -i "s/0\t${pe_list[0]}/#0\t${pe_list[0]}/g" $file_path'

或者像这样:

ssh root@sys_name "sed -i 's/0\t${pe_list[0]}/#0\t${pe_list[0]}/g' $file_path"

我要么得到 sed: -e expression #1, char 2: unterminated `s' command 错误,要么 sed 命令执行时出现与变量名称匹配的不需要的输出.基本上,简而言之,我想使用 ssh 在远程 shell 上执行 sed 命令,约束是整个命令是脚本的一部分,要匹配的值和文件名是变量那个文件。

您在本地 shell 中设置了变量,但不是 sed 变量,因此您应该退出 sed通过用单引号关闭环境,放置变量,然后用单引号再次打开并继续 sed stuff:

sed -e 's/Red Hat/'${z}'/' /etc/redhat-release

如果你的 $z 变量包含空格,你需要用双引号括起来:

sed -e 's/Red Hat/'"${z}"'/' /etc/redhat-release

最后,当您通过 ssh 发送命令时,您还在整个命令周围添加了双引号,因此应该转义该命令中使用的所有双引号,否则它们之间的所有内容都将在您的源主机上进行本地评估。所以这样做:

z="BLACK HAT"    
ssh root@sys_name "sed -e 's/Red Hat/'\"${z}\"'/' /etc/redhat-release"

您将获得:

BLACK HAT Enterprise Linux Server release 6.10 (Santiago)