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()
ます。sh
Synology Diskstation ではこれができないか、サポートされていない可能性があります/bin/sh
。bash
/dev/tcp/...
これのバリエーションが私にとって効果的なようです。
shell_exec("bash -c 'echo foobar > /dev/tcp/192.168.178.41/8080'")