我的调查:

我的调查:

我想使用 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'")

相关内容