복붙노트

[PYTHON] Paramiko에서 대화식 명령 실행하기

PYTHON

Paramiko에서 대화식 명령 실행하기

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. ==============================

    1.완전한 paramiko 배포판에는 많은 데모가 포함되어 있습니다.

    완전한 paramiko 배포판에는 많은 데모가 포함되어 있습니다.

    데모 하위 디렉토리에서 demo.py와 interactive.py는 상황에 따라 과잉 사용이 될 수있는 완전한 대화 형 TTY 예제를 가지고 있습니다.

    위의 예제에서 ssh_stdin은 표준 Python 파일 객체와 같은 역할을하므로 채널이 열려있는 한 ssh_stdin.write가 작동해야합니다.

    나는 stdin에 쓸 필요가 전혀 없지만, 명령은 명령이 종료 되 자마자 채널이 닫히는 것을 제안하므로 표준 stdin.write 메소드를 사용하여 암호를 보내면 아마 작동하지 않을 것이다. 채널 자체에 더 낮은 수준의 paramiko 명령이있어 더 많은 제어권을 확보 할 수 있습니다. SSHClient.exec_command 메소드가 모든 세부 사항에 어떻게 구현되는지보십시오.

  2. ==============================

    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. ==============================

    3.Pexpect를 사용하여 두 세계의 장점 (기대와 SSH 래퍼)을 얻으십시오.

    Pexpect를 사용하여 두 세계의 장점 (기대와 SSH 래퍼)을 얻으십시오.

  4. ==============================

    4.나는 paramiko에 익숙하지 않다. 그러나 이것은 효과가있다.

    나는 paramiko에 익숙하지 않다. 그러나 이것은 효과가있다.

    ssh_stdin.write('input value')
    ssh_stdin.flush()
    

    stdin에 대한 정보는 다음을 참조하십시오.

    http://docs.python.org/library/sys.html?highlight=stdin#sys.stdin

  5. ==============================

    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. ==============================

    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
    
  7. from https://stackoverflow.com/questions/373639/running-interactive-commands-in-paramiko by cc-by-sa and MIT license