1

我知道执行命令应该是 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编码。

任何建议表示赞赏!

4

2 回答 2

2

您可以使用sudowith-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 用户的密码。但是对于第二个,它甚至不会提示输入 sudo 密码。

注意:我推荐第一个使用。

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

于 2013-01-04T04:20:33.807 回答
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 进行处理。

于 2016-05-20T10:18:16.047 回答