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



我遇到了一种情况,我试图在shell脚本中的远程shell上运行sed命令,并使用动态变量,结果一次又一次地出现相同的错误。

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

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

尝试使用ssh:在远程shell中运行此程序

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

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

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

或者像这样:

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

我要么得到sed:-e表达式#1,char 2:unterminated‘s’命令错误,要么sed命令执行时不需要的输出与变量名匹配。基本上,简而言之,我想使用ssh在远程shell上执行sed命令,约束条件是整个命令是脚本的一部分,要匹配的值和文件名是该文件中的变量。

您在本地shell中设置了变量,但is不是sed变量,因此您应该退出ed环境,用单引号关闭它,放入您的变量,然后用单引号再次打开并继续se内容:

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)

最新更新