Làm thế nào để sử dụng exec() PHP?

Mặc dù PHP là một ngôn ngữ mạnh mẽ với nhiều tiện ích mở rộng có sẵn để xử lý các thư viện chuyên dụng, nhưng bạn có thể thấy hữu ích khi có thể chạy các chương trình bên ngoài khi cần thiết, đặc biệt nếu bạn chạy Unix nơi HĐH đi kèm với nhiều chương trình cài sẵn hơn

Trong PHP có hai phương thức quan trọng để thực thi chương trình, đó là exec[] và passthru[]. Cả hai tham số này đều nhận tối thiểu một tham số, đó là tên của chương trình bạn muốn chạy, nhưng điểm khác biệt giữa chúng là hàm exec[] chạy chương trình sau đó gửi lại dòng cuối cùng được xuất ra từ chương trình đó làm giá trị trả về của nó. Mặt khác, hàm passthru[] chạy chương trình được chỉ định và in ra tất cả đầu ra mà chương trình tạo ra. Gọi exec[] thường được ưu tiên khi đầu ra của chương trình của bạn không liên quan, trong khi passthru[] tự động in đầu ra của bạn. Đây là cả hai trong hành động


Cả hai lệnh này đều có sẵn trên các hộp Unix tiêu chuẩn. Lưu ý rằng do thời gian hoạt động thường chỉ trả về một dòng, nên việc sử dụng print exec[] hay passthru[] không thành vấn đề

Nếu bạn chuyển tham số thứ hai và thứ ba cho exec[], đầu ra của lệnh sẽ được đưa vào tham số hai dưới dạng một mảng với một dòng cho mỗi phần tử và giá trị trả về của lệnh sẽ được đưa vào tham số ba. Tương tự, nếu bạn truyền tham số thứ hai cho passthru[] thì tham số đó sẽ chứa đầy giá trị trả về của lệnh

Ví dụ


Ví dụ đó sẽ hoạt động tốt trên Windows cũng như nhiều phiên bản Unix

Lưu ý của tác giả. Nếu máy chủ của bạn là hộp Unix, hãy thử sử dụng passthru["fortune"] để nhận hệ thống báo giá ngẫu nhiên nhanh chóng và dễ dàng ở cuối trang của bạn. Lưu ý rằng fortune có thể không được cài đặt hoặc không có sẵn cho tập lệnh PHP của bạn - hãy liên hệ với quản trị viên hệ thống của bạn để tìm hiểu

Có sẵn các hàm thực thi khác, đáng chú ý là shell_exec[] và system[], tuy nhiên chúng hầu như không liên quan - ví dụ: shell_exec[] hoạt động giống hệt như toán tử backtick mà chúng ta đã xem xét trước đó

Lưu ý của tác giả. Lấy đầu vào của người dùng và chuyển nó đến một trong các chức năng thực thi chương trình này có khả năng gây tử vong - người dùng có thể dễ dàng bỏ qua bảo mật và làm những điều xấu với máy chủ của bạn. Nếu bạn thực sự phải sử dụng dữ liệu người dùng làm đầu vào cho lệnh gọi chương trình của mình, trước tiên hãy chuyển dữ liệu đó qua hàm escapeshellcmd[] đặc biệt - hàm này nhận dữ liệu đầu vào của bạn và trả về ở định dạng an toàn có thể sử dụng được

Cho đến giờ chúng ta đã xem xét việc thực thi các chương trình bên ngoài bằng exec[] và system[], nhưng có một chức năng thứ ba cũng cho phép bạn thực thi bên ngoài, mặc dù nó hoạt động hoàn toàn khác với hai chức năng kia. Hàm virtual[] chỉ nhận một tham số và, bất thường, chỉ hoạt động trên máy chủ web Apache và SunONE. Không giống như exec[] và system[], virtual[] thực hiện một yêu cầu ảo tới máy chủ web cho một tệp, gần như thể chính tập lệnh của bạn là một ứng dụng khách. Yêu cầu này được xử lý như bình thường và đầu ra của nó được gửi lại cho tập lệnh của bạn

