首页>>后端>>php->phpputenv执行系统命令?

phpputenv执行系统命令?

时间:2023-12-07 本站 点击:0

php eval怎样执行系统命令?

eval — 把字符串作为PHP代码执行

说明

mixedeval( string $code_str )

把字符串code_str作为PHP代码执行。 除了其他,该函数能够执行储存于数据库文本字段内的PHP代码。

使用eval()时需注意几个因素:注意字符必须是有效的PHP代码,包括结尾的分号,以不至于解释器在eval()之后退出。并且正确地转义code_str中的东西。你可以使用一个PHP闭合标签来混合输出HTML和PHP代码。

同时需注意eval中的变量会被保留在之后的主脚本中。

参数

code_str需要被执行的字符串code_str不能包含 PHP Opening tags。

return语句会立即中止当前字符串的执行。

返回值

eval()返回NULL,除非在执行的代码中return了一个值,函数返回该值。 如果在执行的代码中有一个解析错误,eval()返回FALSE,之后的代码将正常执行。无法使用 set_error_handler() 捕获eval()中的解析错误。

范例

Example #1eval()例子 - 简单的文本合并

?php

$string = 'cup';

$name = 'coffee';

$str = 'This is a $string with my $name in it.';

echo $str. "\n";

eval("\$str = \"$str\";");

echo $str. "\n";

?

以上例程会输出:

This is a $string with my $name in it.This is a cup with my coffee in it.

Note: 因为是一个语言构造器而不是一个函数,不能被 可变函数 调用。

Tip和直接将结果输出到浏览器一样,可使用输出控制函数来捕获当前函数的输出,然后(例如)保存到一个 string 中。

Note:

如果在执行的代码中产生了一个致命的错误(fatal error),整个脚本会退出。

Linux 中

shell中的eval命令将会首先扫描命令行进行所有的替换,然后再执行命令。该命令使用于那些一次扫描无法实现其功能的变量。该命令对变量进行两次扫描。这些需要进行两次扫描的变量有时候被称为复杂变量。

例如

$:cat ext

count=3

cmd=echo

cmd="$cmd \$$count"

ext 11 22 33

此时cmd=" echo $3"

eval $cmd 等价于 "echo 33 "

php putenv() 问题

我也碰到同样的问题了,  最终也是按照不适用putenv(),直接将路径写入$font  = 'C:\Windows\Fonts\DejaVuSansMono.ttf';最后才解决的问题。查了下手册,应该是safe_mode_protected_env_vars设置问题(但是我查了下自己的php.ini没有找到safe_mode_protected_env_vars。我用的是wampserver:PHP5.5.12)。不知道您解决没有?知道的话,麻烦答复一下。

网页链接

putenv

(PHP 4, PHP 5, PHP 7)

putenv — 设置环境变量的值

说明

putenv

   ( string $setting

  ) : bool

添加 setting 到服务器环境变量。

  环境变量仅存活于当前请求期间。

  在请求结束时环境会恢复到初始状态。

设置特定的环境变量也有可能是一个潜在的安全漏洞。   safe_mode_allowed_env_vars 包含了一个以逗号分隔的前缀列表。

  在安全模式下,用户可以仅能修改用该指令设定的前缀名称的指令。

  默认情况下,用户仅能够修改以 PHP_ 开头的环境变量(例如 PHP_FOO=BAR)。

  注意:如果此指令是空的,PHP允许用户设定任意环境变量!

safe_mode_protected_env_vars 指令包含了逗号分隔的环境变量列表,使用户最终无法通过 putenv() 修改。

  即使 safe_mode_allowed_env_vars 设置允许修改,这些变量也会被保护。

PHP怎么调用Linux命令终端

首先先要给大家介绍PHP执行linux系统命令的几个基本函数。

system函数

说明:执行外部程序并显示输出资料。

语法:string system(string command, int [return_var]);

返回值: 字符串

详细介绍:

本函数就像是 C 语中的函数 system(),用来执行指令,并输出结果。若是 return_var 参数存在,则执行 command 之后的状态会填入 return_var 中。同样值得注意的是若需要处理用户输入的资料,而又要防止用户耍花招破解系统,则可以使用 EscapeShellCmd()。若 PHP 以模块式的执行,本函数会在每一行输出后自动更新 Web 服务器的输出缓冲暂存区。若需要完整的返回字符串,且不想经过不必要的其它中间的输出界面,可以使用 PassThru()。

实例代码:

?php

$last_line = system('ls', $retval);

