Tập lệnh PHP không thể chạy tập lệnh bash. sh: Quyền bị từ chối


14

Tôi đang cố gắng thực thi một tập lệnh .sh từ PHP, tuy nhiên nó không thực thi.

Tôi đã kiểm tra nhật ký lỗi và tôi nhận được lỗi 'sh: Quyền bị từ chối'. Tôi đã kiểm tra xem người dùng php nào đang được chạy và nó được thực hiện dưới người dùng apache.

Tôi đã thử thay đổi quyền sở hữu của .sh thành người dùng apache, nhưng không có kết quả.

Lúc đầu tôi nghĩ điều này là do tập lệnh nằm ngoài www / dir, tuy nhiên ngay cả khi tôi đặt tập lệnh vào cùng thư mục, lỗi vẫn được đưa ra.

Có giải pháp nào khác ngoài việc thêm người dùng apache vào danh sách SUDOers không?

Kịch bản sh chạy tốt nếu tôi khởi chạy nó từ putty bằng lệnh 'php filename.php'.


3
Nó là một tập lệnh shell hay tập tin PHP? Đoạn cuối của bạn không rõ ràng về điều đó. Ngoài ra, bạn đã thiết lập quyền thực thi ( x) trên tệp chưa? Bạn đã chỉ định trình thông dịch kịch bản trong một dòng shebang?
Daniel Beck

Đó là một tập lệnh bash được chạy từ PHP. Có, tôi đã làm cho nó có thể thực thi được và tôi đã chỉ định trình thông dịch kịch bản. Nó hoạt động chính xác khi tôi thực thi tập lệnh PHP từ putty và tập lệnh bash được gọi và chạy chính xác. Nhưng nếu tôi chạy tập lệnh php từ webbrowser thì nó không chạy được tập lệnh bash và nó sẽ xảy ra lỗi này vì nó chạy với tư cách là người dùng apache chứ không phải người dùng tôi sử dụng trong putty.
Robin Presto

1
Hãy thử chmod 775 yourscript.sh. Điều đó sẽ cung cấp r-x(đọc và thực thi) quyền cho người dùng "Khác" trên tệp đó.
Rhyuk

Tôi đã thử nó. Không may mắn .. Tôi không thể biết lý do chính xác cho đến ngày mai. Tôi không có quyền truy cập vào nhật ký từ vị trí của tôi. Tôi sẽ lấy lại cho các bạn. Cảm ơn sự giúp đỡ của bạn. :)
Robin Presto

Câu trả lời:


10

Hãy thử những gợi ý sau:

  • Hãy thử chạy bên dưới lệnh kiểm tra và kiểm tra xem nó có hoạt động không:
    • php -r "echo exec('whoami');"
  • Đảm bảo rằng tất cả các thư mục mẹ và các tệp có ít nhất các r-xquyền cờ:
    • chmod 755 dir; chmod 755 file
  • Hãy chắc chắn rằng chủ sở hữu của tệp là người dùng Apache của bạn .
    • Cũng thử thêm +scờ (sudo) vào tệp (không được đề xuất):
      • chmod u+s file,
  • Hãy chắc chắn rằng PHP của bạn không chạy trong a safe_mode.
  • Đảm bảo rằng tập lệnh nằm trong thư mục gốc của bạn:
    • Nếu không, di chuyển tập lệnh bên trong nó,
    • hoặc thêm thư mục đó vào cấu hình Apache của bạn,
    • hoặc thêm thư mục này vào include_path, vd:
      • php.ini tập tin: include_path ".:/usr/local/lib/php:/your/dir"
      • hoặc .htaccesstập tin:php_value include_path ".:/usr/local/lib/php:/your/dir"
  • Kiểm tra xem shell của bạn có được đặt thành hợp lệ không (ví dụ /bin/sh) cho người dùng Apache của bạn (ví dụ: kiểm tra với finger:).
  • Đảm bảo rằng bạn php.inikhông sử dụng: disable_functionscho execchức năng
  • Nếu sử dụng SELinux hoặc đã selinux-utilscài đặt (hệ thống Linux được tăng cường bảo mật), hãy kiểm tra getenforce/ setenforcecấu hình như được mô tả trong câu trả lời @Tonin .

