如何在 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)
我这里有一个情况,我正在尝试 运行 我的 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)