2010-08-14 19 views
13

Đoạn code dưới đây chạy grep trong cùng một máy thông qua SSH và in kết quả:Tạo nhiều kết nối SSH tại một thời gian sử dụng 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() 

Làm thế nào tôi có thể grep lăm máy cùng một lúc (vì vậy mà tôi không có sự chậm trễ lớn), hơn là đặt tất cả trong năm biến và in tất cả chúng ra.

Trả lời

25

Bạn sẽ cần phải đặt các cuộc gọi thành các chuỗi riêng biệt (hoặc các quá trình, nhưng điều đó sẽ quá mức cần thiết), do đó yêu cầu mã phải ở trong một hàm (đó là một ý tưởng hay: không có mã đáng kể ở cấp cao nhất của mô-đun).

Ví dụ:

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

Nếu bạn có nhiều hơn năm host, tôi sẽ khuyên bạn sử dụng thay vì một "hồ bơi thread" kiến ​​trúc và một danh sách các đơn vị làm việc. Nhưng, chỉ trong năm, nó đơn giản hơn để dính vào mô hình "chuyên dụng thread" (đặc biệt là kể từ khi không có hồ bơi thread trong thư viện chuẩn, vì vậy bạn sẽ cần một gói bên thứ ba như threadpool ... hoặc rất nhiều tùy chỉnh tinh tế mã của riêng bạn tất nhiên ;-).

+0

Tôi đã loại bỏ 1 máy, vì vậy tôi chỉ cần 4. Tôi quên đề cập đến tất cả dữ liệu sẽ được xử lý sau này trong kịch bản và tôi có thể hiểu mã của bạn (I m PyN00b)) nó sẽ in tất cả dữ liệu từ tất cả các máy cùng một lúc, nhưng làm thế nào tôi có thể xử lý dữ liệu chỉ từ một máy chủ sau đó? Và tất cả các máy chủ có pass khác nhau vì vậy tôi có thể đặt tất cả trong workon()? Ty để phát lại nhanh Alex. Kính trọng – Whit3H0rse

+1

@konjo, bạn có thể thực hiện xử lý dữ liệu trong chuỗi chỉ lấy dữ liệu - thay vào đó tôi in 'in', chỉ vì đó là những gì bạn đã làm trong câu hỏi của mình. Việc xử lý tất nhiên có thể liên quan đến việc kiểm tra giá trị của 'máy chủ', nếu bạn cần thực hiện xử lý khác nhau cho các giá trị khác nhau của chúng. Hoặc, bạn có thể viết nhiều hàm để sử dụng như 'target =' trong các chủ đề của bạn: không có ràng buộc rằng tất cả các luồng phải chạy cùng một hàm! –

+0

Oke tôi đã có thể grep tất cả 4 máy, nhưng bây giờ tất cả dữ liệu được sáp nhập. Làm cách nào tôi có thể trích xuất dữ liệu từ từng máy chủ riêng lẻ, bạn có thể đưa ra ví dụ về mi không, vui lòng mở rộng ví dụ ở trên? Kính trọng – Whit3H0rse

-1

Chỉ cần chạy mọi thứ trong vòng lặp for và đừng quên đóng stdin trước khi chuyển sang lần lặp tiếp theo. Tức là, sau dòng stdin.flush(), hãy thêm dòng stdin.close()

Các vấn đề liên quan