在python脚本中perl one liner

时间:2017-11-18 17:07:51

标签: python perl

我有一个perl one liner,在特定行的末尾附加一个字符串,当我在主机上运行一个衬里时,它会起作用。例如,我希望在以'AllowUsers'开头的行的末尾添加'boy857sr xxxxxxx'

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

完美无缺!

AllowUsers boy857bt soladmin svc-Orion_SAM solarw boy857lj boy806nk boy806sk   boy857sr xxxxxxx

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

#RSAAuthentication yes
^A kn857sr xxxxxxx

这是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()

1 个答案:

答案 0 :(得分:7)

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

此外,在\1运算符的左侧保留使用\2s///等Perl正则表达式,即模式。在右侧(替换字符串),您应该使用$1$2等。

来自docs

  

......正是在这一步,\1被勉强转换为$1 in   s///的替换文字,以便纠正不可救药   尚未获得成熟习惯的黑客。警告是   如果use warnings pragma或-w命令行标志,则发出   (即$^W变量)已设置。

所以:

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

应该这样做。

更新:最终我找到了\1$1的{​​{3}}(感谢reference page)。