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

//Lưu trữ đầu ra của lệnh đã thực thi$output1=

//Store the output of the executed command

$output1 =  exec('pwd');

//Print the return value

echo $output1;

echo "
"
;

//Store the last line of the executed command

$output2 = exec('ls -la');

//Print the return value

echo $output2;

?>

đầ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

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

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'

//Lưu trữ đầu ra của lệnh đã thực thi trong một mảngexec(< . "
"
;}//In trạng thái trả về


//Store the output of the executed command in an array

exec('ls -l', $output, $status);


//Print all return values of the executed command as array

print_r($output);

echo "
"
;

//Print the output of the executed command in each line

foreach($output as $value)

{


        echo $value."
"
;

}

//Print the return status of the executed command

echo $status;

?>

đầu ra

Đầu ra sau sẽ xuất hiện sau khi chạy tập lệnh trên từ máy chủ. Đầu ra hiển thị mảng chứa đầu ra của lệnh, ‘ls -l’ và mỗi giá trị của mảng trong mỗi dòng

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

Ví dụ-3. In tất cả các tệp PHP của thư mục hiện tại

The following example shows the list of all PHP files of the current directory by using the exec() function. Here, the ‘ls -l *.php‘ command is used here to find out the list of all PHP files of the current directory.

 tag is used in the script to print the content of the array with the structured format.

//Lưu trữ đầu ra của lệnh đã thực thi trong một mảngexec(< . php',$đầu ra);

//Store the output of the executed command in an array

exec('ls -l *.php', $output);

//Print the output of the executed command

echo "

";

print_r($output);

echo "
";

?>

đầ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àm thế nào để sử dụng exec() PHP?

Ví dụ-4. Chạy tập lệnh bash

Làm thế nào bất kỳ tập lệnh bash nào có thể được thực thi bằng cách sử dụng hàm exec() đã hiển thị trong ví dụ này. Tạo một tệp bash có tên là vòng lặp. sh bằng tập lệnh sau sẽ in tất cả các số chẵn từ 1 đến 20

vòng. sh

#. /bin/bash

#Khởi tạo bộ đếm

bộ đếm =1

#Iterate the loop until the $counter value is less than or equal to 20

while [ $counter -le 20 ]

do

#Print the even numbers

if [[ $counter%2 -eq 0 ]]

then

#Print $counter without newline

echo  "$counter"

fi

#Increment $counter by 1

((counter++))

done

Tạo một tệp PHP với tập lệnh sau để chạy tập lệnh bash. 'vòng lặp bash. sh‘ được sử dụng làm đối số đầu tiên của hàm exec() sẽ thực thi vòng lặp. tập lệnh sh. Vòng lặp 'foreach' được sử dụng để in từng giá trị của $output có dấu cách

//Chạy tập lệnh bashexec(,$đầu ra);";//In dữ liệu đầu ra của chúng tôi bằng cách sử dụng vòng lặpforeach . "  ";}?>

//Run the bash script

exec('bash loop.sh', $output);


echo "All even numbers within 1-20 are:
"
;


//Print the ourput using loop

foreach($output as $value)

{


        echo $value."  ";

}

?>

đầu ra

Đầu ra sau sẽ xuất hiện sau khi chạy tập lệnh trên từ máy chủ. Đầu ra hiển thị tất cả các số chẵn trong khoảng từ 1 đến 20

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

Ví dụ-5. Chạy lệnh `dir` bằng hàm exec()

Lệnh ‘dir’ hoạt động giống như lệnh ‘ls’. Ví dụ sau đây cho thấy cách lệnh 'dir' có thể được thực thi bằng cách sử dụng tập lệnh PHP. Tạo một tệp PHP với tập lệnh sau lưu trữ đầu ra của lệnh 'dir' trong mảng có tên $output và giá trị trạng thái trong biến có tên $return. Hàm var_dump() được sử dụng ở đây để in cấu trúc của mảng $output với thông tin kiểu dữ liệu

    //Chạy lệnh `dir`   

    //Run `dir` command

    exec("dir", $output, $return);

    //Print the return status value

    echo "The return value of the `dir` command is $return\n";

    echo "

";

    //Print the command output

    var_dump($output);

    echo "
";

?>

đầ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àm thế nào để sử dụng exec() PHP?

Phần kết luận

Các cách sử dụng khác nhau của hàm exec() đã được giải thích trong hướng dẫn này để giúp các lập trình viên PHP biết cách thực thi lệnh shell bằng cách sử dụng tập lệnh PHP. Một số chức năng khác cũng tồn tại trong PHP để thực hiện cùng loại tác vụ

Làm cách nào để sử dụng hàm exec trong PHP?

Xem thêm ¶ .
system() - Thực thi một chương trình bên ngoài và hiển thị đầu ra
passthru() - Thực thi chương trình bên ngoài và hiển thị đầu ra thô
escapeshellcmd() - Siêu ký tự shell thoát
pcntl_exec() - Thực thi chương trình đã chỉ định trong không gian quy trình hiện tại
toán tử backtick

exec dùng để làm gì?

Lệnh exec là một công cụ mạnh mẽ để thao tác với bộ mô tả tệp (FD), tạo đầu ra và ghi nhật ký lỗi trong tập lệnh với ít thay đổi . Trong Linux, theo mặc định, bộ mô tả tệp 0 là stdin (đầu vào tiêu chuẩn), 1 là thiết bị xuất chuẩn (đầu ra tiêu chuẩn) và 2 là stderr (lỗi tiêu chuẩn).

Làm cách nào để sử dụng Shell_exec trong PHP?

hàm shell_exec(). Hàm shell_exec() là một hàm sẵn có trong PHP được sử dụng để thực thi các lệnh thông qua shell và trả về đầu ra hoàn chỉnh dưới dạng một chuỗi. Shell_exec là bí danh của toán tử backtick, dành cho những toán tử đã sử dụng *nix

Làm thế nào để sử dụng exec trong shell script?

Nếu có đối số, lệnh exec sẽ thay thế trình bao hiện tại bằng chương trình đã thực thi. Trong tập lệnh Bash, bất kỳ lệnh nào sau đó không được thực thi. . Linux exec Tùy chọn lệnh