我有一个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)
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)
应该做的伎俩.