博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
php通过system()调用Linux命令问题
阅读量:6943 次
发布时间:2019-06-27

本文共 1538 字,大约阅读时间需要 5 分钟。

最近在做php和linux crontab的联调,发现php在linux下的权限问题需要引起注意,调试问题的过程中发现有许多问题前人说的比较零散,我在这里汇总,顺带抛砖引玉一下。

1、$result=system($cmd,$return_status)需要区分返回值与返回状态。返回值是$cmd执行后返回执行结果的最后一行,而$return_status是返回状态,比如$cmd是crontab一个计划任务,若Linux执行成功,则返回0(详见Linux条件测试)给$return_status,故在PHP端看到$return_status变为0;若执行的是ls,则PHP端看$return_status是一串字符(很可能是乱码)。

2、路径所涉及的权限问题会导致system()看起来无效(命令执行后Linux没反应),其实主要观察返回状态即可,如system($cmd,$return_status),$return_status返回状态这里要小心,因为它是来自linux的消息,返回了0代表执行成功,1代表执行失败。所以,PHP配合linux时,涉及到路径的都应该仔细考虑一下是否有权限,特别是返回状态为1的时候。

3、往某目录A下增删文件,只要目录A有w权限,相应的用户就能增删,比如PHP在linux看来属于其他用户(www-data这个用户组),若将目录A的其他用户w权限关闭,则无法在该目录下创建文件,可以通过sudo,但是一定要保证PHP有使用sudo的权限(见第4条),否则也是无法创建的。而且能否往A中写只与A的权限有关,与A的父目录B有无w权限无直接关系。顺带提醒一下,php调用linux命令创建文件时,文件名应该转义,如 $cmd='touch /home/pi/`date +\%m_\%d_\%H_\%M.txt`'; system($cmd);  否则会遇到一切看起来都正常,但是就是没文件被创建的问题,因为不转义,Linux无法识别文件名中的符号。

4、PHP调用Linux命令是以www-data这个用户组身份进行的,这个用户组的默认权限特别低,以至于用system()涉及sudo等需要密码的命令都无法执行。解决方法可以命令行输入sudo visudo打开sudoers.tmp,在这里面添加“www-data ALL=(ALL) NOPASSWD: ALL”(或者在/etc/sudoers.d/下新建一个660权限的文件,并添加此句命令,虽然系统会自动把权限改回440,为了方便写入,这里还是新建一个660的文件),这样www-data这个用户组(即PHP)执行Linux的sudo命令就没有问题了。

5、所有正在运行crontab计划的用户在/var/spool/cron/crontabs目录下可以看到(目录名大同小异吧,都是在/var/spool/cron/下)。命令行中直接crontab的话,是添加root的任务计划,需要su后crontab -l才能看到;直接crontab -l看到只是当前用户的计划任务。crontab -u -user 可以指定某个用户的任务计划,当php取得sudo权限后,就可以为linux下其他用户定制crontab了。

小结:php和linux联调,我发现遇到的问题主要是权限,所以不能实现功能时,先检查权限是否得到满足,比如php的www-data处于何种权限,要写入的目录处于何种权限等;当权限疏导好后,用system()执行linux命令还是很方便的。

原创博客,如有错误,欢迎指正。

 

转载于:https://www.cnblogs.com/SHQHDMR/p/7880202.html

你可能感兴趣的文章
tfs 2013 利用 web deploy 完成asp.net站点自动发布
查看>>
dom对象常用的属性和方法有哪些?
查看>>
C#遍历XmlDocument对象所有节点名称、类型、属性(Attribute)
查看>>
范畴论-一个单子(Monad)说白了不过就是自函子范畴上的一个幺半群而已
查看>>
Spring cloud系列之Zuul配置项中sensitiveHeaders和ignoredHeaders
查看>>
51单片机交通灯(定时器+38译码器+中断)
查看>>
vue 总结
查看>>
深入理解java虚拟机(二):java内存溢出实战
查看>>
31.QPainter-rotate()函数分析-文字旋转不倾斜,图片旋转实现等待
查看>>
直接通过Binder的onTransact完成跨进程通信
查看>>
非域环境下使用证书部署数据库(SqlServer2008R2)镜像
查看>>
JavaScript Practices
查看>>
JS中如何alert对象
查看>>
MySQL的四种事务隔离级别
查看>>
创建maven工程的时候卡死的解决办法
查看>>
Eclipse将引用了第三方jar包的Java项目打包成jar文件的两种方法
查看>>
微信小程序保存图片功能实现
查看>>
【Shiro】小读Shiro Filter(未完待续)
查看>>
Android环信即时通讯集成坑爹 注册报错208解决
查看>>
Flink及主流流框架spark,storm比较
查看>>