2013-11-26 239 views
0

我目前在我的ubuntu盒子上有一個PHP文件,我想用它從Web界面在機器上創建用戶(安全性blablabla,它的所有內部網絡都完全無法從任何人會不小心/故意造成損害到系統)我最初使用這個嘗試:使用sudo從PHP運行shell腳本

shell_exec("sudo mkdir -m 755 ".escapeshellarg($directory)); 

    shell_exec("sudo useradd -s /bin/false -d ".escapeshellarg($directory)." -p ".crypt($pass,$salt)." ".escapeshellarg($servername)); 

但很明顯,這既暴露和MKDIR useradd的是無密碼sudo'd,所以不是這樣,我決定減少併發症創造/ etc中的一個shell腳本叫'newserver.sh',現在我有這個;

#!/bin/bash 
#Var 1 = Directory, Var 2 = Username Var 3 = Password 
mkdir "$1" 
chmod 755 "$1" 
useradd -s /bin/false -d "$1" -p "$3" "$2" 
chown "$2" "$1" 

這似乎工作升技更好,當我從終端運行它,它工作得很好,但PHP exexutes當使用

shell_exec("sudo sh /etc/newserver.sh /home/testuser testuser testpass"); 

它似乎沒有做任何事情(IVE甚至測試用相同的參數,當我從終端運行它。

FYI我sudoers文件中有這一行www-data ALL=(root) NOPASSWD: /etc/newserver.sh

+0

按[的文檔進行了shell_exec(http://php.net/ shell_exec):「使用這個函數不可能檢測到執行失敗,當需要訪問程序退出代碼時,應該使用exec()」。你只是簡單地假設你的代碼工作正常。永遠不要這樣做。假設失敗並將成功視爲令人驚喜的事情。切換到exec(),並開始檢查輸出/返回值。 –

+0

什麼也沒有返回,難道這不是可以sudoable的事實嗎?它不會要求我輸入密碼,但我自己運行該命令時雖然如此不確定... –

+0

另外,Apache通常在'www-data'用戶和組下運行,並且您將無法訪問像'useradd'這樣的'sudo'命令從PHP。它可能在sudo用戶下使用'bash -c'。我從來沒有嘗試過。 – machineaddict

回答

0

首先,密碼米如下所示:

/etc/newserver.sh /home/testuser testuser "$6$VP9.GI9D$nVjpXIlgoTCLYICNW9ijPqg07opPrjTU2ilYULaT4rut8S9CAmWggMXuOhJ27C5ltwCRfzSxEVgSlReA2i/rH1" 

我想,你應該使用「-c」作爲參數。

shell_exec("sudo sh -c \"/etc/newserver.sh /home/testuser testuser testpass\""); 
+0

我知道密碼密碼,該命令應該仍然運行,該帳戶應該仍然有效,除了不能通過它的密碼訪問它,即時消息使用這只是一個測試牀,我有一組不同的參數從PHP傳遞,包括一個加密的密碼。生病嘗試使用-c現在。 –

+0

響應該權限被拒絕。 –

+0

您檢查了執行文件的權限嗎? chmod u + x /etc/newserver.sh – Construidor

0

以root運行可以通過兩種方式來完成:

  • 使用sudo(使www-data一個sudoer什麼是一個好主意......)
  • 設置setuid的

看一看/bin/ping

-rwsr-xr-x 1 root root /bin/ping 

它屬於根,但's'代替'x'(執行)意味着這個程序是setuid:它總是以所有者的身份執行:root。 ping是一個需要構建ICMP數據包的程序,只有root可以操縱這些數據包直到結束。

您可以創建一個類似的environement:把你的命令在shell腳本(假設myscript.sh)和:

chown root:root myscript.sh # Give it to root. 
chmod u+s myscript.sh # Use setuid on it. 

現在,當你運行它,甚至作爲一個普通用戶(或www-data爲網絡服務器...),這些進程將在根用戶身份下創建。

危險將setuid(作爲root)賦予腳本是非常危險的。您應該小心使用權限:除了您感興趣的人員之外,不要允許任何人運行它。例如,創建一個名爲myscriptexec爲允許運行此腳本的人:

addgroup myscriptexec 
chgrp myscriptexec myscript.sh 
chmod g+x # Group can execute. 
chmod o= myscript.sh # No one executes except root and group members. 

然後,將用戶添加到該組,因爲你需要。

如果你需要檢查你的腳本,我建議你使用一個臨時日誌文件,用於調試目的:

exec > /tmp/mylog.log 
exec 2> /tmp/mylog.log 
+0

好的很酷的生病給它一個鏡頭 –

+0

當我這樣做,然後嘗試並沒有sudo運行sh它失敗,因爲它不作爲根運行 - 或者我應該說,它響應mkdir和adduser上的錯誤,因爲它們不運行作爲根。 –

+0

我的不好:之後執行的命令沒有以root身份運行。在腳本中嘗試用'sudo'命令加前綴命令,不要求輸入密碼(「父」程序以root身份運行)。 –