Ví dụ: sử dụng phương pháp này, bạn có thể thực thi tập lệnh Perl từ tập lệnh PHP của mình hoặc thực sự kỳ lạ là thực thi tập lệnh PHP khác từ tập lệnh PHP của bạn. Thoạt đầu, việc sử dụng virtual[] có vẻ không rõ ràng, đơn giản vì chúng rất ít và cách xa nhau. Tuy nhiên, nếu bạn có một trang trên trang web của mình yêu cầu thực thi đặc biệt, thì bạn phải sử dụng exec[], chuyển vào tên của chương trình xử lý trang cũng như chính tên tệp của trang, bạn có thể sử dụng include[]

Bạn muốn học PHP 7?

Hacking with PHP đã được cập nhật đầy đủ cho PHP 7 và hiện có sẵn dưới dạng PDF có thể tải xuống. Nhận hơn 1200 trang học PHP thực hành ngay hôm nay

Nếu điều này hữu ích, vui lòng dành chút thời gian để nói với những người khác về Hacking với PHP bằng cách tweet về nó

Tập lệnh PHP chủ yếu được sử dụng để phát triển các ứng dụng web nhưng nó cũng có thể được sử dụng cho các mục đích khác. PHP có một số chức năng tích hợp để thực thi các lệnh liên quan đến hệ thống. exec[] là một trong số đó. Nó được sử dụng để thực thi các lệnh shell hoặc bất kỳ chương trình nào từ tập lệnh PHP. Làm thế nào chức năng này có thể được sử dụng trong PHP được hiển thị trong hướng dẫn này

cú pháp

chuỗi exec [ chuỗi $command [, array &$output [, int &$return_var ]] ]

Hàm này có thể nhận ba đối số. Đối số đầu tiên là bắt buộc sẽ nhận lệnh hệ thống. Hai đối số khác là tùy chọn. Đối số thứ hai được sử dụng để lưu trữ đầu ra của lệnh trong một mảng. Đối số thứ ba của hàm này được sử dụng để lưu trữ trạng thái trả về của lệnh đã thực hiện. Hàm này trả về dòng cuối cùng từ đầu ra lệnh đã thực hiện

Ví dụ 1. Sử dụng hàm exec[] không có đối số tùy chọn

Cách sử dụng cơ bản của hàm exec[] đã được trình bày trong hướng dẫn này. Tạo một tệp PHP với tập lệnh sau để biết cách hàm exec[] trả về đầu ra lệnh. Lệnh ' pwd ' đã được sử dụng trong lệnh exec[] đầu tiên của tập lệnh trả về một dòng đầu ra. Lệnh ‘ls -la‘ đã được sử dụng trong lệnh exec[] thứ hai có thể trả về nhiều dòng kết quả. Nếu bất kỳ lệnh nào trả về nhiều dòng thì đầu ra sẽ hiển thị dòng cuối cùng là đầu ra

đầu ra

Đầu ra sau sẽ xuất hiện sau khi chạy tập lệnh trên từ máy chủ. Lệnh 'pwd' trả về thư mục làm việc hiện tại dưới dạng đầu ra được hiển thị trong đầu ra đầu tiên. Lệnh ‘ls -la‘ trả về thông tin chi tiết của danh sách các thư mục và đầu ra thứ hai hiển thị dòng cuối cùng từ đầu ra lệnh

Ví dụ-2. In tất cả các giá trị của lệnh đã thực hiện

Trong ví dụ trước, không có đối số tùy chọn nào được sử dụng trong hàm exec[]. Ví dụ sau đây cho thấy việc sử dụng các đối số tùy chọn của hàm exec[]. Tạo một tệp PHP với tập lệnh sau. Hai đối số tùy chọn của exec[] được sử dụng trong tập lệnh này. Lệnh ‘ls -l‘ được sử dụng trong đối số đầu tiên trả về danh sách các thư mục. $output biến được sử dụng ở đây để lưu trữ đầu ra của lệnh trong một mảng. Biến trạng thái $ được sử dụng để lưu trữ giá trị trạng thái trả về của lệnh đã thực hiện. Đầu ra của lệnh sẽ được in dưới dạng một mảng và mỗi giá trị của mảng đầu ra sẽ được in bằng cách sử dụng vòng lặp 'for'

Chủ Đề