php 执行shell命令行_php调用shell命令 - CSDN
精华内容
参与话题
  • 新建一个php文件(test.php) ...(1)在终端中执行php test.php,此时生成了test.pdf文件 (2)在web端输入链接访问test.php,发现此时test.pdf文件没有生成。这时可以有80%怀疑权限问题(且php并没有报错) (3)

    新建一个php文件(test.php)

    将下面的代码进行粘贴到新建的PHP文件中

    <?php

    shell_exec("unoconv -f pdf test.odt");

    ?>

    (1)在终端中执行php test.php,此时生成了test.pdf文件

    (2)在web端输入链接访问test.php,发现此时test.pdf文件没有生成。这时可以有80%怀疑权限问题(且php并没有报错)

    (3)进入test.php所在的目录,

    将下面的代码进行粘贴到test.php文件中

    <?php

    print_r(shell_exec("ls"));

    ?>

    在web端使用链接进行访问,发现可以运行的,这时有基本可以确定是权限的问题了

    (4)那么错误在什么地方可以看到呢,在终端下运行下面的命令

    find / -name auth.log

    比如 /var/log/auth.log

    (5)打开 auth.log找出问题所在可以发现报错为:www-data:user not in sudoers;............改怎么改呢

    (6)本人是在虚拟机中进行测试的,现在讲讲这个解决方法

    在终端下运行su root输入密码,这时你会发现不管你怎么输入密码均是错误的,那该怎么解决呢,不要急,听我慢慢讲来

    在终端下输入su passwd 这时会提醒你输入密码,随便输入一个密码如:123456,回车再次确认下密码;此时的root密码为123456了

    在终端下输入su root,输入刚刚设置的密码,你会发现你进入了root权限了,这时在终端下运行chmod u+w /etc/sudoers,

    在终端下输入vim /etc/sudoers,修改文件,将下面的话添加到文件中

    www-data ALL=(ALL) NOPASSWD: ALL;这边为啥是NOPASSWD:因为,你没有给www-data设置密码啊

    在终端下分别运行chmod u-w /etc/sudoers,exit

    (7)这时你再次在web使用链接运行test.php文件

    <?php

    shell_exec("unoconv -f pdf test.odt");

    ?>

    哈哈:文件出来了







    展开全文
  • PHP执行shell命令

    2016-05-10 13:36:44
    PHP作为一种服务器端的脚本语言,象编写简单,或者是复杂的动态网页这样 的任务,它完全能够胜任。但事情不总是如此,有时为了实现某个功能,必须借助于操作系统的外部程序(或者称之为命令),这样可以做到事半功倍...
    PHP作为一种服务器端的脚本语言,象编写简单,或者是复杂的动态网页这样 的任务,它完全能够胜任。但事情不总是如此,有时为了实现某个功能,必须借助于操作系统的外部程序(或者称之为命令),这样可以做到事半功倍。  那么, 是否可以在PHP脚本中调用外部命令呢?如果能,如何去做呢?有些什么方面的顾虑呢?相信你看了本文后,肯定能够回答这些问题了。
      是否可以?
      答案是肯定的。PHP和其它的程序设计语言一样,完全可以在程序内调用外部命令,并且是很简单的:只要用一个或几个函数即可。
      前提条件
      由于PHP基本是用于WEB程序开发的,所以安全性成了人们考虑的一个重要方面。于是PHP的设计者们给PHP加了一个门:安全模式。如果运行在安全模式下,那么PHP脚本中将受到如下四个方面的限制:
      执行外部命令
      在打开文件时有些限制
      连接MySQL数据库
      基于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()。
      system()
      原型:string system (string command [, int return_var])
      system()函数很其它语言中的差不多,它执行给定的命令,输出和返回结果。第二个参数是可选的,用来得到命令执行后的状态码。
      例子:
      
      system("/usr/local/bin/webalizer/webalizer");
      ?>
      exec()
      原型:string exec (string command [, string array [, int return_var]])
       exec()函数与system()类似,也执行给定的命令,但不输出结果,而是返回结果的最后一行。虽然它只返回命令结果的最后一行,但用第二个参数 array可以得到完整的结果,方法是把结果逐行追加到array的结尾处。所以如果array不是空的,在调用之前最好用unset()最它清掉。只有 指定了第二个参数时,才可以用第三个参数,用来取得命令执行的状态码。
      例子:
      
      exec("/bin/ls -l");
      exec("/bin/ls -l", $res);
      #$res是一个数据,每个元素代表结果的一行
      exec("/bin/ls -l", $res, $rc);
      #$rc的值是命令/bin/ls -l的状态码。成功的情况下通常是0
      ?>
      passthru()
      原型:void passthru (string command [, int return_var])
       passthru()只调用命令,不返回任何结果,但把命令的运行结果原样地直接输出到标准输出设备上。所以passthru()函数经常用来调用象 pbmplus(Unix下的一个处理图片的工具,输出二进制的原始图片的流)这样的程序。同样它也可以得到命令执行的状态码。
      例子:
      
      header("Content-type: image/gif");
      passthru("./ppmtogif hunte.ppm");
      ?>
      2) 用popen()函数打开进程
      上面的方法只能简单地执行命令,却不能与命令交互。但有些时候必须向命令输入一些东西,如在增加Linux的系统用户时,要调用su来把当前用户换到root才行,而su命令必须要在命令行上输入root的密码。这种情况下,用上面提到的方法显然是不行的。
       popen()函数打开一个进程管道来执行给定的命令,返回一个文件句柄。既然返回的是一个文件句柄,那么就可以对它读和写了。在PHP3中,对这种句 柄只能做单一的操作模式,要么写,要么读;从PHP4开始,可以同时读和写了。除非这个句柄是以一种模式(读或写)打开的,否则必须调用pclose() 函数来关闭它。
      例子1:
      
      $fp=popen("/bin/ls -l", "r");
      ?>
      例子2(本例来自PHP中国联盟网站http://www.phpx.com/show.php?d=col&i=51 ):
      
      /* PHP中如何增加一个系统用户
      下面是一段例程,增加一个名字为james的用户,
      root密码是 verygood。仅供参考
      */
      $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);
      ?>
      3)用反撇号(`,也就是键盘上ESC键下面的那个,和~在同一个上面)
      这个方法以前没有归入PHP的文档,是作为一个秘技存在的。方法很简单,用两个反撇号把要执行的命令括起来作为一个表达式,这个表达式的值就是命令执行的结果。如:
      
      $res=`/bin/ls -l`;
      echo '
    '.$res.'
    ';
      ?>
      这个脚本的输出就象:
      hunte.gif
      hunte.ppm
      jpg.htm
      jpg.jpg
      passthru.php
      要考虑些什么?
      要考虑两个问题:安全性和超时。
       先看安全性。比如,你有一家小型的网上商店,所以可以出售的产品列表放在一个文件中。你编写了一个有表单的HTML文件,让你的用户输入他们的 EMAIL地址,然后把这个产品列表发给他们。假设你没有使用PHP的mail()函数(或者从未听说过),你就调用Linux/Unix系统的mail 程序来发送这个文件。程序就象这样:
      
      system("mail $to < products.txt");
      echo "我们的产品目录已经发送到你的信箱:$to";
      ?>
      用这段代码,一般的用户不会产生什么危险,但实际上存在着非常大的安全漏洞。如果有个恶意的用户输入了这样一个EMAIL地址:
      '--bla ; mail [url=mailto:someone@domain.com]someone@domain.com [/url] < /etc/passwd ;'
      那么这条命令最终变成:
      'mail --bla ; mail [url=mailto:someone@domain.com]someone@domain.com [/url] < /etc/passwd ; < products.txt'
      我相信,无论哪个网络管理人员见到这样的命令,都会吓出一身冷汗来。
       幸好,PHP为我们提供了两个函数:EscapeShellCmd()和EscapeShellArg()。函数EscapeShellCmd把一个字 符串中所有可能瞒过Shell而去执行另外一个命令的字符转义。这些字符在Shell中是有特殊含义的,象分号(),重定向(>)和从文件读入 (<)等。函数EscapeShellArg是用来处理命令的参数的。它在给定的字符串两边加上单引号,并把字符串中的单引号转义,这样这个字符串 就可以安全地作为命令的参数。
      再来看看超时问题。如果要执行的命令要花费很长的时间,那么应该把这个命令放到系统的后台去运行。但在默认情况 下,象system()等函数要等到这个命令运行完才返回(实际上是要等命令的输出结果),这肯定会引起PHP脚本的超时。解决的办法是把命令的输出重定 向到另外一个文件或流中
    展开全文
  • 请问下,我想执行shell_exec(cmd: "java -jar"." ".$config." ".$file1); 错误提示:Parse error: syntax error, unexpected ':' in D:\phpStudy\PHPTutorial... shell_exec执行cmd命令行是不是还要开启配置的?
  • PHP使用命令函数执行shell脚本 CentOS 7.6 64位 宝塔Linux面板 运行环境 Nginx 1.17.1 PHP-7.1 步骤 01 解除禁用的命令函数 出于安全考虑,命令函数是被禁用,我安装宝塔是被禁用的 #修改php.ini文件 ...

    PHP使用命令函数执行shell脚本

    • CentOS 7.6 64位
    • 宝塔Linux面板

    运行环境

    • Nginx 1.17.1
    • PHP-7.1

    步骤

    01 解除禁用的命令函数

    出于安全考虑,命令函数是被禁用,我安装宝塔是被禁用的

    #修改php.ini文件
    disable_functions =  #被禁用函数都在这一行 把需要解除的函数删除就行了 
    system exec passthru shell_exec #PHP常用命令函数
    

    02 PHP调用Linux命令权限不足的解决方法

    关于这个问题我踩的太多坑了,这也是我要写这篇文章的原因,我本人记性不好,所以记录一下

    • 01 查看启动你PHP的进程的用户是谁
    ps -ef | grep php #通过终端命令行执行查询
    echo exec('whoami'); #通过PHP命令函数查询 总来说默认没有任何权限
    
    • 02 添加一个用户和组 终端命令↓↓↓
    /usr/sbin/groupadd wroot  # wroot 用户可以自定义的
    /usr/sbin/useradd -g wroot -s /bin/bash wroot
    vim /etc/passwd #查看你刚刚添加的用户 是否添加成功
    

    wroot 是刚刚添加的

    • 03 修改PHP启动用户为您刚添加的用户
      php-fpm.conf 修改这个配置文件
      编辑成 user = wroot; group = wroot; (wroot为您刚才添加的用户)
    service php-fpm restart #命令重启php-fpm
    ps -ef | grep php #命令查看PHP启动进程的用户、是否已经变了
    
    • 04 添加刚才的用户wroot到sudoers里面
    visudo #命令修改 /etc/sudoers的内容
    ## Allow root to run any commands anywhere 
    root    ALL=(ALL)       ALL
    wroot   ALL=(ALL)       ALL //新添加这一行
    %wroot  ALL=(ALL)      NOPASSWD: ALL  
    #NOPASSWD为设置用户组下面的用户使用sudo不需要输入密码
    

    以上操作完成,但是我发现依然不能解决PHP命令shell脚本问题

    • 05 关于linux 用vi命令使用vi编辑(外话)
    s #vi界面出现 INSERT后,开始进行编辑操作 编辑完毕后,按ESC键,跳到命令模式
    :w #保存,不退出vi
    :w! #强制保存,不退出vi
    :w file #将修改另外保存到file中,但不退出vi
    :wq 或 :x #保存,并退出vi
    :wq! #强制保存,并退出vi
    :q #不保存,并退出vi
    :q! #不保存,并强制退出vi
    :e! #放弃所有修改,从上次保存文件开始再编辑
    

    03 但第二部操作还是无法解决PHP命令shell脚本问题

    还是权限问题,最后添加www-data ALL=(ALL) NOPASSWD: ALL解决了

    www-data ALL=(ALL) NOPASSWD: ALL #编辑visudo
    

    编辑visudo添加www-data

     

    编写test.sh脚本,简单的一个shell脚本 创建一个文件夹

    #! /bin/sh
    mkdir /www/a #注意.sh文件需要给执行权限
    
    #PHP
    system('sudo /usr/bin/test.sh') #注意绝对路径
    system('sudo /www/wwwroot/wert/prt.sh') #例如路径
    

    内容部分来源网络,我只是执行操作整理

    展开全文
  • PHP执行shell命令无效

    2018-09-30 01:58:25
    $...上面的shell命令在linux命令行里可以执行PHP文件在CLI模式下也可以执行,在WEB下执行返回127,找不到命令。PHP是用root权限运行的,这是什么原因?
  • PHP执行shell_exec方法失败

    万次阅读 2020-05-06 11:56:28
    多半原因在php.ini文件中未打开方法权限 在php.ini开启即可

    多半原因在php.ini文件中未打开方法权限
    在php.ini开启即可

    展开全文
  • 学习如何更好地集成脚本和命令行工具。本文考察如何使用 shell_exec()、exec()、passthru() 和 system();安全地将信息传递到命令行;以及安全地从命令行获取信息。如果您使用过 PHP,您就会发现它是创建特性丰富的 ...
  • 有次实现一个work,使用了shellphp,python看着文件种类多,不方便交接,看着也比较麻烦。 减少文件种类数,也是很有必要的。 遇到的场景:shell程序需要从json中获取信息,继续处理。 文件,json.txt { ...
  • application\common.php文件内容如下: ... 'app\shell\command\Test', ]; application\shell\command\Test.php内容如下: namespace app\shell\command; use think\console\Command; use think\console\Input...
  • php 执行 shell 脚本环境变量设置

    千次阅读 2018-03-09 21:22:24
    当使用php的脚本执行命令(如:shell_exec())时,若脚本需要系统环境变量PATH支持(如:python使用import等),则会出现找不到的错误。并且查看系统PATH,如下: echo(shell_exec('echo $PATH')); /usr/sbin:/usr...
  • 公司项目中的一项小功能,统计设备的连接数。其中用到shell脚本来获取已连接设备的统计。使用命令 /bin/netstat-an|grep ESTABLISHED|...在linux命令行执行获取到的结果为 2 192.168.0.135 而通过web 页...
  • PHP调用shell命令

    千次阅读 2019-05-09 17:16:12
    PHP调用shell命令 前言 因为想用php调用python脚本,于是想到可以利用php调用shell命令的方法实现。 php版本:php7.0 三种方法 1.system system — 执行外部程序,并且显示输出 函数使用方法 system ( string $...
  • Atitit.执行cmd 命令行 php

    千次阅读 2015-07-10 21:29:36
    1. 执行cmd 命令行,调用系统命令的基础 1 1.1. 实际执行模式 1 1.2. 空格的问题 1 1.3. 中文路径的问题,程序文件读取编码设置 1 1.4. 回显乱码 2 2. exec,system等函数调用系统命令 2 3. php.ini,...
  • php执行shell脚本的权限问题

    千次阅读 2018-02-28 14:19:31
    本来这个事很简单的,但是我在实际操作的时候,发现每次通过浏览器访问时,脚本都没有被执行,而我在终端里面通过命令行执行php网页确又是没有任何问题的,当时就觉得很差异,后来仔细想了想,通过浏览器访问和直接...
  • 在上一篇文章“在 Linux 命令行中使用和执行 PHP 代码(一)”中,我同时着重讨论了直接在Linux命令行中运行PHP代码以及在Linux终端中执行PHP脚本文件。 Run PHP Codes in Linux Commandline 本文旨在让你了解...
  • shell脚本(crontab 定期执行),调用kitchen 和 pan 去执行,job和transformation文件。 分 windows和 dos系统两种。 太简单不写了。   shell脚本懒得贴了,不懂百度
  • 这次给大家带来的是:修改 wscript.shell 名称 达到“独享” wscript.shell组件 my Blog (http://huishao.net)已经发布了好一段时间了。应一些网友要求做了这个教程 今天测试的服务器是:http://bbs.yxol....
  • $sCheckNetworkMessage = ''; $shell = '/bin/ping -c4 www.baidu.com'; $sCheckNetworkMessage .= date('Y-m-d H:i:s')." Check network for baidu host[{...
  • php执行cmd/shell命令 木马小后门

    千次阅读 多人点赞 2020-09-22 14:39:32
    php执行shell命令,可以使用下面几个函数: string system ( string $command [, int &$return_var ] ) string exec ( string $command [, array &$output [, int &$return_var ]] ) void passthru ...
  • 打开文本编辑器(可以使用 vi/vim 命令来创建文件),新建一个文件 test.sh,扩展名为 sh(sh代表shell),扩展名并不影响脚本执行,见名知意就好,如果你用 phpshell 脚本,扩展名就用 php 好了。也可以直接使用...
1 2 3 4 5 ... 20
收藏数 26,424
精华内容 10,569
关键字:

php 执行shell命令行