echo 'Last line of the output: ' . $last_line;

echo 'hr/Return value: ' . $retval;

?  

exec函数

说明:执行外部程序。

语法:string exec(string command, string [array], int [return_var]);

返回值: 字符串

详细介绍:

本函数执行输入 command 的外部程序或外部指令。它的返回字符串只是外部程序执行后返回的最后一行;若需要完整的返回字符串,可以使用 PassThru() 这个函数。

要是参数 array 存在,command 会将 array 加到参数中执行,若不欲 array 被处理,可以在执行 exec() 之前呼叫 unset()。若是 return_var 跟 array 二个参数都存在,则执行 command 之后的状态会填入 return_var 中。

值得注意的是若需要处理使用者输入的资料,而又要防止使用者耍花招破解系统,则可以使用 EscapeShellCmd()。

实例代码:

?php

echo exec('whoami');

?  

popen函数

说明:打开文件。

语法:int popen(string command, string mode);

返回值: 整数

详细介绍:

本函数执行指令开档,而该文件是用管道方式处理的文件。用本函数打开的文件只能是单向的 (只能读或只能写),而且一定要用 pclose() 关闭。在文件操作上可使用 fgets()、fgetss() 与 fputs()。若是开档发生错误,返回 false 值。

实例代码:

?

$fp = popen( "/bin/ls", "r" );

?  

通过上述函数,PHP可以执行linux系统的shell命令。

菜鸟求助:PHP中调用系统命令为何有些命令总是失败

PHP执行系统命令(简介及方法)

在PHP中调用外部命令,可以用如下三种方法来实现:

方法一:用PHP提供的专门函数(四个):

PHP提供4个专门的执行外部命令的函数:exec(), system(), passthru(), shell_exec()

1)exec()

原型: string exec ( string $command [, array $output [, int $return_var ]] )

说明: exec执行系统外部命令时不会输出结果,而是返回结果的最后一行。如果想得到结果,可以使用第二个参数,让其输出到指定的数组。此数组一个记录代表输出的一行。即如果输出结果有20行,则这个数组就有20条记录,所以如果需要反复输出调用不同系统外部命令的结果,最好在输出每一条系统外部命令结果时清空这个数组unset($output),以防混乱。第三个参数用来取得命令执行的状态码,通常执行成功都是返回0。

?php

exec("dir",$output);

print_r($output);

?

2)system()

原型: string system ( string $command [, int $return_var ] )

说明: system和exec的区别在于,system在执行系统外部命令时,直接将结果输出到游览器,如果执行命令成功则返回true,否则返回false。第二个参数与exec第三个参数含义一样。

?php

system("pwd");

?

3)passthru()

原型: void passthru ( string $command [, int $return_var ] )

说明: passthru与system的区别,passthru直接将结果输出到游览器,不返回任何值,且其可以输出二进制,比如图像数据。第二个参数可选,是状态码。

?php

header("Content-type:image/gif");

passthru("/usr/bin/ppm2tiff /usr/share/tk8.4/demos/images/teapot.ppm");

?

4)shell_exec()

原型: string shell_exec ( string $cmd )

说明: 直接执行命令$cmd

?php

$output = shell_exec('ls -lart');

echo "pre$output/pre";

?

方法二:反撇号