Xử lý sự cố:

  • Nếu bạn đã thay đổi php.inihoặc httpd.conftệp của mình, đừng quên khởi động lại máy chủ web,
  • Kiểm tra nhật ký lỗi Apache của bạn để biết thêm chi tiết.
  • Kích hoạt tính năng trong của bạn php.initất cả các loại lỗi ( display_error, error_reporting, vv).

1
Đó là vấn đề của tôi .. thư mục mẹ không có quyền thực thi ... nó hoạt động ngay bây giờ! Cảm ơn bạn! :)
Robin Presto

Vẫn không có may mắn cho tôi :( Có đề xuất nào không? `` `[Root @ kiwi tmp] # ls -ld /; ls -ld / tmp; ls -ld / tmp / ngủ; grep '^ include_path = \ | ^ safe_mode =' /etc/php.ini dr-xr-xr-x. 27 root root 4096 3 tháng 3 12:31 / drwxrwxrwt. 4 root 4096 3 tháng 3 15:45 / tmp -rwxr-xr-x. 1 root 24 tháng 3 15:39 / tmp / ngủ safe_mode = Off include_path = "/ tmp: / home / kiwi_build" `` `
pihentagy

1
Argh, setenforce đã giải quyết nó. OMG
pieaveragy

13

Một vấn đề như vậy có thể phụ thuộc vào hệ điều hành bạn sử dụng và cách nó được cấu hình. Một số bản phân phối linux (chủ yếu là các bản phát hành dựa trên RHEL như CentOS hoặc Fedora) đi kèm với SELinux được kích hoạt theo mặc định. Điều này có thể được kiểm tra và thay đổi tạm thời, với các lệnh sau:

root@ls:~# /usr/sbin/getenforce 
Enforcing
root@ls:~# /usr/sbin/setenforce Permissive
root@ls:~# /usr/sbin/getenforce 
Permissive

Bạn cũng có thể có một cái nhìn đầy đủ hơn về cấu hình hiện tại với:

root@ls:~# /usr/sbin/sestatus 
SELinux status:                 enabled
SELinuxfs mount:                /selinux
Current mode:                   permissive
Mode from config file:          enforcing
Policy version:                 21
Policy from config file:        targeted

Thay đổi này có thể được thực hiện vĩnh viễn bằng cách chỉnh sửa /etc/selinux/configtệp và đặt SELINUXbiến thành permissivehoặc disabled.

Nhưng, cách chính xác để giải quyết loại vấn đề này , nếu bạn thực sự trong tình huống này, là kiểm tra /var/log/audit/audit.logtệp nhật ký. Nó sẽ chứa tất cả các sự kiện liên quan đến quy tắc SELinux. Sau đó, có lẽ bạn sẽ cung cấp cho tập lệnh của mình ngữ cảnh chính xác, tức là được ủy quyền để được chạy bởi người dùng apache / php. Kiểm tra bối cảnh bảo mật SELinux được thực hiện với ls -Z:

root@ls:~# ls -alZ /var/www/cgi-bin/
drwxr-xr-x  root root system_u:object_r:httpd_sys_script_exec_t .
drwxr-xr-x  root root system_u:object_r:httpd_sys_content_t ..

Danh sách này liệt kê Người dùng, Vai trò và Loại của từng tệp / thư mục. Ở đây httpd_sys_script_exec_tkiểu này cung cấp cho các tệp trong thư mục cgi quyền được thực thi bởi httpd. Kịch bản shell của bạn có thể phải có cùng loại.

Bạn cũng có thể cung cấp các audit.logdòng cho audit2allowlệnh. Nó sẽ cung cấp cho bạn những thay đổi cần thiết để làm cho Selinux hài lòng. Nhưng thông thường, những thay đổi được đề xuất cần phải được thực hiện trên chính sách SELinux, đây không phải là điều bạn nên làm trong trường hợp của mình (tuy nhiên, đầu ra này có thể đưa ra một số manh mối về những gì đang diễn ra).

Trang sau đây mô tả một vấn đề tương tự và các cách khác nhau để giải quyết nó: http://sheltren.com/stop-diseac-selinux


Cảm ơn bạn đã trả lời chi tiết! Than ôi, như tôi đã đề cập, tôi không thể truy cập root cho đến ngày mai. Vì vậy, tôi sẽ trở lại với bạn quá! :) Và vâng, tôi đang sử dụng CentOS.
Robin Presto

