2011-01-14 41 views
6

Tôi đang cố gắng tự động thiết lập quyền truy cập SFTP. Tập lệnh này đang chạy với tư cách người dùng có quyền sudo và không có mật khẩu.Làm cách nào để đặt mật khẩu người dùng trong linux từ tập lệnh python?

tôi có thể tạo một người dùng như vậy:

>>> import subprocess 
>>> process = subprocess.Popen(['sudo', 'useradd', 'test'], shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 
>>> process.communicate() 
('', '') 

Tiếp theo tôi cần phải thiết lập mật khẩu của người dùng, nhưng tôi không thể tìm ra cách. Đây là những gì tôi đã thử.

>>> process = subprocess.Popen(['sudo', 'chpasswd'], shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 
>>> process.communicate('test:password') 

Trong chương trình python của tôi nó không có hiệu lực, trong trình thông dịch tương tác nó khóa sau dòng đầu tiên.

Cách tốt nhất để làm điều này là gì?

Tôi đang chạy python 2.6 trên Ubuntu sáng suốt.

Trả lời

6

Các tài liệu cho communicate nói rằng bạn sẽ cần phải thêm stdin=PIPE nếu bạn đang gửi dữ liệu đến đầu vào tiêu chuẩn thông qua communicate tham số:

http://docs.python.org/release/2.6/library/subprocess.html#subprocess.Popen.communicate

Tôi đánh giá cao này là mã chỉ bộ xương, nhưng ở đây là một vài nhận xét nhỏ khác, trong trường hợp chúng được sử dụng:

  • Nếu bạn không quan tâm đến đầu ra của lệnh useradd khác thất bại hay không, bạn có thể tốt hơn bằng cách sử dụng subprocess.check_call sẽ tăng ngoại lệ nếu lệnh trả về khác không.
  • Trong trường hợp thứ hai, bạn nên kiểm tra xem process.returncode là 0 sau cuộc gọi của bạn để communicate('test:password')
+0

Cảm ơn nhận xét. Mã thực sự là trong thực tế kỹ lưỡng hơn, nhưng đánh giá cao không ít. – Jake

1

Bạn quên này:

stdin=subprocess.PIPE 

Để gửi dữ liệu đến quá trình này, bạn cần một stdin.

Vì vậy, báo cáo kết quả đầy đủ là:

process = subprocess.Popen(['sudo', 'chpasswd'], stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.PIPE) 

và sau đó gọi communicate('password').

7

Hãy thử mã dưới đây mà sẽ làm như bạn yêu cầu tự động hóa

from subprocess import Popen, PIPE, check_call 
check_call(['useradd', 'test']) 
proc=Popen(['passwd', 'test'],stdin=PIPE,stdout=PIPE,stderr=PIPE) 
proc.stdin.write('password\n') 
proc.stdin.write('password') 
proc.stdin.flush() 
stdout,stderr = proc.communicate() 
print stdout 
print stderr 

print báo cáo là không bắt buộc.

1

Trên Ubuntu, sử dụng usermod

class SomeClass 
    def userPasswd(self, login, password): 
     encPass = crypt.crypt(password) 
     command = "usermod -p '{0:s}' {1:s}".format(encPass, login) 
     result = os.system(command) 
     if result != 0: 
      logging.error(command) 
     return result 
1

Tôi đoán vấn đề là bạn quên tùy chọn -S cho sudo.

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