2017-11-18 10 views
3

私は、特定の行の最後に文字列を追加し、ホスト上の1つのライナーを実行すると動作します。例えば、私は完全に「AllowUsersという」pythonスクリプト内のperl one liner

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

作品で始まる行の末尾に「boy857srのXXXXXXX」を追加していますよ!

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

実際、私はなぜ_your_投稿がもう少しupvotedされていないのだろうかと思っています。明確な問題声明**と**素敵な[mcve]のある数少ない質問の1つです!私はそれらの多くがあったことを望む。 – PerlDuck

答えて

7

Pythonが(多くの場合、^Aとしてレンダリング)文字が0x01としてあなたの置換文字列で\1を解釈します。

はまた、Perlで\1\2等正規表現使用して、すなわちパターンに、s///オペレータの左側に予約されています。右側(置換文字列)には、代わりに$1$2などを使用する必要があります。それは\1はしぶしぶ選ばれていない負えない のsedハッカーを補正するために、s///$1 で置換テキストに変換されていることを、このステップであるdocs

から

...まだ賢明なイディオムをアップする。 use warningsプラグマまたは-wコマンドラインフラグ (つまり、$^W変数)が設定されている場合、警告は に出力されます。

ので:

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

は、トリックを行う必要があります。


更新:結局私はreference page\1のための対$1this postのおかげで)見つけました。

+0

それは働いた、なぜあなたは答えのために-1を持っていますか? – BioRod

+0

@BioRod嬉しいです。私は考えていないし、自分自身を疑問に思った。おそらく誰かが誤って犯した。 – PerlDuck

+1

@BioRodうまくいけば、この回答を受け入れるべきではありませんか? – melpomene

関連する問題