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

标签 linux shell ssh sed remote-server

我遇到了这样的情况,我试图在 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: untermerated `s' command 错误,要么 sed 命令执行时产生与变量名称匹配的不需要的输出。基本上,简而言之,我想使用 ssh 在远程 shell 上执行 sed 命令,限制是整个命令是脚本的一部分,要匹配的值和文件名是该文件中的变量。

最佳答案

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

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)

关于linux - 如何在 shell 脚本中使用 ssh 在远程服务器上运行 sed(包括变量),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53058136/

相关文章:

linux - 如何找到程序的系统调用位置?

linux - 自动重命名文件至今 (YY-MM-DD)

linux - UUID真的是唯一的吗?为什么我们可以将多个 UUID 分配给单个磁盘片

linux - Bash:通过忽略空格的定界符拆分字符串

bash - 在 shell 中生成带有一个特殊字符的随 secret 码

oracle - 无法连接到我的 Oracle 虚拟云实例

php - 使用 php 脚本中的 rsync 同步本地和远程文件夹,无需输入密码

linux - docker-compose.yml 在以点 (.) 开头的文档上使用卷

shell - 比较 Busybox ash 中的子字符串

python - 在 Paramiko 中运行交互式命令