Tôi yêu câu trả lời của bạn, rất nhiều thông tin! Thật không may, tôi đã không chọn bạn vì việc thi hành bị vô hiệu hóa và không phải là vấn đề. Mặc dù tôi đã học được rất nhiều từ câu trả lời của bạn, vì vậy cảm ơn bạn. Tôi sẽ bình chọn cho bạn khi tôi có đủ danh tiếng :)
Robin Presto

Không phải lo lắng, vui mừng khi biết bạn học được từ bài viết của tôi!
Tonin

Nếu getenforced là vấn đề, thì thực sự không rõ chuyện quái gì đang diễn ra. Nó đã cứu ngày của tôi!
piropagy

1

Vì vậy, tôi đã đến đây sau khi tìm kiếm một vấn đề tương tự trên Google. Tôi nghĩ rằng nên bỏ đi những bình luận về SELinux đã chỉ cho tôi đi đúng hướng.

Trong trường hợp của riêng tôi, tôi đã sử dụng tập lệnh triển khai Git tùy chỉnh sử dụng lệnh shell. Lệnh hoạt động tốt trên BASH nhưng sau đó có "quyền bị từ chối" và "không phải là kho lưu trữ" trên Git. Điều này thực sự kỳ lạ và tôi đã trải qua nhiều lần sửa chữa cho đến khi tôi vấp phải câu trả lời này.

root@ls:~# /usr/sbin/setenforce Permissive giải quyết vấn đề cho tôi


0

Hoàn cảnh của tôi hơi khác một chút, nhưng Google đã đưa tôi đến đây, vì vậy tôi nghĩ tôi muốn chia sẻ ...

Máy chủ của tôi đang chạy debian ổn định và cố gắng thực thi tập lệnh shell hoạt động một lần sau đó các quyền tự động thay đổi thành 644 và lần thử tiếp theo để chạy tập lệnh đã nhận được Permission denied. Nó hóa ra là một vấn đề máy chủ samba đối với tôi và tôi đã không nhận thấy mô hình cho đến bây giờ.

Quyền QA Strange thay đổi khi lưu tệp trên phân vùng Samba từ trình chỉnh sửa Windows là cách khắc phục. Tôi không biết về map archive = notùy chọn này ngay cả sau khi sử dụng cổ phiếu samba trong một thập kỷ.

Đôi điều về việc sử dụng Notepad ++ trên máy tính để bàn Windows sẽ thay đổi quyền của tệp mục tiêu thành 675 thay vì 775 khi ô được thiết lập.


-7

Chạy các lệnh gốc trong PHP thông qua Apache

Tôi có một ứng dụng web cần thực hiện các lệnh shell với quyền root trong hàm PHP và bạn sẽ nghĩ rằng nó sẽ khá đơn giản về phía trước nhưng tôi đã mất một vài googles để có được tất cả các chi tiết, vì vậy đây là những ghi chú tiện dụng của tôi về nó Đây là trên một hệ thống Linux chạy Apache và chúng tôi sẽ sử dụng chế độ ăn liền trong bộ vỏ shell_exec, để chạy các lệnh.

Điều chính là để chỉnh sửa tập tin / etc / sudoers và thông thường bạn có thể (với quyền root) sử dụng lệnh vis visudo ốp để làm như vậy.

Đảm bảo apache có thể chạy các lệnh và KHÔNG yêu cầu mật khẩu:

apache  ALL=(ALL)       NOPASSWD: ALL

Sau đó, bạn cần bình luận ra dòng này:

#Defaults    requiretty

Nếu bạn không, thì bạn sẽ thấy những lỗi này trong / var / log / safe: Xin lỗi, bạn phải có một tty để chạy sudo Hồi. Bây giờ bạn đã sẵn sàng để đi và mã PHP rất đơn giản:

$ results = shell_exec ('ngày sudo');


5
Đây là một ý tưởng khủng khiếp . Nếu cài đặt apache của bạn bị xâm phạm hoặc ứng dụng bạn đang chạy ... hacker của bạn có thể truy cập đầy đủ vào hệ thống quá dễ dàng. Điều đúng đắn là thay đổi quyền trên kịch bản, không để mọi thứ rộng mở
Journeyman Geek

2
Tôi cảm thấy bắt buộc phải đưa ra một downvote cho câu trả lời này do những lo ngại về bảo mật rõ ràng với việc cung cấp cho người dùng apache / vai trò tất cả các quyền.
Ramhound

@JTHERmanGeek Không phải là "nếu", đó là khi cài đặt bị xâm phạm.
Michael Hampton
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.