大橙子网站建设,新征程启航
为企业提供网站建设、域名注册、服务器等服务
1、调用的路径,相对路径有时候不是很靠谱。
2、被调用的脚本有没有执行权限。
3、被调用的脚本能不能及时return,因为默认情况下php的页面只有30sec的执行周期。
我们提供的服务有:网站设计、成都网站设计、微信公众号开发、网站优化、网站认证、顺平ssl等。为近千家企事业单位解决了网站和推广的问题。提供周到的售前咨询和贴心的售后服务,是有科学管理、有技术的顺平网站制作公司
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 重新测试
搞定了