2013-01-04 3 views
1

나는 루트로해야 명령을 실행하고, 나는 PHP에서 popen() 어쩌면 내가 그것을 도울 찾을.PHP는 명령을 실행 tcpdump

$sucommand = "su --login root -c tcpdump -c 20000 -s 0 -w $filename &"; 
    $rootpasswd = "password"; 
    $fp = @popen($sucommand,"w"); 
    @fputs($fp,$rootpasswd); 
    @pclose($fp); 

내가 잘못 입력 한 뭔가 :하지만 내 코드는

내 코드가 ...... 내가 이유를 모르는, 작동하지 않는 이유는 무엇입니까?

내 PHP 파일은 리눅스 서버에 있으며, 나는 아파치 (및 모드 0777) 디렉토리의 모든 파일 소유자를 변경합니다.

추가 : 내가 sudo를 사용해야한다면 무엇을해야합니까? 나는 PHP 코딩을 사용합니다.

의견을 보내 주시면 감사하겠습니다.

+1

'su'는 암호 다음에 개행 문자가 오기를 기다리고 있습니다 (대화식으로 암호를 입력 한 후에 Return 키를 눌러야합니다). – Amber

+2

'sudo'를 사용하는 것이 더 쉬운 것으로 나타났습니다. – AndreKR

답변

2

sudo-S 옵션을 함께 사용하면 명령 줄에서 암호를 전달할 수 있습니다.

[[email protected] ~]$ echo 'YOURSUDOPASSWORD' | sudo -S tcpdump -c 20000 -i eth1 -s 0 -w tmp 
tcpdump: listening on eth1, link-type EN10MB (Ethernet), capture size 65535 bytes 

[ADDED] : 어떻게 sudores 목록에 사용자를 추가하려면?

[email protected]:~$ which tcpdump 
/usr/sbin/tcpdump 

명령 visudo을 실행하고 다음 중 하나를 입력 : 당신은 sudo는 명령으로 스크립트를 실행할 때

apache ALL=/usr/sbin/tcpdump 
apache ALL=NOPASSWD:/usr/sbin/tcpdump 

첫 번째 하나를 사용하는 경우, 그것은 아파치 사용자의 암호를 입력하라는 메시지가 표시됩니다. 그러나 두 번째 버전에서는 sudo 암호를 요구하지 않습니다.

참고 : 사용하는 것이 좋습니다.

참고 : 사용자 아파치로 웹 서버를 실행 중이라고 가정합니다. 그렇지 않은 경우 이에 따라 사용자 이름을 변경하십시오.

+3

당신은 아마이 사실을 알고있을 것입니다. 그러나 asker가 그렇지 않은 경우 암호를 파일에 넣고 파일을 sudo에 파이프하는 것이 더 좋습니다. 이렇게하면 실행중인 프로세스 목록에 암호가 표시되지 않습니다. 파일이 적절하게 보안되었다고 가정하면 파일에 암호를 일반 텍스트로 저장하는 것은 여전히 ​​의문의 여지가 있지만 합리적으로 * 안전합니다. +1 – Corbin

+1

코빈, 네, 맞습니다. 보안을 강화하기 위해 암호화 된 암호를 파일에 저장 한 다음 스크립트 내의 일부 PHP 함수를 사용하여 값을 암호 해독하여'sudo'로 파이프 할 수 있습니다. – Suku

+0

답변 해 주셔서 감사합니다. 그러나 .php를 사용하여 우선 순위 또는 소유자와 관련된 명령을 실행합니까? 비밀 번호가 루트 또는 아파치에 대한 혼란? – Shuinvy

1

최근에 PHP가 실제 Bash 셸 (요청할 경우 루트로)을 가져와 상호 작용할 수있는 프로젝트를 게시 한 후 exec() 및 shell_exec()의 제한 사항을 해결합니다. 당신은 단순히 다음 코드를 사용합니다 다운로드 한 후 https://github.com/merlinthemagic/MTS

을 : 여기 오기

$shell = \MTS\Factories::getDevices()->getLocalHost()->getShell('bash', true); 
$timeout = 3600000; // how many miliseconds will it take to capture 20000 packets? 
$return1 = $shell->exeCmd('tcpdump -c 20000 -i eth1 -s 0 -w /tmp/tmp.pcap', false, $timeout); 
//the return will be a string containing the return of the command 
echo $return1; 

그런 처리를 위해 /tmp/tmp.pcap을 선택하십시오.

+0

공유해 주셔서 감사합니다. 나중에 사용해 보겠습니다. – Shuinvy