복붙노트

[PYTHON] Paramiko를 사용하여 한 번에 여러 개의 SSH 연결 만들기

PYTHON

Paramiko를 사용하여 한 번에 여러 개의 SSH 연결 만들기

아래 코드는 SSH를 통해 한 시스템에서 grep을 실행하고 결과를 인쇄합니다.

import sys, os, string
import paramiko

cmd = "grep -h 'king' /opt/data/horror_20100810*"

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect('10.10.3.10', username='xy', password='xy')
stdin, stdout, stderr = ssh.exec_command(cmd)
stdin.write('xy\n')
stdin.flush()

print stdout.readlines()

한 번에 5 개의 머신을 grep 할 수있어서 (큰 지연이 없도록), 모든 것을 5 개의 변수에 넣고 모두 출력하는 것보다.

해결법

  1. ==============================

    1.호출을 별도의 스레드 (또는 프로세스이지만 과부하가 될 것입니다)에 넣어야합니다. 코드가 함수에 있어야합니다 (어쨌든 좋은 아이디어입니다 : 모듈의 맨 위에는 실질적인 코드가 없습니다. 수평).

    호출을 별도의 스레드 (또는 프로세스이지만 과부하가 될 것입니다)에 넣어야합니다. 코드가 함수에 있어야합니다 (어쨌든 좋은 아이디어입니다 : 모듈의 맨 위에는 실질적인 코드가 없습니다. 수평).

    예 :

    import sys, os, string, threading
    import paramiko
    
    cmd = "grep -h 'king' /opt/data/horror_20100810*"
    
    outlock = threading.Lock()
    
    def workon(host):
    
        ssh = paramiko.SSHClient()
        ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        ssh.connect(host, username='xy', password='xy')
        stdin, stdout, stderr = ssh.exec_command(cmd)
        stdin.write('xy\n')
        stdin.flush()
    
        with outlock:
            print stdout.readlines()
    
    def main():
        hosts = ['10.10.3.10', '10.10.4.12', '10.10.2.15', ] # etc
        threads = []
        for h in hosts:
            t = threading.Thread(target=workon, args=(h,))
            t.start()
            threads.append(t)
        for t in threads:
            t.join()
    
    main()
    

    5 개 이상의 호스트가있는 경우 "스레드 풀"아키텍처와 작업 단위 큐를 대신 사용하는 것이 좋습니다. 그러나 단 5 개만, "전용 스레드"모델을 고수하는 것이 더 간단합니다 (특히 표준 라이브러리에 스레드 풀이 없기 때문에 스레드 풀과 같은 타사 패키지가 필요합니다 ...) 또는 많은 미묘한 사용자 정의 물론 자신의 코드 ;-).

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

    2.for 루프에서 모든 것을 실행하고 다음 반복으로 이동하기 전에 stdin을 닫는 것을 잊지 마십시오. 즉, stdin.flush () 라인 다음에 stdin.close () 라인을 추가합니다.

    for 루프에서 모든 것을 실행하고 다음 반복으로 이동하기 전에 stdin을 닫는 것을 잊지 마십시오. 즉, stdin.flush () 라인 다음에 stdin.close () 라인을 추가합니다.

  3. from https://stackoverflow.com/questions/3485428/creating-multiple-ssh-connections-at-a-time-using-paramiko by cc-by-sa and MIT license