私の調査:

私の調査:

shell_exec()PHP関数を使用して一部のコンテンツをローカルソケットに送信したいと思います。

私の現在のアプローチは次のとおりです。

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

私は実験をしており、上記のコメントで@thrigが疑ったものを正確に使用していshell_exec()ます。shSynology Diskstation ではこれができないか、サポートされていない可能性があります/bin/shbash/dev/tcp/...

これのバリエーションが私にとって効果的なようです。

shell_exec("bash -c 'echo foobar > /dev/tcp/192.168.178.41/8080'")

関連情報