我有一个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()
答案 0 :(得分:7)
Python将替换字符串中的\1
解释为字符0x01(通常呈现为^A
)。
此外,在\1
运算符的左侧保留使用\2
,s///
等Perl正则表达式,即模式。在右侧(替换字符串),您应该使用$1
,$2
等。
来自docs
......正是在这一步,
\1
被勉强转换为$1
ins///
的替换文字,以便纠正不可救药 尚未获得成熟习惯的黑客。警告是 如果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)。