2011-04-13 49 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为前缀。