Создание нескольких SSH-соединений одновременно с использованием Paramiko

Приведенный ниже код запускает grep на одной машине через SSH и печатает результаты:

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()

Как я могу grep пять машин одновременно (чтобы у меня не было большой задержки), чем поставить все что в пяти переменных и распечатать их все.

18
задан tshepang 11 January 2013 в 12:45
поделиться

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()

Если у вас гораздо больше, чем пять хостов, я бы рекомендовал вместо этого использовать архитектуру «пула потоков» и очередь рабочих единиц. Но всего за пять проще придерживаться модели «выделенного потока» (тем более, что в стандартной библиотеке нет пула потоков, поэтому вам понадобится сторонний пакет, например threadpool ... или, конечно, много собственного тонкого пользовательского кода ;-).

34
ответ дан 30 November 2019 в 07:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: