Vì vậy, tôi đang cố gắng để có được một quy trình được chạy như một người dùng siêu từ bên trong một tập lệnh python bằng cách sử dụng tiến trình con. Trong một cái gì đó ipython vỏ nhưchạy lệnh với tư cách người dùng siêu từ tập lệnh python
proc = subprocess.Popen('sudo apach2ctl restart',
shell=True, stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
hoạt động tốt, nhưng ngay sau khi tôi dính nó vào một kịch bản tôi bắt đầu nhận được: sudo: apach2ctl: command not found
.
Tôi đoán điều này là do cách sudo xử lý môi trường trên ubuntu. (Tôi cũng đã thử sudo -E apche2ctl restart
và sudo env path=$PATH apache2ctl restart
không có kết quả)
Vì vậy, câu hỏi của tôi về cơ bản là nếu tôi muốn chạy apache2ctl restart
làm người dùng siêu nhắc người dùng nhập mật khẩu người dùng khi cần thiết, tôi nên làm như thế nào điều này? Tôi không có ý định lưu trữ mật khẩu trong tập lệnh.
Chỉnh sửa:
Tôi đã thử chuyển các lệnh dưới dạng cả chuỗi và được mã hóa vào danh sách. Trong trình thông dịch python, với một chuỗi tôi sẽ nhận được lời nhắc mật khẩu đúng (vẫn không hoạt động trong một kịch bản python như trong vấn đề ban đầu của tôi), một danh sách chỉ cung cấp cho màn hình trợ giúp cho sudo.
Chỉnh sửa 2:
Vì vậy, những gì tôi thu thập là trong khi Popen sẽ làm việc với một số lệnh giống như chuỗi khi shell = Đúng, phải mất
proc = subprocess.Popen(['sudo','/usr/sbin/apache2ctl','restart'])
không có 'shell = True' để có được sudo làm việc.
Cảm ơn!
Cách định cấu hình sudo để người dùng này chỉ có thể chạy lệnh này mà không yêu cầu mật khẩu? –
Bạn có thể muốn sử dụng ['proc.wait()'] (https://docs.python.org/2/library/subprocess.html#subprocess.Popen.wait) tùy thuộc vào những gì bạn đang làm; 'wait' không tiến hành cho đến khi tiến trình con chạy xong. – craymichael