【发布时间】:2015-02-14 10:44:13
【问题描述】:
我正在开发一些 python 工具来配置远程系统。 一个配置步骤需要替换文本文件中的值。 我想做一个简单的
ssh whatever@where.ever sed -i -e s/property=\"true\"/property=\"false\"/g the.remote.file
但是,它不起作用。
我尝试了 shlex + 子进程,我尝试了 pxssh(无论如何我都想避免,因为与通过子进程的 ssh 调用相比,它要慢得多)。似乎无论我尝试什么,围绕真/假的引号都会在某种程度上被删除。但是引号在远程系统上的那个文件中;因此,如果在远程系统上执行的调用中没有显示引号,sed 将不执行任何操作。
当直接从我的 bash 调用 ssh 时,我可以让它工作;但从python内部......没有机会。最后,我将该字符串放入文件中;使用 scp 将该文件复制到远程系统;然后我再次使用 ssh 从那里运行它。
但仍然想知道 - 是否有一种干净、直接的方法可以“仅使用 python”来做到这一点?
(注意:我正在寻找开箱即用的解决方案;而不是需要我的用户安装其他“第三方”模块,如 paramiko。)
更新:
这……太疯狂了。我刚刚运行了这段代码(我认为它看起来与答案中给出的代码一模一样——我后来添加了 .format() 以便从发布的文本中轻松隐藏用户名/ip):
cmd_str= 'ssh {} "cat ~/prop"'.format(target)
subprocess.call(cmd_str, shell=True)
cmd_str= 'ssh {} "sed -i -e s/property=\"true\"/property=\"false\"/g ~/prop"'.format(target)
subprocess.call(cmd_str, shell=True)
cmd_str= 'ssh {} "cat ~/prop"'.format(target)
subprocess.call(cmd_str, shell=True)`
我得到:
property="true"
property="true"
这可能取决于远程系统上 sshd 的配置吗?
【问题讨论】:
-
你试过
sed -i -e 's/property="true"/property="false"/g' the.remote.file吗?顺便说一句,sed的大多数版本都允许您为-i选项提供扩展参数,它告诉sed备份原始文件,例如。sed -i~ 's/this/that/g' filename会修改filename并保存原来的filename~ -
我尝试了各种方法;实际上我从 sed 表达式周围的 ' 开始。但似乎这些外部单引号、双引号、任何引号……都被吃掉了;要么通过 shlex;或通过子流程。并且不需要保留备份;以及......我知道我在做什么;-)(我们基本上是在谈论在我们的自动化测试开始之前一次性配置的测试系统)