天天看点

PHP执行Python脚本里的sudo权限问题及解决办法

当我们用php的exec或者system调用一个外部程序时,比如一个python文件,调用py文件本身没有遇到问题,但是但是py文件里执行os.system(sudo cp  filea fileb)等shell命令时,此时会遇到sudo权限问题。(服务器的命令行里调用py应该不会遇到此问题,但通过网页执行php去调用就难说了)

Web网页,一般是Apache或者Nginx去解释php文件,nginx默认的user为www-data,(查看 cat /etc/nginx/nginx.conf 可知)。

exec.php

1、需要知道执行结果,查看update.log即可
exec("python test.py 2>&1",$output,$result);  //$output状态为0:success,$result表示输出值。
file_put_contents(storage_path("logs/update.log"), date("Y-m-d H:i:s") . "<<<<<<状态=>:"." $result ". "<<<<<<结果=>:" . serialize($output) ." >>>>>> \r\n\r\n", FILE_APPEND);
2、测试ok,不需要结果
exec("python test.py 2>&1");

test.py
os.system('sudo cp /var/www/html/a.txt /var/www/html/b.txt')
//cp代表的是一类linux命令,比如chmod chown等,whereis cp 可以查看命令的绝对路径,有时候需要写成 /usr/bin/cp 或者 /bin/cp
//os.system的返回值为0,代表success
           

PHP执行Python脚本里的sudo权限问题及解决办法

报错一:

//1、正常报错
sudo: no tty present and no askpass program specified
           

此时需要,添加密码,就是www-data用户的密码。

//2、sudo -S mypass  密码报错  www-data为执行的用户,意思就是需要www-data用户的密码才能执行
[sudo] password for www-data
           

 执行:

//修改用户www-data的密码   enter之后,会输入两次自定义的密码,要记住它,如果忘了就重复执行此命令  
sudo passwd www-data
           

报错二:

//此时写法从 os.system('sudo cp /var/www/html/a.txt /var/www/html/b.txt'),改为如下:

sudoPassword = 'mypass'
command = 'cp /var/www/html/a.txt /var/www/html/b.txt'
p = os.system('echo %s|sudo -S %s' % (sudoPassword, command))

简写为:
os.system('echo %s|sudo -S %s' % ('mypass','sudo cp /var/www/html/a.txt /var/www/html/b.txt'))
           

 报错三:

//表示密码错误 ,那就重新输入密码或者可以执行sudo passwd www-data 更改密码
[sudo] password for www-data: Sorry, try again.";"[sudo] password for www-data:";"sudo: 1 incorrect password attempt
           

 报错四:

//表示 /etc/suders  里没有www-data用户,所以要写进去
[sudo] password for www-data: www-data is not in the sudoers file.  This incident will be reported.
           

执行:

sudo vim /etc/sudoers     
//将www-data用户添加进去,添加到root的后面,如果你是其他用户,就将其他用户的用户名添加进去,如下图所示
           
PHP执行Python脚本里的sudo权限问题及解决办法

扩展

root    ALL=(ALL:ALL)       ALL

root    表示 root 用户。
ALL     表示从任何的主机上都可以执行,也可以这样 192.168.100.0/24。
(ALL:ALL)   是以谁的身份来执行,ALL:ALL 就代表 root 可以任何人的身份来执行命令。
ALL     表示任何命令。
那么整条规则就是 root 用户可以在任何主机以任何人的身份来执行所有的命令。

//设置 sudo 时不需要输入密码
myuser    ALL=(ALL) NOPASSWD: ALL

//sudo 的日志
在 ubuntu 中,sudo 的日志默认被记录在 /var/log/auth.log 文件中。当我们执行 sudo 命令时,相关日志都是会被记录下来的.