在Python脚本中使用Perl一行代码

3
我有一个Perl单行命令,可以在特定行的末尾添加字符串。当我在主机上运行这个单行命令时,它可以正常工作。例如,我想在以“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
其实我也很想知道为什么你的帖子没有更多的赞。这是每天少有的几个问题陈述清晰且有一个不错的 [mcve]!我希望能有更多这样的问题。 - PerlDuck
1个回答

7

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

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

来自文档

... 在s///的替换文本中,它被勉强地转换为$1,以纠正那些还没有掌握更合理语法的sed黑客。如果设置了use warnings pragma或-w命令行标志(即$^W变量),则会发出警告。

因此:

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

应该能解决问题。


更新: 最终我找到了关于\1$1参考页(感谢这篇帖子)。


@BioRod 很高兴听到这个消息。我也不知道,自己也很疑惑。也许是有人误点了什么。 - PerlDuck
1
如果它起作用了,你不应该接受这个答案吗? - melpomene
2
@BioRod 用鼠标轻弹向下投票箭头下面的灰色钩子。如果你同意悬停提示,请点击。但不要着急,慢慢来。如果你决定稍后再做决定也没关系。 - PerlDuck

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接