PHP调用shell脚本注意事项
admin
2023-07-04 22:05:17
0次

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 代码如下:


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 重新测试


搞定了



相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...