温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

PHP调用shell脚本注意事项

发布时间:2020-07-20 18:30:13 来源:网络 阅读:774 作者:ihanxiao2100 栏目:web开发

1、调用的路径,相对路径有时候不是很靠谱。 
2、被调用的脚本有没有执行权限。 
3、被调用的脚本能不能及时return,因为默认情况下php的页面只有30sec的执行周期。

 

1.使用system函数调用最好在前面指定shell路径,如:

system("/bin/bash ./start-instance.sh",$status);

2.

exec("/**/**.sh > /dev/null 2>&1 &"); 
把shell扔给后台,而且把输出重定向到空设备。

---------------------------------------------------------------------------------------------------------------------

在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: p_w_picpath/gif"); 
passthru("./ppmtogif hunte.ppm"); 
?> 
-------------------------------------------------------------------------------------------------------------- 
后来,把shell脚本放到了safe_mode_exec_dir目录,调用成功~~



写个页面的东西,来执行服务器上命令,最简单的比如reboot命令,用php来调用 参考网上方法如下

先建立一个脚本( /root/reboot_server.sh ),重启用的。

代码如下:

#!/bin/bash

reboot


再给他赋予权限 4755

chown root:root /root/reboot_server.sh

chmod 4755 /root/reboot_server.sh

chmod 4777 /sbin/reboot

再在 php 里, 想办法做如下调用 php

reboot.php 代码如下:


<?php

exec ("/root/reboot_server.sh",$out,$status);

print_r($out);

print_r($status);

?>

然后,通过页面来访问reboot.php(lnmp平台做了虚拟主机,可以通过域名来访问x.x.com/reboot.php)

其结果返回 126的状态码,搜索网上解决方案,一直无果


索性将/root/reboot_server.sh移到了和reboot.php 同一个目录中

访问,可以了,返回状态码0 系统重启了


意识到是目录权限的问题,/root目录对php的用户www没有可执行权限

chmod -R 755 /root

然后把reboot_server.sh移动到了/root 重新测试


搞定了



向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI