2011-10-06 23 views
9

Nền: Tôi đang sử dụng python và paramiko để tự động hóa quá trình tôi thực hiện mọi lúc. Chúng tôi sử dụng một lệnh gọi là "handin" để gửi mã nguồn, nhưng điều này phải được thực hiện từ một máy tính trường học. Vì vậy, khi tôi gửi mã từ nhà, tôi phải: sftp vào máy chủ trường học, đặt các tệp trong thư mục, ssh vào máy tính của trường học, sử dụng lệnh 'handin'Kịch bản lệnh Python, vấn đề đọc đầu ra trong quá trình exec_command()

Tôi có thể đặt thành công tệp lên máy trường học. Vấn đề xảy ra khi tôi cố gắng sử dụng exec_command ('handin các tập tin của tôi') và sau đó đọc đầu ra để xác định hành động tiếp theo.

vì vậy tôi có

try: 
    (stdin, stdout, stderr) = client.exec_command(s) 
except: 
    print 'whoops' 
    sys.exit() 
print stdout.readlines() 

Nhưng điều này gây ra một bế tắc đối với một số lý do, kịch bản dường như không làm gì cả và tôi phải cuối cùng giết chết toàn bộ quá trình (ctrl + c doesnt work). Im không chắc chắn nếu exec_command không hoàn thành chính xác (mặc dù nó là nhận ra khỏi khối try/catch) hoặc nếu im có vấn đề về mạng hoặc những gì.

Bất kỳ ý tưởng nào?

cập nhật:

Sự cố là tương tác với lệnh handin trong khi thực thi. Sau khi thực thi lệnh, handin có thể hoặc vẫn chưa chạy được. Nếu đây là lần đầu tiên gửi thành công, hãy nói blah blah và kết thúc thực hiện. Tất cả đều tốt. Nhưng nếu tôi gửi lại, tôi phải ủy quyền ghi đè (stdin.write ('y')) cho mỗi tệp.

TL/DR:

Làm thế nào để kiểm tra xem một exec_command() vẫn chạy, chờ đợi đầu vào, và readline() từ stdout cho phù hợp?

+0

Bạn có giải pháp cho TL/DR không? Ngoài ra, làm cách nào tôi có thể biết văn bản trước khi chờ nhập liệu, ví dụ: @ mật khẩu ... –

Trả lời

5

Sự cố có thể là lệnh từ xa đang chờ đầu vào (nó hy vọng bạn viết một thứ gì đó vào stdin, không biết rằng bạn sẽ không viết trừ khi bạn nói vậy). Hãy thử stdin.channel.shutdown_write() (Tôi tin rằng stdin.close() tự nó sẽ không thực hiện thủ thuật: điều đó sẽ chỉ gây ra sự tuôn ra)

+0

Đó là những gì tôi cần để thực hiện một readline để kiểm tra. Nếu bạn handin nhiều lần nó sẽ hỏi bạn nếu bạn muốn ghi đè lên [y/N] cho mỗi tập tin, nếu nó lần đầu tiên nó không yêu cầu đầu vào thêm. Làm thế nào để kiểm tra đầu ra trong quá trình exec_command? – macgregor

+0

stdout.readlines() thực sự đọc đầu ra của các lệnh ssh, không phải là đầu vào 'đọc' từ kịch bản lệnh và gửi nó đến lệnh ssh. Để làm điều đó bạn cần stdin.write(). – bdk

+0

Tôi biết điều đó, bạn hiểu lầm.Tôi cập nhật bài viết gốc của mình, có thể điều đó sẽ xóa mọi thứ lên – macgregor

8

Tôi không thấy điều gì sai với đoạn mã ở trên. Chương trình dưới đây là một kịch bản hoàn chỉnh, nó đăng nhập vào một máy chủ và chạy lệnh ls để xem các tập tin. Tôi chỉ thử nó và nó làm việc cho tôi. Có lẽ hãy thử điều này và xem nó có hiệu quả với bạn hay không. Nếu nó không hoạt động, tôi nghi ngờ một số vấn đề cụ thể cho một trong hai máy chủ ssh của bạn, lệnh bạn đang chạy, hoặc cài đặt paramiko. Nếu nó làm việc cho bạn, nó chỉ là một vấn đề của việc thay đổi này để di chuyển về phía chức năng hiện tại của bạn và xem nơi nó phá vỡ.

import paramiko 
ssh=paramiko.SSHClient() 
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
ssh.connect('<ip address here>',username='<username here>',password='<password here>') 
stdin,stdout,stderr = ssh.exec_command("ls /") 
print stdout.readlines() 

Nếu điều đó phù hợp với đề xuất tiếp theo của bạn, hãy thử thay thế 'ls /' bằng lệnh handin thực tế bạn đang cố gắng chạy. Có thể lệnh của nó đang treo chờ người dùng nhập, v.v.

+0

yeah im kết nối tốt, lệnh cơ bản hoạt động tốt. Im cố gắng sử dụng readline để tìm ra những gì để đầu vào tiếp theo trong khi thực hiện lệnh – macgregor

+0

Nó gần như chắc chắn lệnh handin của bạn sau đó. Nó hy vọng hành vi tương tác. Hãy xem ví dụ này sử dụng 'sudo dmesg' trong liên kết và do đó phải trả lời lời nhắc mật khẩu: http://jessenoller.com/2009/02/05/ssh-programming-with-paramiko-completely-different/ – bdk

+0

ok, tôi cần phải làm điều này một cách năng động. Có cách nào để đọc stdout trong khi thực hiện lệnh để kiểm tra bao nhiêu lần tôi cần phải viết 'y' – macgregor

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