首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >转义sed表达式以从Python通过ssh执行

转义sed表达式以从Python通过ssh执行
EN

Stack Overflow用户
提问于 2018-03-08 20:57:52
回答 1查看 388关注 0票数 0

我在远程服务器上有一个文件,需要在其中更新一行。我试图通过python进行更新,但似乎存在字符转义问题。

我要更新的文件中的行是:

代码语言:javascript
复制
BEGRCVDDATE=02/01/2018 00:00 am

我用来尝试更新的python脚本中的代码行:

代码语言:javascript
复制
os.popen('ssh %s sed -i s/'BEGRCVDDATE=[0-9][0-9]\/[0-9][0-9]\/[0-9][0-9][0-9][0-9] [0-9][0-9]:[0-9][0-9] [a-z][a-z]'/'BEGRCVDDATE=%s'/ %s' % (ip, rcvdate, file_path))

上面的代码引发了以下错误:

代码语言:javascript
复制
sed: -e expression #1, char 37: unknown option to `s'

然而,我能够在python脚本之外运行sed命令,这使我相信这是一个字符转义问题。下面在python脚本之外工作。

代码语言:javascript
复制
ssh <ip> "sed -i s/'BEGRCVDDATE=[0-9][0-9]\/[0-9][0-9]\/[0-9][0-9][0-9][0-9] [0-9][0-9]:[0-9][0-9] [a-z][a-z]'/'BEGRCVDDATE=BEGRCVDDATE=03\\/08\\/2018 00:00 pm'/ /tmp/test.txt"

我尝试了各种组合的引号和反斜杠,试图绕过我看到的问题,但没有成功。

如果有人能帮我解决这个问题,我会非常感激的。

注意:由于我的环境中的python版本,os.popen正在使用而不是子进程。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-08 21:11:13

代码语言:javascript
复制
import subprocess, pipes

# Generate your list of arguments *as a list of Python strings*
rcvdate = '02/01/2018 00:00 am'
cmd=['sed', '-i',
     's@BEGRCVDDATE=[0-9][0-9]/[0-9][0-9]/[0-9][0-9][0-9][0-9] [0-9][0-9]:[0-9][0-9] [a-z][a-z]@BEGRCVDDATE=%s@' % (rcvdate,),
     file_path,
]

# Ask Python itself to correctly form a shell command from that list
cmd_str = ' '.join([pipes.quote(s) for s in cmd])

# Pass that shell command as an argument to `ssh`.
subprocess.call(['ssh', ip, cmd_str])

...or,如果您真的没有subprocess模块,那么需要进行第二轮外壳转义:

代码语言:javascript
复制
ssh_cmd = ['ssh', ip, cmd_str]
ssh_cmd_str = ' '.join([pipes.quote(s) for s in ssh_cmd])
os.system(ssh_cmd_str)

请注意,我将您的sed表达式更改为使用@而不是/作为信号。这意味着不再需要文字反斜杠。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49182304

复制
相关文章

相似问题

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