原型: 反撇号`(和~在同一个键)执行系统外部命令

说明: 在使用这种方法执行系统外部命令时,要确保shell_exec函数可用,否则是无法使用这种反撇号执行系统外部命令的。

?php

echo `dir`;

?

方法三:用popen()函数打开进程

原型: resource popen ( string $command , string $mode )

说明: 能够和命令进行交互。之前介绍的方法只能简单地执行命令,却不能与命令交互。有时须向命令输入一些东西,如在增加系统用户时,要调用su来把当前用户换到root用户,而su命令必须要在命令行上输入root的密码。这种情况下,用之前提到的方法显然是不行的。

popen( )函数打开一个进程管道来执行给定的命令,返回一个文件句柄,可以对它读和写。返回值和fopen()函数一样,返回一个文件指针。除非使用的是单一的模式打开(读or写),否则必须使用pclose()函数关闭。该指针可以被fgets(),fgetss(),fwrite()调用。出错时,返回FALSE。

?php

error_reporting(E_ALL);

/* Add redirection so we can get stderr. */

$handle = popen('/path/to/executable 21', 'r');

echo "'$handle'; " . gettype($handle) . "\n";

$read = fread($handle, 2096);

echo $read;

pclose($handle);

?

要考虑两个问题:安全性和超时

1)安全性

由于PHP基本是用于WEB程序开发的,所以安全性成了人们考虑的一个重要方面 。于是PHP的设计者们给PHP加了一个门:安全模式。如果运行在安全模式下,那么PHP脚本中将受 到如下四个方面的限制:

执行外部命令

在打开文件时有些限制

连接MySQL数据库

基于HTTP的认证

在安全模式下,只有在特定目录中的外部程序才可以被执行,对其它程序的调用将被拒绝。这个目录可以在PhP.ini 文件中用safe_mode_exec_dir指令,或在编译PHP是加上--with-exec-dir选项来指定。

当你使用这些函数来执行系统命令时,可以使用escapeshellcmd()和escapeshellarg()函数阻止用户恶意在系统上执行命令,escapeshellcmd()针对的是执行的系统命令,而escapeshellarg()针对的是执行系统命令的参数。这两个参数有点类似addslashes()的功能。

2)超时

当执行命令的返回结果非常庞大时,可以需要考虑将返回结果输出至其他文件,再另行读取文件,这样可以显著提高程序执行的效率。

如果要执行的命令要花费很长的时间,那么应该把这个命令放到系统的后台去运行。但在默认情况下,象system()等函数要等到这个命令运行完才返回(实际上是在等命令的输出结果),这肯定会引起PHP脚本的超时。解决的办法是把命令的输出重定向到另外一个文件或流中,如:

?php

system("/usr/local/bin/order_proc /tmp/abc ");

?

但我调用的DOS命令需要几分钟的时间,而且为了批处理不能简单的把结果写入文件了事,要顺序执行以下的程序

PHP设置了调用系统命令的时间限制,如果调用命令超时,虽然这个命令还是会被执行完,但PHP没有得到返回值,被终止了(最可恨的是,不显示任何错误)

修改php.ini并重启Apache以允许系统命令运行更长的时间

max_execution_time = 600

我的程序是后台运行的,逻辑OK就成了

怎么用php命令执行php代码

PHP执行命令的四种方法

方法一:使用exec函数执行系统外部命令

原型:function exec(string $command,array[optional] $output,int[optional]

$return_value) 

?

    exec("dir",$outPut);

   

print_r($outPut);

?

说明:列出和PHP执行文件同级目录下的所有目录及文件信息。

知识点:exec执行系统外部命令时不会输出结果,而是返回结果的最后一行,如果你想得到结果你可以使用第二个参数,让其输出到指定的数组,此数组一个记录代表输出的一行,即如果输出结果有20行,则这个数组就有20条记录,所以如果你需要反复输出调用不同系统外部命令的结果,你最好在输出每一条系统外部命令结果时清空这个数组,以防混乱。第三个参数用来取得命令执行的状态码,通常执行成功都是返回0。

方法二:使用system函数执行系统外部命令

原型:function system(string $command,int[optional] $return_value)

1

2

3

?

    system("dir");

?

知识点:system和exec的区别在于system在执行系统外部命令时,直接将结果输出到游览器,如果执行命令成功则返回true,否则返回false。第二个参数与exec第三个参数含义一样。

方法三:使用函数passthru执行系统外部命令

原型:function passthru(string $command,int[optional] $return_value)

知识点:passthru与system的区别,passthru直接将结果输出到游览器,不返回任何值,且其可以输出二进制,比如图像数据。

方法四:反撇号`(和~在同一个键)执行系统外部命令

1

2

3

?

    echo `dir`;

?

知识点:在使用这种方法执行系统外部命令时,你要确保shell_exec函数可用,否则是无法使用这种反撇号执行系统外部命令的。

如何通过PHP执行linux命令

你想问得是php如何执行shell命令把?\x0d\x0a\x0d\x0a可以用system(),exec(),passthru()这三个函数实现\x0d\x0a虽然这三个命令都能执行linux系统的shell命令,但是其实他们是有区别的:\x0d\x0a system() 输出并返回最后一行shell结果。\x0d\x0a exec() 不输出结果,返回最后一行shell结果,所有结果可以保存到一个返回的数组里面。\x0d\x0a passthru() 只调用命令,把命令的运行结果原样地直接输出到标准输出设备上。\x0d\x0a 相同点:都可以获得命令执行的状态码\x0d\x0a例子:system("ls -al");\x0d\x0a【使用之前要在php.ini中把safe_mode关闭】


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:/php/17889.html