我真的需要用PHP exec關閉Ubuntu。但是我的權限可能有些問題。如何用exec關閉Ubuntu
echo exec('whoami')
return'nobody';
所以我把控制檯
adduser nobody admin
,並試圖
exec("shutdown -h now");
,但它不能正常工作;(
我真的需要用PHP exec關閉Ubuntu。但是我的權限可能有些問題。如何用exec關閉Ubuntu
echo exec('whoami')
return'nobody';
所以我把控制檯
adduser nobody admin
,並試圖
exec("shutdown -h now");
,但它不能正常工作;(
給予PHP運行作爲root用戶權限的用戶高度危險 。這根本不是一個好主意,因爲如果PHP腳本中的漏洞被利用,你就會打開整個服務器。在生產服務器上,這個是絕對不能接受的。
安全地做到這一點的唯一方法是,我知道有一個cron作業每分鐘都以root身份運行一個shell腳本。 shell腳本測試是否存在像shutdown_now.txt
這樣的文件。如果該文件存在,腳本將啓動關閉過程。 PHP腳本根據指示創建關閉文件。
我不太熟悉shell腳本來提供示例,但我確信有人可以在必要時使用。
嘗試運行EXEC這樣
exec('shutdown -h now', $output, $return_val);
print_r($output);
echo "\n";
echo 'Error: '. $return_val ."\n";
,並期待在錯誤的,我只是想運行一個PHP腳本用root用戶和它的工作在我的機器上。
如果這不起作用,請考慮讓cronjob在root權限下運行,定期檢查它是否應該在macine上運行關閉。
其實Pekka給了你一個很好的建議。在你的PHP文件中創建一個文件,將強制重新啓動,像
$file = fopen('.reboot-server',"w");
fwrite($file, 'reboot');
close($file);
簡單的東西做一個bash腳本,將檢查該文件
#!/bin/bash
if [ -f /var/www/html/.reboot-server ]; then
rm -f /var/www/html/.reboot-server
if [ -f /var/www/html/.reboot-server ]; then
echo "Can't remove file .reboot-server"
else
/sbin/shutdown -r now
fi
fi
而下的cronjob添加它
*/1 * * * * root /home/scripts/reboot.sh
這個答案說明只有。做不是實際上是這樣做的。
/sbin/shutdown
(作爲root)複製到PHP用戶可以訪問它的地方。chmod 4755 /copy/of/shutdown
當PHP執行關機複製時,shutdown
將以root權限運行。這消除了cron作業以及過時的'shutdown_now.txt'會導致系統在加電後不久再次暫停的可能性。
同樣,setuid位的批量使用是危險。任何時候你使用它,想想仔細關於該程序可能能夠做什麼,如果濫用。在這種情況下,您應用中的漏洞可能會導致攻擊者遠程停止系統。但是,無論您使用什麼方法與shutdown
交談,攻擊者都可以這樣做。如果這是可接受的風險,則由您決定。
此外,如果您要這樣做,請執行而不是作爲匿名系統用戶運行PHP,您確實需要suexec。只要讓確定沒有辦法將任意任意值傳遞給您發送的命令。不要讓某人在結束時或開始時獲得&& do_evil_deed
。
一個多安全的方式做到這一點是通過使用SSH提供類PHP中的任何一個,只有連接在一個chroot監禁的用戶使用sudo權利到關機程序。或者,基本上,任何時間PHP需要爲操作系統做些什麼,想象一下爲了做到這一點你可以想到的最小表面,然後嘗試使其更小。
+1這遠非完全安全,但比以root身份運行更可行。例如,家庭服務器可能可以接受 – 2011-03-08 00:08:58
@Pekka - 無論哪種方式,PHP都能夠停止系統(通過SUID位或cron作業)。我正在說明,在這種特殊情況下,關機除了......關機之外不會執行其他任何操作。你不會想用traceroute或ping等工具來做這件事。儘管如此,正如指出的那樣 - 如果OP的系統被p0wned - 攻擊者可以關閉系統兩種方式。在這種情況下使用的setuid並不比使用cron的拿起一個拖放文件更多/更少危險。但是,它降低了複雜性,並且可以立即運行。 – 2011-03-08 00:18:18
然而,正如預期的這個解決方案沒有奏效。我將關機腳本複製到了一個可訪問的位置('sudo cp/sbin/shutdown/var/www'),但是當我嘗試從PHP腳本運行時,仍然出現'shutdown:Need to be root'錯誤:'echo shell_exec('/ var/www/shutdown now');' – Honoki 2013-01-26 00:13:22
那麼運行apache的用戶可以使用sudo權限運行shutdown嗎?
打開sudoers文件與
sudo visudo
添加行
www-data ALL=NOPASSWD:/sbin/shutdown
(www數據應該是運行Apache的用戶,你可以用ps aux | egrep '(apache|httpd)'
檢查並假設關閉二進制在/sbin)
用ctrl-O保存
現在,這應該在PHP工作:
system("sudo shutdown 0");
給予PHP運行作爲root用戶權限的用戶**高度危險的**。 – 2011-03-07 23:47:36
這應該是在跑步,「最糟糕的想法,...永遠!」 – jondavidjohn 2011-03-07 23:47:51
我知道,我知道,但是可以用我的例子來幫助我;(? – Domiik 2011-03-07 23:53:32