2010-08-14 12 views
13

kullanarak aynı anda birden SSH bağlantıları oluşturma ve sonuçları yazdırır: Bilmiyorum kiAşağıdaki kod SSH aracılığıyla bir makinede grep çalışır Paramiko

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

nasıl (tek seferde beş makineleri grep edebilirsiniz herşeyi beş değişkene koymak ve hepsini basmaktan ziyade büyük gecikme var.

cevap

25

Aramaları ayrı iş parçacıklarına (veya işlemlere, ancak bu aşırıya kaçmayacak şekilde) eklemeniz gerekir, bu da kodun bir işlevde olmasını gerektirir (yine de iyi bir fikirdir: önemli kod yoktur) bir modülün üst seviyesinde). Örneğin

:

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

birçok fazla beş ana olsaydı, ben bir "iş parçacığı havuzu" mimari ve iş birimlerinin bir kuyruk yerine kullanarak öneriyoruz. Ancak, sadece beş için, "özel iş parçacığı" modeline bağlı kalmak daha kolay (özellikle standart kitaplıkta iş parçacığı havuzu olmadığından, threadpool gibi bir üçüncü taraf paketine veya bir sürü ince özelliğe ihtiyacın var. Kendi kodunuzun kodu ;-).

+0

hat stdin.flush() eklenti satırdan sonra,, yani sadece ben tüm veriler daha sonra komut diffrently işlenecektir belirtmeyi unutmuşum ve kodunuzu anlaşılan olabildiğince 4. ihtiyacım (I PyN00b m) Tüm makinelerdeki tüm verileri bir kerede yazdıracak, ancak verileri bir ana bilgisayardan nasıl işleyebilirim? Ve tüm ev sahiplerinin farklı geçişleri var, bu yüzden hepsini çalışma alanına alabilir miyim? Hızlı tekrar oynatmak için Ty. Saygılarımızla – Whit3H0rse

+1

@konjo, veriyi yeni elde edilen iş parçacığındaki işlemeyi gerçekleştirebilirsiniz - bunun yerine yazdırmaktaydım, çünkü bu sizin sorunuzda yaptığın * buydu. Elbette farklı işlemler için farklı işlemler gerçekleştirmeniz gerekiyorsa, işlemin yapılması "host" değeri üzerinde kontroller içerebilir. Veya, iş parçanızda 'target =' olarak kullanmak için birden fazla işlev yazabilirsiniz: tüm iş parçacıklarının aynı işlevi çalıştırması gereken bir kısıtlama yoktur! –

+0

Oke, tüm 4 makineyi grepleyebildi, ancak şimdi tüm veriler birleştirildi. Her bir ana bilgisayardan verileri nasıl alabilirim, örnek verebilir misiniz, lütfen yukarıdaki örneği uzatın mı? Saygılarımızla – Whit3H0rse

-1

Her şeyi for döngüsünde çalıştırın ve sonraki iterasyona geçmeden önce stdin'i kapatmayı unutmayın. Ben 1 makineyi ortadan stdin.close()

İlgili konular