2011-04-13 2 views
8

shell_exec을 사용하여 루트로 명령을 실행하고 싶습니다. 이제는 위험하다는 것을 알고 있지만 믿어주세요. MOD_AUTH로 로그인하고이 페이지에 올 권한이 있어야합니다. 안전합니다. 어떻게해야합니까?shell_exec의 PHP sudo

+7

당신이 무엇을 하든지 결코 안전하지 않습니다. – halfdan

답변

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

이 솔루션처럼 :), 나는 그것을 사용할 것입니다. –

3

Definitley는 권장하지 않습니다. 그러나 sudoers 파일을 편집하고 실행해야하는 명령에 대해 NOPASSWD으로 실행중인 사용자 php를 추가 할 수 있습니다. 이 경우에만 sudo에게 암호를 입력하지 않고 한 명령 만 허용합니다.

더 많은 명령이 필요한 경우 더 추가하십시오. Sudoers Configuration 포럼/게시물은 데비안 기반이지만 sudo는 엄격히 데비안이 아니며 sudo 설정 값을 넣으면 도움이 될 것입니다.

13

문제는 당신의 페이지 또는 안전하지 않은 것이 아니라, 문제는 PHP 페이지를 일부 sudo는 명령이 어떤 포함한 모든 페이지를 줄 것이다 실행할 수있는 기능을 제공하는 것은 어떤에 코드를 주입한다는 것입니다 서버의 모든 사이트에서 비보안 페이지. 그것은 일 필요가 단지 하나의 작업을하는 래퍼 스크립트를 만들기 위해 최선의 수 있습니다 말했다

, 다음

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

+1 래퍼. –

+0

인수를 사용하지 않는 래퍼를 언급하는 것을 잊어 버렸습니다! 인수를 허용하지 않는 래퍼 스크립트를 만들면 공격 대상이 줄어 듭니다. 어떤 프로그램은 특정 주장으로 실행될 경우 나쁜 일을하도록 조작 될 수 있습니다. 래퍼를 사용하면 프로그램을보다 제어 된 방식으로 시작할 수 있습니다. – Caleb

+0

루트 액세스가 필요한 모든 파일은/var/private-www /에 있으며 루트 액세스에서만 사용할 수 있습니다. sudo를 사용하게 할 수 있습니까? 'http ALL = (ALL) NOPASSWD :/var/private-www /'를 시도했지만 작동하지 않았습니다. –

2

나는 단지 구글 sudo는 같은 단지 하나의 명령에 HTTP 사용자 액세스 권한을 부여 php sudo shell_exec에 대한 d를이는 1 경기로 와서 : 2010 년 16 ~ 12 월 RU를 점 linemedia에서

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

일리아 4시 36분
sudo는이 파일

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

고마워,하지만 그게 작동하지 않는 걸 발견 했어? 시스템 ('echo "mypass"| sudo -u root -S mkdir/testdir');',하지만 –

+0

@Kevin : 따옴표로'COMMAND'를 감싸 야하거나 (* nix 지식이있는 경우) 폴더를 만들 수 없습니다. '/'. – drudge

+2

당신은 문자열을 쌍방향 패스워드 프롬프트로 파이프 할 수 없다. – mschr

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

/******************************* ******* ***** 예제 ************ ******************************

*/

는 펄 스크립트는 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 접두사가 붙은 동일한 명령을 다시 실행합니다.

관련 문제