2010-07-02 35 views
39

Tôi có tệp là tập lệnh bash yêu cầu SUDO hoạt động.Làm cách nào để gọi tập lệnh shell từ php yêu cầu SUDO?

Tôi có thể chạy nó từ dòng lệnh bằng SUDO nhưng tôi sẽ được nhắc nhập mật khẩu SUDO.

Tôi muốn chạy tập lệnh này từ php qua shell_exec nhưng tôi nếu tôi gọi SUDO, nó không giống như dòng lệnh nơi tôi có thể được nhắc nhập mật khẩu. Có cách nào để vượt qua mật khẩu cho sudo với cuộc gọi sudo?

Tôi làm cách nào để thực hiện việc này?

+0

Bằng cách này, tôi chạy máy này trên máy 10ub của riêng mình với apache2 và php5 –

+0

Bạn nên cân nhắc việc thay đổi quyền của tập lệnh. Ví dụ, bạn có thể thay đổi nhóm thành người dùng apache (www-data) và cho phép nhóm thực thi quyền: 'chgrp www-data script.sh && chmod g + x script.sh'. –

+0

@danilo không phải là tệp của chính nó yêu cầu SUDO những gì các tệp gọi, đó là 'svn commit' nhưng trước tiên tôi' cd/var/www' để gọi svn commit từ bản sao làm việc. Có cách nào tôi có thể thêm quyền để làm điều đó cho apache người dùng www-admin? –

Trả lời

41

Chỉnh sửa tệp sudoers (với visudo) và thêm quy tắc cho phép người dùng máy chủ web chạy lệnh mà không cần mật khẩu. Ví dụ:

www-data ALL=NOPASSWD: /path/to/script 
+0

có hoạt động với nginx không? –

5

Bạn có thể thêm một cái gì đó như thế này để tập sudoers của bạn:

username ALL=NOPASSWD: /path/to/script 

này sẽ cho phép người dùng đặc biệt để gọi sudo trên rằng kịch bản cụ thể mà không bị nhắc nhở cho một mật khẩu.

+1

Điều này có ý nghĩa nhưng một phần gây nhầm lẫn cho tôi ... Trường hợp chính xác tôi đặt dòng 'tên người dùng ALL = NOPASSWD:/path/to/script' Tập tin sudoers của tôi là gì? –

+1

Trong '/ etc/sudoers', mặc dù bạn thường sử dụng lệnh' visudo' để chỉnh sửa tập tin đó. –

8

Có nhiều giải pháp cho vấn đề này.

  • Trước hết, hãy xem xét việc thay đổi quyền của tập lệnh, nếu lý do tại sao bạn muốn sudo chỉ đơn giản là một vấn đề cho phép (xem bình luận tôi đã thêm cho câu hỏi ở trên).

  • Một cách tiếp cận khác sẽ sử dụng số setuid bit. [Chỉnh sửa: Có vẻ như setuid không hoạt động tốt với tập lệnh. Để được giải thích, hãy xem this link.]

  • Phương pháp thứ ba, nhưng rất không an toàn là đọc mật khẩu từ tệp mật khẩu. Cảnh báo: Điều này rất không an toàn, nếu có bất kỳ khả năng nào khác, đừng làm điều đó. Và nếu bạn làm điều đó, hãy thử ẩn tệp mật khẩu ở đâu đó trong hệ thống phân cấp thư mục của bạn.

    <?php 
    shell_exec('sudo -u root -S bash script.sh < /home/[user]/passwordfile'); 
    ?> 
    
  • Và khả năng thứ tư là sử dụng NOPASSWD tag trong tệp sudoers. Bạn nên hạn chế sức mạnh này đối với các lệnh cụ thể mà bạn cần.

+0

Thay đổi quyền kịch bản sẽ không chạy nó dưới dạng root, và setuid không hoạt động trên các script – Brian

+0

Không, nó sẽ không chạy nó dưới dạng gốc, nhưng nó sẽ giải quyết vấn đề nếu lý do cho việc sử dụng sudo chỉ đơn giản là kịch bản không thực thi được. Và về điều thiết yếu, có vẻ như bạn đã đúng. Trong trường hợp đó, xin lỗi thông tin sai lạc của tôi. Tôi đã tìm thấy một liên kết hữu ích về chủ đề này: http://www.faqs.org/faqs/unix-faq/faq/part4/section-7.html –

+1

omg. KHÔNG BAO GIỜ TIẾT KIỆM MỘT MẬT KHẨU CÓ TRUY CẬP ROOT! Điều này chưa bao giờ là hình thức tốt. @ Brian của câu trả lời là tốt hơn nhiều: không có mật khẩu được sử dụng. – cmroanirgo

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