我想使用 PHPshell_exec()
函数将一些内容发送到本地套接字。
我当前的方法如下所示:
sudo -s echo "foobar" > /dev/tcp/192.168.178.41/8080
当我在命令行中运行此命令时,一切正常。但是,当我尝试在 PHP 脚本中执行此操作时,什么都没发生。
连错误都没有/var/log/httpd/apache24-error_log
。 (是的,这是正确的道路。)
我正在使用 Synology Diskstation 及其类似 Linux 的操作系统。
我的调查:
- 我跑了
echo exec("whoami");
。它回来了http
。显然,apache 用户名为http
。 然后我修改了该
/etc/sudoers
文件,以便授予用户所有所需的权限。我的 Linux 发行版没有visudo
,所以我必须手动编辑它。现在看起来像这样:# Enable logging of a command's output. # Use sudoreplay to play back logged sessions. Defaults syslog=authpriv # Allow root to execute any command root ALL=(ALL) ALL # Allow members of group administrators to execute any command %administrators ALL=(ALL) ALL # Configure privilege of wheel group Cmnd_Alias SHELL = /bin/ash, /bin/sh, /bin/bash Cmnd_Alias SU = /usr/bin/su %wheel ALL=(ALL) NOPASSWD: ALL, !SHELL, !SU http ALL=NOPASSWD: /bin/sudo, /bin/echo, /usr/bin/sudo, /usr/bin/echo
如何使用 PHP 成功运行此命令?提前致谢!
答案1
我做了一个实验,并且shell_exec()
正在使用sh
,正如 @thrig 在上面的评论中所怀疑的那样。在您的 Synology Diskstation 上,可能无法使用(或支持的东西)/bin/sh
实现。bash
/dev/tcp/...
这个的一个变体似乎对我有用:
shell_exec("bash -c 'echo foobar > /dev/tcp/192.168.178.41/8080'")