从Python转义要通过ssh执行的sed表达式

从Python转义要通过ssh执行的sed表达式,python,bash,Python,Bash,我在远程服务器上有一个文件,需要在其中更新一行。我试图通过python进行更新,但似乎存在角色转义问题 我尝试更新的文件中的行是: BEGRCVDDATE=02/01/2018 00:00 am 我正在使用python脚本中的代码行尝试进行更新: 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]'/'BEGRCV

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

我尝试更新的文件中的行是:

BEGRCVDDATE=02/01/2018 00:00 am
我正在使用python脚本中的代码行尝试进行更新:

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))
上述代码引发以下错误:

sed: -e expression #1, char 37: unknown option to `s'
但是,我能够在python脚本之外运行sed命令,这使我相信这是一个角色转义问题。下面的代码在python脚本之外工作

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"
ssh“sed-is/'BEGRCVDDATE=[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正在使用而不是子进程

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])
…或者,如果您确实没有
子流程
模块,则需要进行第二轮shell转义:

ssh_cmd = ['ssh', ip, cmd_str]
ssh_cmd_str = ' '.join([pipes.quote(s) for s in ssh_cmd])
os.system(ssh_cmd_str)


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

这不是有效的python语法。请仔细检查您是否正确复制粘贴了代码?使用
子流程
模块,然后您可以将参数作为列表传递,而不用担心尝试获取引用correct@EricRenouf,…不幸的是,使用
ssh
,意味着仍有人担心需要进行引用。SSH有效地将其参数与
“$*”
连接在一起,并将它们作为单个字符串传递给远程shell。但是一层shell求值比两层要好。即使使用
子进程
,您也必须确保从
ip
等定义的字符串是正确转义的
sed
命令。@EricRenouf如前所述,由于我的环境中的python版本,子进程对我不可用。谢谢Charles。我感谢你的帮助。以上内容解决了我所看到的问题。