PHP – System Calls

Thư viện các hàm tích hợp sẵn của PHP bao gồm một danh mục các hàm liên quan đến việc gọi các tiện ích của hệ điều hành và các chương trình bên ngoài từ bên trong mã PHP. Trong chương này, chúng ta sẽ thảo luận về các hàm PHP được sử dụng để thực hiện các cuộc gọi hệ thống.

The system() Function

Hàm system() trong PHP tương tự như hàm system() trong C, vì nó thực thi lệnh đã cho và xuất kết quả.

system(string $command, int &$result_code = null): string|false

Lệnh system() cố gắng tự động xóa bộ đệm đầu ra của máy chủ web sau mỗi dòng đầu ra nếu PHP đang chạy dưới dạng một mô-đun máy chủ. Nó trả về dòng cuối cùng của đầu ra lệnh khi thành công và false khi thất bại.

Example

Đoạn mã PHP sau đây gọi lệnh DIR của hệ điều hành Windows và hiển thị danh sách các tệp trong thư mục hiện tại.

<?php
   echo '<pre>';

   // Outputs all the result of DOS command "dir", and returns
   // the last output line into $last_line. Stores the return value
   // of the shell command in $retval.
   $last_line = system('dir/w', $retval);

   // Printing additional info
   echo '
   </pre>
   <hr />Last line of the output: ' . $last_line . '
   <hr />Return value: ' . $retval;
?>

Nó sẽ tạo ra output

Volume in drive C has no label.
Volume Serial Number is 7EE4-E492

Directory of C:\xampp\htdocs
[.]                 [..]                applications.html   bitnami.css
[dashboard]         employee.csv        favicon.ico         hello.csv
hello.html          hello.php           homepage.php        [img]
index.php           [Langi]             menu.php            myform.php
myname.php          new.png             new.txt             test.php
test.zip            [TPcodes]           uploadfile.php      [webalizer]
welcome.png         [xampp]             
                 18 File(s)          123,694 bytes
                 8 Dir(s)            168,514,232,320 bytes free

Last line of the output: 8 Dir(s) 168,514,232,320 bytes free
Return value: 0

The shell_exec() Function

Hàm shell_exec() giống như toán tử dấu nháy đơn của PHP. Nó thực thi lệnh đã cho qua shell và trả về toàn bộ đầu ra dưới dạng một chuỗi.

shell_exec(string $command): string|false|null

Hàm này trả về một chuỗi chứa đầu ra từ lệnh đã thực thi, false nếu không thể thiết lập ống dẫn hoặc null nếu xảy ra lỗi hoặc lệnh không tạo ra đầu ra.

Example

Trong đoạn mã sau, chúng ta sử dụng hàm shell_exec() để lấy danh sách các tệp có đuôi ".php" trong thư mục hiện tại −

<?php
   $output = shell_exec('dir *.php');
   echo "<pre>$output</pre>";
?>

Nó sẽ tạo ra output

Volume in drive C has no label.
Volume Serial Number is 7EE4-E492

Directory of C:\xampp\htdocs

10/26/2023  08:27 PM                73 hello.php
10/12/2023  10:40 AM                61 homepage.php
07/16/2015  09:02 PM               260 index.php
10/12/2023  10:39 AM                49 menu.php
09/25/2023  01:43 PM               338 myform.php
10/12/2023  10:49 AM                51 myname.php
10/26/2023  02:00 PM               369 test.php
09/25/2023  01:42 PM               555 uploadfile.php
               8 File(s)          1,756 bytes
               0 Dir(s)           168,517,771,264 bytes free

The exec() Function

Hàm exec() thực thi lệnh đã cho dưới dạng đối số chuỗi.

exec(string $command, array &$output = null, 
   int &$result_code = null):string|false

Tham số $output , nếu được chỉ định, là một mảng sẽ được điền với mọi dòng đầu ra từ lệnh.

Example

Trong trường hợp này, chúng ta sử dụng hàm exec() để gọi lệnh whoami từ bên trong chương trình. Lệnh whoami trả về tên người dùng.

<?php

   // outputs the username that owns the running php/httpd process
   // (on a system with the "whoami" executable in the path)
   $output=null;
   $retval=null;
   exec('whoami', $output, $retval);
   echo "Returned with status $retval and output:\n";
   var_dump($output);
   
?>

Nó sẽ tạo ra output

Returned with status 0 and output: array(1) 
{ [0]=> string(13) "gnvbgl3\mlath" }

The passthru() Function

Hàm passthru() thực thi một chương trình bên ngoài và hiển thị đầu ra thô. Mặc dù hàm passthru() tương tự như hàm exec() hoặc system() ở chỗ nó thực thi một lệnh, nhưng nó nên được sử dụng thay cho chúng khi đầu ra từ lệnh hệ điều hành là dữ liệu nhị phân cần được chuyển trực tiếp trở lại trình duyệt.

Example

Một chương trình PHP sử dụng hàm `passthru()` để hiển thị nội dung của biến môi trường PATH trong hệ thống có thể được viết như sau: ```php ``` Chương trình này sẽ gọi lệnh `echo $PATH` thông qua hàm `passthru()`, và kết quả sẽ được hiển thị trực tiếp trên trình duyệt hoặc cửa sổ dòng lệnh.

passthru(string $command, int &$result_code = null): ?false
<?php
   passthru ('PATH');
?>

Nó sẽ tạo ra output

PATH=C:\Python311\Scripts\;C:\Python311\;C:\WINDOWS\system32;C:\WINDOWS;
C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;
C:\WINDOWS\System32\OpenSSH\;C:\xampp\php;C:\Users\mlath\AppData\Local
\Microsoft\WindowsApps;C:\VSCode\Microsoft VS Code\bin

Backtick Operator

PHP hỗ trợ một toán tử thực thi: dấu ngoặc đơn ngược (``). (chúng không phải là dấu nháy đơn!) PHP sẽ cố gắng thực thi nội dung của dấu ngoặc đơn ngược như một lệnh shell; đầu ra sẽ được trả về. Việc sử dụng toán tử dấu ngoặc đơn ngược giống như shell_exec().

Example

Hãy xem xét ví dụ sau đây −

<?php
   $output = `dir *.php`;
   echo "<pre>$output</pre>";
?>

Nó sẽ tạo ra output

Volume in drive C has no label.
Volume Serial Number is 7EE4-E492

Directory of C:\xampp\htdocs

10/26/2023  08:42 PM                61 hello.php
10/12/2023  10:40 AM                61 homepage.php
07/16/2015  09:02 PM               260 index.php
10/12/2023  10:39 AM                49 menu.php
09/25/2023  01:43 PM               338 myform.php
10/12/2023  10:49 AM                51 myname.php
10/26/2023  02:00 PM               369 test.php
09/25/2023  01:42 PM               555 uploadfile.php
               8 File(s)          1,744 bytes
               0 Dir(s)           168,471,289,856 bytes free

Toán tử backtick bị vô hiệu hóa khi shell_exec() bị vô hiệu hóa.