在python脚本中perl one liner

Bio*_*Rod 3 python perl

我有一个perl one衬里,在特定行的末尾添加一个字符串,当我在主机上运行一个衬里时它就可以工作.例如,我想在'AllowUsers'开头的行末尾附加'boy857sr xxxxxxx'

perl -pi.bak -e 's/^(AllowUsers.*)/\1 boy857sr xxxxxxx/g;' /etc/ssh/sshd_config
Run Code Online (Sandbox Code Playgroud)

完美的工作!

AllowUsers boy857bt soladmin svc-Orion_SAM solarw boy857lj boy806nk boy806sk   boy857sr xxxxxxx
Run Code Online (Sandbox Code Playgroud)

但是当我在python脚本中运行它时,它会清除'AllowUsers'行并添加另一行,如下所示:

#RSAAuthentication yes
^A kn857sr xxxxxxx
Run Code Online (Sandbox Code Playgroud)

这是python脚本.

import pxssh

my_list=[
"server121"
]


for i in my_list:
    s = pxssh.pxssh(timeout=15, maxread=2000000)
    s.SSH_OPTS += "-o StrictHostKeyChecking=no"
    s.SSH_OPTS += "-o UserKnownHostsFile=/dev/null"
    s.login(i,'username','password')
    print (i)

    s.sendline('/usr/local/bin/sudo su -')
    s.expect('Password: ')
    s.sendline('xxxxxxx')

    s.prompt()
    print s.before
    s.sendline('perl -pi.bak -e \'s/^(AllowUsers.*)/\1 boy857sr xxxxxxx/g;\' 
/etc/ssh/sshd_config')
    s.prompt()
    print s.before

    s.sendline('exit')
    s.logout()
Run Code Online (Sandbox Code Playgroud)

Per*_*uck 7

Python将\1替换字符串中的字符解释为字符0x01(通常呈现为^A).

此外,使用\1,\2等在Perl的正则表达式被保留到的左手侧s///操作者,即,所述图案.在右手边(替换字符串),你应该使用$1,$2等来代替.

来自文档

......正是在这一步骤中,\1不知不觉地转换为$1替换文本s///,以便纠正那些尚未获得成熟习惯的不可救药的黑客.如果设置了use warningspragma或-w命令行标志(即$^W变量),则会发出警告.

所以:

s.sendline('perl -pi.bak -e \'s/^(AllowUsers.*)/$1 boy857sr xxxxxxx/g;\' /etc/ssh/sshd_config')
Run Code Online (Sandbox Code Playgroud)

应该做的伎俩.


更新:我终于找到了参考页\1对比$1(感谢这个职位).

  • @BioRod用鼠标勾选downvote箭头下方的灰色钩子.如果您同意hover-help,请单击.但是不要着急.慢慢来.如果您稍后决定,这没关系. (2认同)