首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用shell脚本中的ssh在远程服务器上运行sed (包括变量)

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

Stack Overflow用户
提问于 2018-10-30 05:48:58
回答 1查看 2.2K关注 0票数 0

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

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

代码语言:javascript
复制
sed -i 's/  #0\t30718/ 0\t30718/' ./config.txt

试图使用ssh在远程shell中运行此操作:

代码语言:javascript
复制
ssh root@sys_name sed -i 's/  #0\t30718/ 0\t30718/' /absolute-path/vconfig.txt

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

代码语言:javascript
复制
ssh root@sys_name 'sed -i "s/0\t${pe_list[0]}/#0\t${pe_list[0]}/g" $file_path'

或者像这样:

代码语言:javascript
复制
ssh root@sys_name "sed -i 's/0\t${pe_list[0]}/#0\t${pe_list[0]}/g' $file_path"

我要么得到sed:-e表达式#1,char 2: un终止的命令错误,要么使用与变量名匹配的不想要的输出执行sed命令。基本上,简单地说,我想使用ssh在远程shell上执行sed命令,约束是整个命令是脚本的一部分,要匹配的值和文件名是该文件中的变量。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-30 06:20:46

在本地shell中有变量集,但不是sed变量,因此您应该退出sed环境,使用单引号关闭它,放置变量,然后用单引号重新打开,然后继续使用sed

代码语言:javascript
复制
sed -e 's/Red Hat/'${z}'/' /etc/redhat-release

如果$z变量包含空格,则需要使用双引号:

代码语言:javascript
复制
sed -e 's/Red Hat/'"${z}"'/' /etc/redhat-release

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

代码语言:javascript
复制
z="BLACK HAT"    
ssh root@sys_name "sed -e 's/Red Hat/'\"${z}\"'/' /etc/redhat-release"

你会得到:

代码语言:javascript
复制
BLACK HAT Enterprise Linux Server release 6.10 (Santiago)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53058136

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档