2011-01-31 32 views
8

Tôi đang làm việc trên một số mã sẽ DD thiết bị chặn qua SSH và tôi muốn thực hiện điều này với quy trình con để tôi có thể theo dõi trạng thái của DD trong quá trình truyền (giết dd quá trình với SIGUSR1 để có được trạng thái hiện tại của nó, và đọc bằng cách sử dụng các lựa chọn).Đầu ra đường ống Python giữa hai quy trình con

Lệnh mà tôi đang cố gắng để thực hiện sẽ là một cái gì đó như thế này:

dd if=/dev/sda | ssh [email protected] 'dd of=/dev/sda' 

Phương pháp hiện tại tôi đã cố gắng là:

dd_process = subprocess.Popen(['dd','if=/dev/sda'],0,None,None,subprocess.PIPE, subprocess.PIPE) 
ssh_process = subprocess.Popen(['ssh','[email protected]','dd of=/dev/sda'],0,None,dd_process.stdout) 

Tuy nhiên khi tôi chạy này, quá trình SSH trở thành không còn tồn tại sau 10-40 giây.
Tôi có hoàn toàn bị nguyền rủa ở đây hay không có đường ống nào giữa các quá trình con như thế này?

Chỉnh sửa: Tắt mã thực của tôi không có tên máy chủ trong đó. Đây là cách làm đúng.

+1

Tôi hy vọng rằng bạn đang sử dụng chính xác thực dựa trên hoặc cơ chế không tương tác khác. –

+0

Rõ ràng;) Tôi chỉ lấy đối số ssh đó để rút ngắn ví dụ –

+0

liên quan: [Làm cách nào để sử dụng subprocess.Popen để kết nối nhiều quy trình bằng đường ống?] (Http://stackoverflow.com/q/295459/4279) – jfs

Trả lời

13
from subprocess import Popen, PIPE 
dd_process = Popen(['dd', 'if=/dev/sda'], stdout=PIPE) 
ssh_process = Popen(['ssh', '[email protected]', 'dd','of=/dev/sda'],stdin=dd_process.stdout, stdout=PIPE) 
dd_process.stdout.close() # enable write error in dd if ssh dies 
out, err = ssh_process.communicate() 

Đây là cách để PIPE đầu ra quá trình đầu tiên vào thứ hai. (thông báo stdin trong ssh_process)

+0

'grep_process' ?! –

+1

Vâng, đó là những gì tôi đã có, và nó vẫn không hoạt động. Các lỗi đặc biệt khi ssh đi không còn tồn tại là: ssh: dd of =/dev/sda: Tạm thời thất bại trong độ phân giải tên –

+1

@Cristian, xin lỗi - Nó phải là ssh_process. @Philip - Lỗi phải làm với miền của bạn và kết nối internet (bạn đã đưa ra ví dụ như example.com). Bạn có thể hoàn thành trực tiếp không? Đó là không sử dụng python? –

4

sh Thư viện Python giúp dễ dàng gọi các lệnh hệ điều hành và đặt chúng.

Từ các tài liệu:

for line in tr(tail("-f", "test.log", _piped=True), "[:upper:]", "[:lower:]", _iter=True): 
    print(line) 
+0

Đó là mô-đun 'sh' thực sự tốt đẹp. Cám ơn vì đã chia sẻ. – mpontillo

+0

Nhưng rất nguy hiểm khi sử dụng với đầu vào không được chọn – LtWorf

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