0基础自学linux运维-5.9-如何在php中执行linux命令或脚本

前言

一般运维web化会通过web调用脚本(python或shell脚本为主)或者直接执行linux命令,在这里我使用php执行linux命令讲起。

环境安装

安装环境是根据 

0基础自学linux运维-2.3-centos7.6安装LNMP(nginx1.16+mysql5.7+PHP7.3)

这篇文章安装的LNMP,其实只要安装nignx和php就行了,mysql没有用到可以不安装

如果是其它版本的PHP请看一下php.ini中的“disable_functions”,是否把exec、shell_exec去掉了

PHP程序执行函数

根据PHP官网知道 php程度执行函数有如下

escapeshellarg — 把字符串转码为可以在 shell 命令里使用的参数

escapeshellcmd — shell 元字符转义

exec — 执行一个外部程序

passthru — 执行外部程序并且显示原始输出

proc_close — 关闭由 proc_open 打开的进程并且返回进程退出码

proc_get_status — 获取由 proc_open 函数打开的进程的信息

proc_nice — 修改当前进程的优先级

proc_open — 执行一个命令,并且打开用来输入/输出的文件指针。

proc_terminate — 杀除由 proc_open 打开的进程

shell_exec — 通过 shell 环境执行命令,并且将完整的输出以字符串的方式返回。

system — 执行外部程序,并且显示输出

其中execpassthru 、shell_exec、 system 比较多具体使用方法请点击直关链接,这里就不再说了

例子

例1 使用exec命令

ecec官方介绍如下:

建立一个数据

mkdir -pv /disk1/t1

echo 'this is a.txt'>/disk1/t1/a.txt

echo 'this is b.txt'>/disk1/t1/b.txt

echo 'this is c1.txt 1'>/disk1/t1/c.txt

echo 'this is c1.txt 2'>>/disk1/t1/c.txt

echo 'this is c1.txt 3'>>/disk1/t1/c.txt

现在要执行ls -l /disk1/t1命令,用php操作为:

mkdir -pv /disk1/www

cd /disk1/www/

cat>ls.php<<EOF

<?php

exec("ls -l /disk1/t1/a.txt",\$output);

print_r(\$output);

?>

EOF

cat ls.php

使用php内置Web Server

为了能更直观地看到结果,我使用了php内置的web Server来启动,端口为8000,格式为:       php -S IP:port,我这里IP是192.168.3.76,端口想设置为8000,故命令为:

#进入要运行的php目录               

cd /disk1/www/ 

#执行php内置web Server

php -S 192.168.3.76:8000

执行php

打开浏览器输入:http://192.168.3.76:8000/ls.php,执行结果如下:


例2 使用 shell_exec 命令

如果上面例子可是返回多行结果会怎样,把ls.php代码中

exec("ls -l /disk1/t1/a.txt",\$output); 

改为 

exec("ls -l /disk1/t1",\$output);

显示所有目录,再执行试下

再换成用shell_exec试下,语法如下:

把ls代码改为

$output = shell_exec("ls -l /disk1/t1");

echo "<pre>$output</pre>";

在浏览器运行一下:

是不是比上面的友好很多啦^_^

再把 ls -l /disk1/t1 改为查看 c.txt内容

$output = shell_exec("cat /disk1/t1/c.txt");

再按F5刷新一下浏览器查看结果

没问题



php权限问题

改为查看/var/log/messages前3行

$output = shell_exec("head -3 /var/log/messages");

为了能在页面显示错误,我在<?php下方添加几行

ini_set('display_errors',1); //错误信息

ini_set('display_startup_errors',1);    //php启动错误信息 

error_reporting(-1);                    //打印出所有的 错误信息 

看似没问题,好,现在不用php内置了,直接用php普通的,我这里是 /disk1/www/hualinux.com/,现在把ls.php复制过去

cp ls.php /disk1/www/hualinux.com/

在浏览器上直接输入,发现空白,为什么呢,因为shell_exec解释了出错只返null所以我改用

passthru 命令,把代码改为:

<?php

ini_set('display_errors',1);            //错误信息 

ini_set('display_startup_errors',1);    //php启动错误信息 

error_reporting(-1);                    //打印出所有的 错误信息 

system("head -3 /var/log/messages",$return_var );

echo "return_var: ";

echo $return_var;

?>

运行浏览器结果为:

值为1说明有错误

分析:

因为查看php运行的用户

除了主进行,其它都是nginx用户

查看/var/log/messages日志权限

[root@vm76 ~]# ll /var/log/messages                                                                                  -rw-------. 1 root root 701881 7月  24 00:40 /var/log/messages

发现是除了root其它都不能访问,解决方法有以下几种:

方法一:/etc/php-fpm.d/www.conf中设置user = root 和 group = root,权限太大重启不起来。用python写的 某塔Linux面板 可是直接用root运行的啊!不得不说它内心的强大!

方法二:使用shell脚本在脚本写用expect命令切过去

但这样会暴露root密码,不安全,很危险

方法三:使用Ansible APISaltStack API接口来实现,这样是不是安全多了

Ansible API
salt API

从上图知道ansible api和salt api,编程语言只有python,可以编写python脚本,然后调用它,这里我不详述了。

方法四:给nginx设置sudo权限免密码切换到root,因nginx不能远程登陆,只能本地运行

visudo,在100行插入

nginx ALL=(ALL) NOPASSWD: ALL

:wq退出

添加一个脚本名叫ls.sh,并修改ls.php代码,如下

[root@vm76 hualinux.com]# cat ls.php

<?php

$output = shell_exec("sh ls.sh");

echo "<pre>$output</pre>";

?>

[root@vm76 hualinux.com]# cat ls.sh

#!/bin/bash

sudo head -3 /var/log/messages

再次执行,结果如下:

方法四因为没有验证就可以直接执行,有点不太安全,如果php一旦拿到了上传或修改php文件的权限,那么对方做什么都可以了。所以得非常注意。有一些敏感的东西,很重要的东西建议不要直接让php操作,在sudo中禁止它的行为,即使php被攻破也可以降低影响范围。

对于修改类要记录好日志直接发给ELK日志系统,什么用户操作的,登记IP,操作时间,执行了什么命令。最好做一个安全层做一下审计,一些敏感操作需要手工审计。

注意事项:

如果用sudo echo写入数据在脚本中不能用 sudo echo 'xxx'>name.txt 方式,要使用sudo sh -c 'echo "xxx">name.txt'方式,如:

sudo sh -c 'echo `date +%F-%H:%M:%S`>>ha.txt'


关于执行shell或python脚本

php执行sh脚本或python也是使用上面的php命令,sh脚本用sh xxx.sh执行,python脚本用python xxx.py来执行即可

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容