从Python转义要通过ssh执行的sed表达式
我在远程服务器上有一个文件,需要在其中更新一行。我试图通过python进行更新,但似乎存在角色转义问题 我尝试更新的文件中的行是:从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
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。我感谢你的帮助。以上内容解决了我所看到的问题。