首页 > 后端开发 > 正文

LINUX+NGINX下的PHP shell_exec()函数执行linux命令 08-08(菜鸟求助:PHP中调用系统命令为何有些命令总是失败)

2024-08-05 02:21:59 | 我爱编程网

今天我爱编程网小编为大家带来了LINUX+NGINX下的PHP shell_exec()函数执行linux命令 08-08(菜鸟求助:PHP中调用系统命令为何有些命令总是失败),希望能帮助到大家,一起来看看吧!

本文目录一览:

LINUX+NGINX下的PHP shell_exec()函数执行linux命令 08-08(菜鸟求助:PHP中调用系统命令为何有些命令总是失败)

LINUX+NGINX下的PHP shell_exec()函数执行linux命令 2019-08-08

LINUX+NGINX下的PHP shell_exec()函数执行linux命令

环境说明

手头有一台linux的测试服务器,最近因为业务需要,需要通过php访问另一台服务器去执行某些命令。

由于另一台服务器已经对这台服务器开了私钥,所以在终端上是可以直接执行命令而不需要输入密码的。

问题

PHP无法使用exec命令,没有任何返回值。

解决途径

1.php.ini的配置有问题。

由于php是7.0以上的版本,取消了安全模式,所以考虑PHP.ini文件配置。

打开php配置文件,里面有一行disabel_function的值,此处记录了禁止运行的函数,在里面讲exec和shell_exec,system等函数删除。

2.权限问题

修改以后PHP可以运行部分命令了,但是部分外部程序和命令仍然不能运行。使用sudo返回失败。

于是运行“whoami”查看,环境下php-frm的运行角色是www。

于是修改sudoers文件。

vi /etc/sudoers

将www添加到

## Allow root to run any commands anywhere

root ALL=(ALL) ALL

下面:

## Allow root to run any commands anywhere

root ALL=(ALL) ALL

www ALL=(ALL) NOPASSWD:ALL

然后找到Default requiretty这一行,把他注释掉

# Default requiretty

ps:意思就是sudo默认需要tty终端,注释掉就可以在后台执行了.

重启nginx和php-fpm

service nginx restart

service php-fpm restart

这样,PHP就可以在需要执行外部命令的时候使用sudo利用root身份执行命令,而不会报错或者执行失败了!

LINUX+NGINX下的PHP shell_exec()函数执行linux命令 08-08(菜鸟求助:PHP中调用系统命令为何有些命令总是失败)我爱编程网

菜鸟求助: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 2>&1', '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就成了

LINUX+NGINX下的PHP shell_exec()函数执行linux命令 08-08(菜鸟求助:PHP中调用系统命令为何有些命令总是失败)

php eval怎样执行系统命令?

