2017-11-18 2 views
3

나는 특정 라인의 끝에서 문자열을 추가하는 perl 하나의 라이너를 가지고 있으며 호스트에서 하나의 라이너를 실행할 때 작동합니다. 예를 들어, 내가 줄 끝에 'boy857sr의 XXXXXXX'를 추가 할 찾고 있어요 완벽하게 'AllowUsers'파이썬 스크립트 내에서 perl 하나의 라이너

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 

는하지만, 그것은 'AllowUsers'행을 닦고, 또 다른 줄을 추가 아래에 보이는 :

#RSAAuthentication yes 
^A kn857sr xxxxxxx 

여기 파이썬 스크립트입니다.

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]! 나는 그들 중 더 많은 것이 있었으면 좋겠다. – PerlDuck

답변

7

파이썬은 (종종 ^A로 렌더링) 문자 0x01로로 교체 문자열에서 \1을 해석합니다. \1를 사용 또한

, 펄 등이 \2패턴s/// 연산자, 즉 왼편으로 예약되어 정규 표현식에. 오른쪽 (교체 문자열)에 대신 $1, $2 등을 사용해야합니다. docs

에서

... 그것은 \1가 마지 못해 포착되지 않은 구제 불능 나오지 해커를 해결하기 위해, 에 $1s///의 대체 텍스트를 변환되고,이 단계에있다 아직도 성직자 숙어를 다 써 버리라. use warnings pragma 또는 -w 명령 줄 플래그 (즉, $^W 변수)이 설정된 경우 경고는 입니다.

그래서 :

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

트릭을 할해야합니다.


업데이트는 : 결국 나는 \1$1 (this post에게 감사)의 reference page을 발견했다.

+0

그게 효과가 있었는데 왜 대답이 -1 점입니까? – BioRod

+0

@BioRod 듣기가 좋아. 나는 전혀 몰랐으며 자신을 궁금해했다. 아마도 누군가 잘못한 것일 수도 있습니다. – PerlDuck

+1

@BioRod 작동하는 경우이 대답을 수락해서는 안됩니까? – melpomene

관련 문제