[PYTHON] Paramiko에서 대화식 명령 실행하기
PYTHONParamiko에서 대화식 명령 실행하기
paramiko를 통해 대화 형 명령을 실행하려고합니다. cmd를 실행하면 암호를 묻는 메시지가 표시되지만 paramiko의 exec_command를 통해 암호를 제공하는 방법을 알지 못하고 실행이 중단됩니다. cmd 실행이 입력을 대화식으로 예상하면 터미널에 값을 보내는 방법이 있습니까?
ssh = paramiko.SSHClient()
ssh.connect(server, username=username, password=password)
ssh_stdin, ssh_stdout, ssh_stderr = ssh.exec_command("psql -U factory -d factory -f /tmp/data.sql")
누구든지이 문제를 어떻게 해결할 수 있는지 알고 있습니까? 고맙습니다.
해결법
-
==============================
1.완전한 paramiko 배포판에는 많은 데모가 포함되어 있습니다.
완전한 paramiko 배포판에는 많은 데모가 포함되어 있습니다.
데모 하위 디렉토리에서 demo.py와 interactive.py는 상황에 따라 과잉 사용이 될 수있는 완전한 대화 형 TTY 예제를 가지고 있습니다.
위의 예제에서 ssh_stdin은 표준 Python 파일 객체와 같은 역할을하므로 채널이 열려있는 한 ssh_stdin.write가 작동해야합니다.
나는 stdin에 쓸 필요가 전혀 없지만, 명령은 명령이 종료 되 자마자 채널이 닫히는 것을 제안하므로 표준 stdin.write 메소드를 사용하여 암호를 보내면 아마 작동하지 않을 것이다. 채널 자체에 더 낮은 수준의 paramiko 명령이있어 더 많은 제어권을 확보 할 수 있습니다. SSHClient.exec_command 메소드가 모든 세부 사항에 어떻게 구현되는지보십시오.
-
==============================
2.SSH를 사용하여 대화 형 ssh 세션을 만들려고 할 때도 같은 문제가있었습니다. Paramiko 포크입니다.
SSH를 사용하여 대화 형 ssh 세션을 만들려고 할 때도 같은 문제가있었습니다. Paramiko 포크입니다.
나는 주변을 파고이 기사를 발견 :
http://jessenoller.com/2009/02/05/ssh-programming-with-paramiko-completely-different/
당신이 할 수있는 당신의 예를 계속하려면
ssh_stdin, ssh_stdout, ssh_stderr = ssh.exec_command("psql -U factory -d factory -f /tmp/data.sql") ssh_stdin.write('password\n') ssh_stdin.flush() output = ssh_stdout.read()
이 기사는 exec_command를 중심으로 완전히 상호 작용하는 쉘을 설명하면서 좀 더 자세히 설명합니다. 소스 코드의 예제보다 사용하기가 훨씬 쉽습니다.
-
==============================
3.Pexpect를 사용하여 두 세계의 장점 (기대와 SSH 래퍼)을 얻으십시오.
Pexpect를 사용하여 두 세계의 장점 (기대와 SSH 래퍼)을 얻으십시오.
-
==============================
4.나는 paramiko에 익숙하지 않다. 그러나 이것은 효과가있다.
나는 paramiko에 익숙하지 않다. 그러나 이것은 효과가있다.
ssh_stdin.write('input value') ssh_stdin.flush()
stdin에 대한 정보는 다음을 참조하십시오.
http://docs.python.org/library/sys.html?highlight=stdin#sys.stdin
-
==============================
5.
ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect(server_IP,22,username, password) stdin, stdout, stderr = ssh.exec_command('/Users/lteue/Downloads/uecontrol-CXC_173_6456-R32A01/uecontrol.sh -host localhost ') alldata = "" while not stdout.channel.exit_status_ready(): solo_line = "" # Print stdout data when available if stdout.channel.recv_ready(): # Retrieve the first 1024 bytes solo_line = stdout.channel.recv(1024) alldata += solo_line if(cmp(solo_line,'uec> ') ==0 ): #Change Conditionals to your code here if num_of_input == 0 : data_buffer = "" for cmd in commandList : #print cmd stdin.channel.send(cmd) # send input commmand 1 num_of_input += 1 if num_of_input == 1 : stdin.channel.send('q \n') # send input commmand 2 , in my code is exit the interactive session, the connect will close. num_of_input += 1 print alldata ssh.close()
stdout.channel.recv_ready ()를 확인하지 않고 dierectly를 사용하면 stdout.read ()가 중단되는 이유 : in stdout.channel.exit_status_ready () :
내 경우에는 원격 서버에서 명령을 실행 한 후 세션이 사용자 입력을 기다리고 'q'입력 후 연결이 닫힙니다. 하지만 'q'를 입력하기 전에 stdout.read ()가 EOF를 기다리고 있습니다. 버퍼가 클 경우에는이 메도 디스크가 작동하지 않는 것 같습니다.
-
==============================
6.예제를 살펴보고 비슷한 방식으로 수행하십시오.
예제를 살펴보고 비슷한 방식으로 수행하십시오.
(http://jessenoller.com/2009/02/05/ssh-programming-with-paramiko-completely-different/에서 가져옴) :
ssh.connect('127.0.0.1', username='jesse', password='lol') stdin, stdout, stderr = ssh.exec_command( "sudo dmesg") stdin.write('lol\n') stdin.flush() data = stdout.read.splitlines() for line in data: if line.split(':')[0] == 'AirPort': print line
from https://stackoverflow.com/questions/373639/running-interactive-commands-in-paramiko by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] UnicodeDecodeError : 'utf8'코덱은 0 위치의 바이트 0xa5을 디코딩 할 수 없습니다 : 잘못된 시작 바이트 (0) | 2018.10.12 |
---|---|
[PYTHON] 파이썬에서 명시적인 '자아'를 피하는 법? (0) | 2018.10.12 |
[PYTHON] keypress를 읽는 파이썬 방법? (0) | 2018.10.12 |
[PYTHON] matplotlib에서 여러 개의 서브 플로트를 얻으려면 어떻게해야합니까? (0) | 2018.10.12 |
[PYTHON] 어떻게 파이썬은 내장 함수 pow ()를 구현 했습니까? (0) | 2018.10.12 |