2008-10-23 28 views
5

Tôi đang viết kịch bản lệnh python thực thi tập lệnh csh trong Solaris 10. Kịch bản lệnh csh nhắc người dùng nhập mật khẩu gốc (tôi biết) nhưng tôi không chắc chắn để làm cho kịch bản python trả lời lời nhắc bằng mật khẩu. Điều này có thể không? Dưới đây là những gì tôi đang sử dụng để thực thi tập lệnh csh:Làm cho python nhập mật khẩu khi chạy tập lệnh csh

import commands 

commands.getoutput('server stop') 
+0

Tôi đã bỏ PIPE, phiên bản mới hoạt động ... –

+0

Lần đầu tiên xem lệnh được sử dụng. BTW - bạn có thể sử dụng mô đun getpass để lấy mật khẩu từ dòng lệnh mà không cần hiển thị nó. – monkut

+1

[Liên kết bắt buộc] (http://www.perl.com/doc/FMTEYEWTK/versus/csh.whynot) –

Trả lời

7

Hãy xem mô-đun pexpect. Nó được thiết kế để đối phó với các chương trình tương tác, có vẻ như là trường hợp của bạn.

Oh, và nhớ rằng mật khẩu cứng mã hóa gốc của trong một vỏ hoặc python script là khả năng một lỗ hổng bảo mật: D

+0

Vâng, pexpect là con đường để đi ... Tôi đã đăng câu trả lời ở dưới cùng của chủ đề này. – darrickc

0

Có thể chuyển nó làm tham số. một cái gì đó như:

commands.getoutput('server stop -p password') 
+0

tập lệnh dừng máy chủ của chúng tôi không có cờ -p và sẽ không có khả năng nhận được thẻ. – darrickc

3

Sử dụng subprocess. Gọi Popen() để tạo quy trình của bạn và sử dụng giao tiếp() để gửi văn bản. Xin lỗi, quên bao gồm PIPE ..

from subprocess import Popen, PIPE 

proc = Popen(['server', 'stop'], stdin=PIPE) 

proc.communicate('password') 

Bạn nên làm tốt hơn để tránh mật khẩu và thử một chương trình như sudo và sudoers. Pexpect, được đề cập ở nơi khác, không phải là một phần của thư viện chuẩn.

+0

Điều này dường như không hoạt động. Tôi sẽ tiếp tục điều tra popen. – darrickc

+2

Tôi nhận được phản hồi tương tự khi sử dụng PIPE như bạn đề xuất ở đây. Tập lệnh dừng với dấu nhắc Mật khẩu:. – darrickc

+0

Tôi không nghĩ rằng điều này làm việc vì kịch bản csh hiện exec su gốc -c "$ cmd0 $ *" để cố gắng su vào thư mục gốc. Su sẽ là một quá trình khác với kịch bản 'dừng máy chủ'. – darrickc

0

Điều này dường như làm việc tốt hơn:

import popen2 

(stdout, stdin) = popen2.popen2('server stop') 

stdin.write("password") 

Nhưng nó không phải là 100% được nêu ra. Mặc dù "mật khẩu" là mật khẩu chính xác tôi vẫn nhận được su: Xin lỗi trở lại từ kịch bản csh khi nó cố gắng su để root.

+0

Tôi nghĩ rằng bạn đảo ngược stdin và stdout. –

+0

Không, từ API: Trả về các đối tượng tệp (child_stdout, child_stdin) – darrickc

+0

Chỉ một số FYI - popen2 là "Không được dùng kể từ phiên bản 2.6: Mô-đun này đã cũ. Hãy sử dụng mô-đun con xử lý. Kiểm tra đặc biệt là Thay thế chức năng cũ hơn với mô-đun phụ phần." – monkut

0

Để tránh phải trả lời câu hỏi mật khẩu trong kịch bản python tôi chỉ cần đi để chạy kịch bản gốc. Câu hỏi này vẫn chưa được trả lời nhưng tôi đoán tôi sẽ làm theo cách này ngay bây giờ.

+1

Bạn vui lòng dọn dẹp và củng cố câu trả lời của mình? – Roman

1
import pexpect 
child = pexpect.spawn('server stop') 
child.expect_exact('Password:') 

child.sendline('password') 

print "Stopping the servers..." 

index = child.expect_exact(['Server processes successfully stopped.', 'Server is not running...'], 60) 
child.expect(pexpect.EOF) 

Bí quyết! Pexpect quy tắc!

0

Thêm input= vào proc.communicate() làm cho nó chạy, cho những người thích sử dụng lib chuẩn.

from subprocess import Popen, PIPE 
proc = Popen(['server', 'stop'], stdin=PIPE) 
proc.communicate(input='password') 
Các vấn đề liên quan