2016-04-11 30 views
0

Previous details
Farklı anasistemlere ping yapmak için bir anahtarda ssh kullanmam gerekiyor. Daha önce her ana makine için bir iş parçacığı başlattım, ancak maksimum ssh bağlantı numarasını kolayca aşacak şekilde çıktı, böylece this'a göre etkileşimli bir kabuk oturumu oluşturdum. Ama paralel koştuğumda, ilk komutu gönderdikten sonra orada asılı duruyordu. Bunu nasıl düzelteceğimi bilmiyorum.
Basitleştirilmiş kod aşağıda listelenen:Paramiko kullanılarak bir ssh oturumunda paralel olarak nasıl çalıştırılır

import paramiko 
import time 
from paramiko import SSHClient 
from multiprocessing.dummy import Pool 

def rping(src, user, passwd, dst): 

    def command(des): 
     chan.send('ping -s 64 -t 1500 %s\r\n' % des) 
     time.sleep(3) 
     resp = chan.recv(9999) 
     print resp 

    ssh = SSHClient() 
    ssh.load_system_host_keys() 
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
    ssh.connect(src, 22, user, passwd, timeout=3) 

    chan = ssh.invoke_shell() 

    pool = Pool() 
    pool.map(command, dst) 
    pool.close() 
    pool.join() 


if __name__ == '__main__': 
    print time.ctime() 

    src = '10.130.1.121' 
    user = 'user' 
    passwd = 'password' 
    dst = ['10.130.1.122', '10.130.1.123', 10.130.1.124''] 
    rping(src, user, passwd, dst) 

    print time.ctime() 

cevap

0

Ayı multiprocessing.dummy kullanarak akılda aslında threading modülü ile çalışmaktadır. Verilen değer, command işlevinize bir şey döndürmüyor.

def rping(src, user, passwd, dst): 
    def command(des): 
     chan = ssh.invoke_shell() # new channel 
     chan.send('ping -t 64 -s 1500 -c 3 %s\r\n' % des) 
     time.sleep(3) 
     resp = chan.recv(9999) 
     chan.close() # close channel 
     return resp 

    ssh = SSHClient() 
    ssh.load_system_host_keys() 
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
    ssh.connect(src, 22, user, passwd, timeout=3) 

    pool = Pool(len(dst)) 
    result = pool.map(command, dst) 
    pool.close() 
    pool.join() 
    ssh.close() # close SSH client 
    return result 
+0

süreç hala asılı, ama ben 'o iyi çalıştı' for' döngü ile pool.map() 'fakat daha fazla zaman alıcı –

+0

yerine olsam bunu ping argümanlar takas gibi görünüyor görmek ve aslında komut hiç bitmeyen. Düzeltmek için cevabı düzenleyin ve bir '-c 3 'ekleyin, böylece yalnızca 3 ICMP echo isteği gönderilir. – fernandezcuesta

+0

Belirtilmemişse varsayılan paket sayısı 5'tir. Bu betik 'for' loop kullanarak seri olarak çalıştı, ancak başarısız oldu ve 'pool.map()' –