2011-03-07 60 views
0

我真的需要用PHP exec關閉Ubuntu。但是我的權限可能有些問題。如何用exec關閉Ubuntu

echo exec('whoami') 

return'nobody';

所以我把控制檯

adduser nobody admin 

,並試圖

exec("shutdown -h now"); 

,但它不能正常工作;(

+4

給予PHP運行作爲root用戶權限的用戶**高度危險的**。 – 2011-03-07 23:47:36

+1

這應該是在跑步,「最糟糕的想法,...永遠!」 – jondavidjohn 2011-03-07 23:47:51

+0

我知道,我知道,但是可以用我的例子來幫助我;(? – Domiik 2011-03-07 23:53:32

回答

9

給予PHP運行作爲root用戶權限的用戶高度危險 。這根本不是一個好主意,因爲如果PHP腳本中的漏洞被利用,你就會打開整個服務器。在生產服務器上,這個是絕對不能接受的。

安全地做到這一點的唯一方法是,我知道有一個cron作業每分鐘都以root身份運行一個shell腳本。 shell腳本測試是否存在像shutdown_now.txt這樣的文件。如果該文件存在,腳本將啓動關閉過程。 PHP腳本根據指示創建關閉文件。

我不太熟悉shell腳本來提供示例,但我確信有人可以在必要時使用。

+0

我知道危險,但是我想盡可能簡單地做到這一點 – Domiik 2011-03-07 23:52:09

+1

安全方便,不錯 – EboMike 2011-03-07 23:54:10

+0

@Domiik我不是Linux專家,但是系統管理員組可能應該被稱爲'root'而不是'admin',或者,Ubuntu似乎有一個命令'users-admin',然後是控制用戶組的'/ etc/group'。 ,這是非常危險的,即使是一個私人家庭服務器也不是一個好主意。 – 2011-03-07 23:56:03

0

嘗試運行EXEC這樣

exec('shutdown -h now', $output, $return_val); 

print_r($output); 
echo "\n"; 
echo 'Error: '. $return_val ."\n"; 

,並期待在錯誤的,我只是想運行一個PHP腳本用root用戶和它的工作在我的機器上。

如果這不起作用,請考慮讓cronjob在root權限下運行,定期檢查它是否應該在macine上運行關閉。

7

其實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 
+0

+1看起來很穩固。 – 2011-03-08 00:10:18

+0

舊的答案,但很好。我認爲我們需要對正在創建文件的文件夾有寫權限嗎? – itsols 2014-09-01 14:27:41

+0

我不是bash的專家,但不應該需要sudo或身份驗證才能運行? – itsols 2014-09-01 14:29:30

3

這個答案說明只有。做不是實際上是這樣做的。

  • /sbin/shutdown(作爲root)複製到PHP用戶可以訪問它的地方。
  • 設置副本的SUID位,以便它可以作爲root運行。 chmod 4755 /copy/of/shutdown

當PHP執行關機複製時,shutdown將以root權限運行。這消除了cron作業以及過時的'shutdown_now.txt'會導致系統在加電後不久再次暫停的可能性。

同樣,setuid位的批量使用是危險。任何時候你使用它,想想仔細關於該程序可能能夠做什麼,如果濫用。在這種情況下,您應用中的漏洞可能會導致攻擊者遠程停止系統。但是,無論您使用什麼方法與shutdown交談,攻擊者都可以這樣做。如果這是可接受的風險,則由您決定。

此外,如果您要這樣做,請執行而不是作爲匿名系統用戶運行PHP,您確實需要suexec。只要讓確定沒有辦法將任意任意值傳遞給您發送的命令。不要讓某人在結束時或開始時獲得&& do_evil_deed

一個安全的方式做到這一點是通過使用SSH提供類PHP中的任何一個,只有連接在一個chroot監禁的用戶使用sudo權利到關機程序。或者,基本上,任何時間PHP需要爲操作系統做些什麼,想象一下爲了做到這一點你可以想到的最小表面,然後嘗試使其更小。

+0

+1這遠非完全安全,但比以root身份運行更可行。例如,家庭服務器可能可以接受 – 2011-03-08 00:08:58

+0

@Pekka - 無論哪種方式,PHP都能夠停止系統(通過SUID位或cron作業)。我正在說明,在這種特殊情況下,關機除了......關機之外不會執行其他任何操作。你不會想用traceroute或ping等工具來做這件事。儘管如此,正如指出的那樣 - 如果OP的系統被p0wned - 攻擊者可以關閉系統兩種方式。在這種情況下使用的setuid並不比使用cron的拿起一個拖放文件更多/更少危險。但是,它降低了複雜性,並且可以立即運行。 – 2011-03-08 00:18:18

+0

然而,正如預期的這個解決方案沒有奏效。我將關機腳本複製到了一個可訪問的位置('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

1

那麼運行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");