php执行命令tcpdump

时间:2013-01-04 03:56:56

标签: php shellexecute tcpdump

我知道执行命令应该是root,我发现php中的popen()可能会帮助我做到这一点。但我的代码不起作用,我不知道原因......

我的代码是:

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

我输错了什么?

我的php文件在Linux服务器中,我将目录中的所有文件所有者更改为apache(和模式0777)。

添加: 如果我应该使用sudo,我应该关注什么?我使用php编码。

任何建议都表示赞赏!

2 个答案:

答案 0 :(得分:2)

您可以使用sudo-S选项从命令行本身传递密码。

[suku@suku-ld ~]$ 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

[已添加] :如何将用户添加到sudores列表?

suku@ubuntu-vm:~$ which tcpdump 
/usr/sbin/tcpdump

执行命令visudo并输入以下任一项:

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

如果您使用第一个,那么当您使用sudo命令执行脚本时,它将提示输入apache用户的密码。但是对于第二个,它甚至不会提示输入密码。

注意:我建议使用第一个。

注意:我假设您使用用户apache运行Web服务器。如果没有,请相应地更改用户名。

答案 1 :(得分:1)

我最近发布了一个项目,允许PHP获取真正的Bash shell并与之交互(如果需要,可以作为root),它解决了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进行处理。