2011-04-13 88 views
8

我想用shell_exec以root身份執行命令。現在我知道這很危險,但請相信我,您需要使用MOD_AUTH登錄並且有權訪問此頁面。它很安全。我怎樣才能做到這一點?shell_exec中的PHP sudo

+7

無論你做什麼,它永遠不會'安全'.. – halfdan 2011-04-13 17:15:29

回答

11

你可以使用的phpseclib, a pure PHP SSH implementation最新的SVN版本,要做到這一點執行。例如。

<?php 
include('Net/SSH2.php'); 

$ssh = new Net_SSH2('www.domain.tld'); 
$ssh->login('username', 'password'); 

$ssh->read('[prompt]'); 
$ssh->write("sudo command\n"); 
$ssh->read('Password:'); 
$ssh->write("Password\n"); 
echo $ssh->read('[prompt]'); 
?> 
+0

像這個解決方案:),我會使用那個。 – 2011-04-19 08:22:08

3

Definitley不建議。但是,您需要考慮編輯sudoers文件並添加用戶php作爲NOPASSWD運行您需要運行的命令。這隻會讓他以sudo那一個命令無法輸入密碼。

如果您需要更多命令,可以添加更多命令。 Sudoers Configuration我知道forum/post是基於debian的,但sudo並不是嚴格的debian,它應該可以幫助你解決你需要的sudo配置值。

13

的問題不在於你是或不是安全的,問題是,給一個PHP頁面運行一些sudo命令會給它所有頁,包括任何的注射能力上的任何代碼服務器上任何站點上的不安全頁面。

這就是說,它可能是最好做一個包裝腳本,不只是一個工作需要做,然後給作爲須藤

http ALL=(ALL) NOPASSWD:/user/local/bin/your_wrapper_script.sh 
+0

+1的包裝。 – 2011-04-13 17:18:07

+0

我忘了提一個不帶參數的包裝!製作一個不接受參數的包裝腳本可以減少攻擊面。如果執行某些參數,某些程序可以被操縱來做壞事。使用包裝器允許您以更受控制的方式啓動程序。 – Caleb 2011-04-13 17:21:11

+0

所有需要root訪問權限的文件都位於/ var/private-www /中,只能由root用戶訪問。是否有可能讓他們使用sudo?我嘗試過'http ALL =(ALL)NOPASSWD:/ var/private-www /',但那不起作用。 – 2011-04-13 17:24:38

2

我只是谷歌」只是一個命令的HTTP用戶訪問d爲php sudo shell_exec這想出了爲#1的比賽:在linemedia

http://www.php.net/manual/en/function.shell-exec.php#101440

伊利亞點RU 16日 - 12月2010 04:36
,sudo命令可以不存儲通在文件

system('echo "PASS" | sudo -u root -S COMMAND'); 
+0

謝謝,但我發現這是行不通的?我試過'system('echo「mypass」| sudo -u root -S mkdir/testdir');',但是'/ testdir'在我執行腳本後不存在 – 2011-04-13 17:26:03

+0

@Kevin:你可能不得不將'COMMAND'換成引號,或者(如果我對* nix知識正確)你不能創建一個文件夾''' – drudge 2011-04-13 17:45:46

+2

你不能也不應該能夠將一個字符串轉換成交互式密碼提示 – mschr 2012-06-09 22:40:32

0
$aux=echo "admin-pass" | your command; 
echo $aux; 

/******** ******* *****例子************* ****************************** */

運行Perl腳本命名爲my_perl_script.pl

$aux=echo "admin-pass" | sudo -u root -S perl /path-to-the-script/my-perl-script.pl; 
echo $aux; 
0

最好的方式做到這一點:

$descriptorSpec = array(
    0 => STDIN, 
    1 => STDOUT, 
    2 => STDERR, 
); 

if (posix_getuid() === 0) { 
    echo "Root\n"; 
} else { 
    echo "No root\n"; 
    $command = 'sudo ' . PHP_BINARY . ' ' . implode(' ', $_SERVER['argv']); 

    $pipes = []; 
    $process = proc_open($command, $descriptorSpec, $pipes); 
    if (is_resource($process)) { 
     proc_close($process); 
    } 
} 

它再次運行相同的命令,以sudo爲前綴。