2012-11-20 3 views
5

Cisco 라우터에 텔넷 연결을 시도하고 pexpect를 사용하여 명령을 보내려고합니다. 작동하지만 sendline()은 출력에서 ​​반복됩니다. setecho를 False로 사용한 후에도 마찬가지입니다. 코드는 다음과 같습니다pexpect setecho가 작동하지 않음

''' 
Created on Nov 19, 2012 

@author: Amit Barik 
''' 

import pexpect 

hostname = 'hostname' 
login_cmd = 'telnet ' + hostname + '.net' 
username = 'username' 
password = 'pwd' 
prompt = hostname + '#' 

p = pexpect.spawn(login_cmd) 
p.setecho(False) 
p.logfile = open('Log.log', 'w+') 

p.expect('Username:') 
print '1',repr(p.before) 

p.sendline(username) 
p.expect('Password:') 
print '2',repr(p.before) 

p.sendline(password) 
p.expect(prompt) 
print '3',repr(p.before) 

cmd = 'show clock' 
p.sendline(cmd) 
p.expect(prompt) 
print 'Output for {0}'.format(cmd), repr(p.before) 

출력은 다음과 같습니다 그래서

# On Python Console 
Output for show clock 'show clock\r\n00:16:40.692 UTC Tue Nov 20 2012\r\n' 

# On Log File 
Username: username 
username 
Password: pwd 

My Cisco Banner 

hostname#show clock 
show clock 
00:16:40.692 UTC Tue Nov 20 2012 
hostname# 

답변

0

, 제가 발견 한 것은 ... 이 * setecho 그냥 pexpect.before 출력에 (작동하지 않는되면, pexpect .sendline 텍스트가 있음). 유일한 해결책은 스트링 스트리핑을하는 것입니다. = pexpect.before.strip의 sudo는 코드 (pexpect.sendline) 같은 뭔가 * 또한, 기록하면서, logfile_read는 에코를 포함하지 않지만, 로그 파일은 (관계없이 setecho 가치)를 포함

0

나는 동일을하는 데 사용 에코가 꺼져 있더라도 에코가있는 문제입니다.

그러나 나는 해결책을 찾을 수도 : 그러니까 기본적으로

commandToRun = 'bash -c "less /readfile | tail -4"' 
yourConnection.sendLine("stty -echo") 
commandResult = yourConnection.sendLine(commandToRun) 
self.sendLine("stty echo") 

, 당신이 bash -c을 '다음 bash는 echo의 설정 사용하여 쉘에서 명령을 실행합니다.

8

나는 이것이 매우 오래된 질문이라는 것을 알고 있지만 네트워크 장치 (nix 터미널이 아닌)와 상호 작용할 때 동일한 문제가 있었기 때문에 응답했으며 웹에서 도움이되는 것을 찾을 수 없었습니다. 상세한 답변이 없기 때문에 다른 사람들에게 남겨두고 싶었습니다.

Pexpect 3 개 기록 수단 (logfile_send() 1. 2. 3. logfile_read()logfile())을 갖는다.

1) p.logfile() 네트워크 기기의 echo'd 출력을 기록되며이 전송 된 문자를 기록한다 : 상기 원래 포스터로부터의 출력의 예를 사용

여기 출력, 각 기록 방식에 대한 모습이며 send() & sendline()을 사용하십시오. 이것은 원래의 포스터가 일어나기를 원하지 않는 것입니다. 스크립트에서

:

p.logfile = open('Log.log', 'w+') 

출력 :

# On Python Console 
Output for show clock 'show clock\r\n00:16:40.692 UTC Tue Nov 20 2012\r\n' 

# On Log File 
Username: username #This is the `sendline()` output 
username    #This is echo from the network device 
Password: pwd  #This is `sendline()` output 
        #Notice, pwd only echo's once. There is no echo from the network device since it doesn't echo passwords 

My Cisco Banner 

hostname#show clock #This is the `sendline()` output 
show clock   #This is echo from the network device 
00:16:40.692 UTC Tue Nov 20 2012 
hostname# 

2) p.logfile_read() 만 네트워크 장치의 echo'd 출력을 기록합니다. 로그에는 p.sendline() 문자가 기록되지 않습니다. 이것은 원래 포스터가 원하는 결과입니다. 스크립트에서

:

p.logfile_read = open('Log.log', 'w+') 

출력 :

# On Python Console 
Output for show clock 'show clock\r\n00:16:40.692 UTC Tue Nov 20 2012\r\n' 

# On Log File 
Username: username #This is echo from the network device 
Password:   #There is no echo from the network device since it doesn't echo passwords 

My Cisco Banner 

hostname#show clock #This is echo from the network device 
00:16:40.692 UTC Tue Nov 20 2012 
hostname# 

3) p.logfile_send은 아마 대부분의 경우에 매우 유용하지 않은 로그에 p.sendline() 문자를 보내드립니다. 예를 건너 뛰겠습니다. 왜냐하면 모든 사람들이 지금까지 그 생각을 갖고있을 것이기 때문입니다.

따라서 logfile_read()을 사용하면 네트워크 장치와 상호 작용할 때 로그 출력에 표시되는 비밀번호 문제가 해결됩니다.이것은 또한 로그 출력에서 ​​이중 에코를 보여주는 pexpect의 문제를 수정합니다. 몇몇 사람들은 온라인에 대해서도 질문을하는 것을 보았습니다.

setecho(False)의 경우, docs에 따라 "터미널 에코 모드를 설정 또는 해제"로 설정합니다. 이 기능은 사람들이 원했던대로 (자신을 포함하여) sendline() 출력을 서두르는 것이 아닙니다. 그리고 네트워크 장치 (cisco, juniper, mrv 등)를 다루었으므로 tty echo를 끄려는 시도는 유용하지 않았습니다.

앞으로 도움이되기를 바랍니다.

+1

이해하신 것 같습니다. 예제를 제공해 줄 수 있습니까? 명시 적으로'logfile_read()'를 호출합니까? 아니면 그냥 함수를 무언가로 설정하고'pexpect'가 그 메소드를 호출 할 것인가? – Johnston