天天看點

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 指令時,相關日志都是會被記錄下來的.