我目前在我的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
按[的文檔進行了shell_exec(http://php.net/ shell_exec):「使用這個函數不可能檢測到執行失敗,當需要訪問程序退出代碼時,應該使用exec()」。你只是簡單地假設你的代碼工作正常。永遠不要這樣做。假設失敗並將成功視爲令人驚喜的事情。切換到exec(),並開始檢查輸出/返回值。 –
什麼也沒有返回,難道這不是可以sudoable的事實嗎?它不會要求我輸入密碼,但我自己運行該命令時雖然如此不確定... –
另外,Apache通常在'www-data'用戶和組下運行,並且您將無法訪問像'useradd'這樣的'sudo'命令從PHP。它可能在sudo用戶下使用'bash -c'。我從來沒有嘗試過。 – machineaddict