我爱编程网(https://www.52biancheng.com)小编还为大家带来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 "

以上就是我爱编程网整理的LINUX+NGINX下的PHP shell_exec()函数执行linux命令 08-08(菜鸟求助:PHP中调用系统命令为何有些命令总是失败)相关内容,想要了解更多信息,敬请查阅我爱编程网。更多相关文章关注我爱编程网:www.52biancheng.com

免责声明:文章内容来自网络,如有侵权请及时联系删除。
与“LINUX+NGINX下的PHP shell_exec()函数执行linux命令 08-08(菜鸟求助:PHP中调用系统命令为何有些命令总是失败)”相关推荐
PHP执行linux系统命令 菜鸟求助:PHP中调用系统命令为何有些命令总是失败
PHP执行linux系统命令 菜鸟求助:PHP中调用系统命令为何有些命令总是失败

PHP执行linux系统命令首先先要给大家介绍PHP执行linux系统命令的几个基本函数我曾经很长一段时间都分不清下面几个函数的具体用法区别system函数说明执行外部程序并显示输出资料语法stringsystem(stringmandint[return_var]);返回值:字符串详细介绍本函数就像是C语中的函数system()用来执行指令并输出结果若是return_var参数存在则执行

2024-10-07 12:29:02
FileSystemPHP Filesystem 函数 菜鸟求助:PHP中调用系统命令为何有些命令总是失败
FileSystemPHP Filesystem 函数 菜鸟求助:PHP中调用系统命令为何有些命令总是失败

FileSystemPHPFilesystem函数以下是改写后的文章内容,以HTML标签片段形式呈现:PHP自早期版本开始就支持一系列文件系统操作函数,以下是其中一些关键函数的简介:basename():返回路径中的文件名部分。chgrp():改变文件组权限。chmod():修改文件的访问权限模式。chown():更改文件的

2025-01-02 08:03:53
php引用函数的使用方法 菜鸟求助:PHP中调用系统命令为何有些命令总是失败
php引用函数的使用方法 菜鸟求助:PHP中调用系统命令为何有些命令总是失败

php引用函数的使用方法在技术学习的道路上,能掌握一些有用的技巧,对于初学者是非常有帮助的,下面是php引用函数的使用方法,希望大家会喜欢。1.不要在你的应用程序中gzip输出,让apache来做考虑使用ob_gzhandler?不,别这样做。它没有任何意义。PHP应该是来写应用程序的。不要担心PHP中有关如何优化在服务器和浏览器之间传输的数据。使用apachemod

2024-11-20 10:56:35
PHP file_get_contents 函数超时的几种解决方法 菜鸟求助:PHP中调用系统命令为何有些命令总是失败
PHP file_get_contents 函数超时的几种解决方法 菜鸟求助:PHP中调用系统命令为何有些命令总是失败

PHPfile_get_contents函数超时的几种解决方法这里就简单介绍两种:一、增加超时的时间限制这里需要注意:set_time_limit只是设置你的PHP程序的超时时间,而不是file_get_contents函数读取URL的超时时间。我一开始以为set_time_limit也能影响到file_get_contents,后来经测试,是无效的。真正的修改file_get_

2024-08-16 13:46:06
php 调用include中的函数。结果显示未定义 菜鸟求助:PHP中调用系统命令为何有些命令总是失败
php 调用include中的函数。结果显示未定义 菜鸟求助:PHP中调用系统命令为何有些命令总是失败

html和php混编,发现无法使用phpFile函数(file_get_contents()和file()都不行)。咋整?在线求高手面对HTML和PHP混编时无法使用PHPFile函数(file_get_contents()和file())的情况,首先需要明确文件后缀名是否为`.php`。若使用的是HTML文件,将其更改为`.php`文件扩展名,以允许PHP代码执行解析。若文件后缀正确

2024-12-24 15:54:12
如何通过PHP执行linux命令
如何通过PHP执行linux命令

PHP中的常见风险函数PHP风险函数代码执行在PHP中,eval()函数能将字符串作为PHP代码执行,但其非标准函数且易被滥用,存在安全风险。进阶使用时,可以执行多条命令,如eval()嵌套eval()。特殊输入如结束命令?&gt;或使用ascii码或base64编码绕过过滤机制,实现潜在攻击。验证函数assert()assert()函数同样执行字符串作为PHP代码,但其为

2025-01-21 13:46:47
php中哪些函数不可以执行系统命令
php中哪些函数不可以执行系统命令

php中哪些函数不可以执行系统命令php中有2种函数是不可以执行系统命令的。根据查询相关公开信息显示,2种函数是assert,exception=0时,Warning:assert():assert(1==2)。Deprecated:assert():Callingassert()withastringargumentisdeprecated。php禁用函数删除后还是提示运行动态加载

2024-07-14 17:07:43
PHP执行linux系统命令(PHP-Filesystem函数简介文件系统操作-php实例教程)
PHP执行linux系统命令(PHP-Filesystem函数简介文件系统操作-php实例教程)

PHP执行linux系统命令首先先要给大家介绍PHP执行linux系统命令的几个基本函数我曾经很长一段时间都分不清下面几个函数的具体用法区别system函数说明执行外部程序并显示输出资料语法stringsystem(stringmandint[return_var]);返回值:字符串详细介绍本函数就像是C语中的函数system()用来执行指令并输出结果若是return_var参数存在则执行

2024-12-08 19:27:29