我知道执行命令应该是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编码。
任何建议都表示赞赏!
答案 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进行处理。