2017-11-07 15 views
0

Perl에서 Python으로 스크립트를 실행하여 원격 서버 및 장치의 특정 작업을 자동화하는 방법에 대해 생각해보십시오. Expect를 사용하여 특정 결과를 확인하고 데이터를 다시 가져올 수 있어야합니다. Paramiko-Expect를 살펴보고 나는 그것을 좋아하지만 매번 시간을 초과합니다. 나는 전체에 그것을 시도하고 직접 노드의 텍스트에 넣어에서 기대하는 프롬프트의 여러 버전을 시도했습니다paramiko가 시간 초과를 기대합니다

Traceback (most recent call last):  
File "python_test.py", line 40, in <module> 
    main()  
File "python_test.py", line 28, in main 
    interact.expect(PROMPT) 
File "/usr/local/lib/python2.7/site-packages/paramikoe.py", line 122, in expect 
    buffer = self.channel.recv(self.buffer_size)  
File "/usr/local/lib/python2.7/site-packages/paramiko/channel.py", line 598, in recv 
    raise socket.timeout() socket.timeout 

:

import paramiko 
from paramikoe import SSHClientInteraction 

HOSTNAME = "HOST IP" 
PASSWORD = "PWORD" 
USERNAME = "UNAME" 
PROMPT = "(node name)#" 

command = "show command" 

print PROMPT 

file = open("testlog.txt","w") 

def main(): 

    client = paramiko.SSHClient() 
    client.load_system_host_keys() 
    client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 

    client.connect(HOSTNAME, port=22, username=USERNAME, password=PASSWORD) 

    interact = SSHClientInteraction(client, timeout=10, display=True) 

    interact.send(command) 
    interact.expect(PROMPT) 
    file.write(interact.current_output_clean) 
    client.close() 

    return 



main() 
file.close() 

내가 얻을 역 추적입니다 정규식. 아무것도 작동하지 않습니다. client.expect에 도착하면 항상 타임 아웃됩니다. Paramiko-expect documentation이 도움이되지 않으며이 질문을 보는 유일한 다른 곳은 도움이되지 않을만큼 충분히 다릅니다. 모든 조언을 주시면 감사하겠습니다.

답변

1

예상대로 ... 프롬프트로 프롬프트를 넣으십시오. Here은 paramiko 상호 작용 예입니다. 라인 (21)을 유의하시기 바랍니다, 37 - I가 코드의 일부를 업데이트했습니다 그래서

PROMPT = '[email protected]:~\$\s+' 

interact.expect(PROMPT) 

:

interact = SSHClientInteraction(client, timeout=10, display=True) 
interact.expect(PROMPT) 

interact.send("ls") 
interact.expect(".*Maildir.*") 
file.write(interact.current_output_clean) 
client.close() 

나는 testlog.txt 원격 호스트의 홈 디렉토리의 목록, 가득합니다.

사이드 노트 - 파이썬 3로 전환하십시오. 시작하는 경우 곧 구식이 아닌 것으로 잘 알려진 도구를 사용하는 것이 좋습니다. 또한 ipython을 사용하거나 jupyter - 코드가 더 대화식이되고 테스트가 빠릅니다. 어쩌면 netmiko가 당신에게 흥미로울 것입니까?

+0

프롬프트에 입력하는 내용의 예로 PROMPT = "(노드 이름) #"을 넣었습니다. 난 거기에 정규식을 사용하고 그것을 볼 수 있어야 정확한 프롬프트를 설정하고 시간 초과 어느 쪽이든 얻을. 넷미코를 살펴 보겠습니다. –

+0

확인. 어쩌면 그 정규식이 문제일까요? 내 변경 사항과 함께 귀하의 코드가 작동 ... –

+0

내가 정규식에 설정하고 또한 정확한 프롬프트로 그것을 설정했는데, 당신처럼 않았다. 그래서 나는 그것이 왜 당신을 위해 일하고 왜 나를 위해 일하지 않는가에 관해서는 손해를보고 있습니다. 그것은 코드가 아닌 것처럼 보이므로 다른 솔루션을 찾을 것입니다. –