【问题标题】:perl one liner inside python scriptperl python脚本中的一个衬里
【发布时间】:2017-11-18 17:07:50
【问题描述】:

我有一个 perl one 衬垫,它在特定行的末尾附加一个字符串,当我在主机上运行 one 衬垫时它可以工作。例如,我希望在以“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()

【问题讨论】:

  • 其实我也想知道为什么 your 的帖子没有得到更多的支持。这是每天为数不多的几个问题之一,有一个明确的问题陈述一个很好的minimal reproducible example!我希望有更多。

标签: python perl


【解决方案1】:

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

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

来自docs

...正是在这一步,\1 被不情愿地转换为$1 in s///的替换文字,以纠正不可救药 sed 黑客还没有学会理智的成语。一个警告是 如果 use warnings 杂注或 -w 命令行标志发出 (即$^W 变量)已设置。

所以:

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

应该可以解决问题。


更新:最终我找到了reference page 对应于\1$1(感谢this post)。

【讨论】:

  • @BioRod 很高兴听到。我不知道,也想知道自己。也许有人误点击了。
  • @BioRod 如果有效,您不应该接受这个答案吗?
  • @BioRod 用鼠标拨动向下投票箭头下方的灰色钩子。如果您同意悬停帮助,请单击。但不要着急。慢慢来。以后再决定也没关系。
猜你喜欢
  • 1970-01-01
  • 2015-01-15
  • 2015-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-31
  • 2015-12-27
  • 1970-01-01
相关资源
最近更新 更多