0

私たちの先生はウェブサーバーを持っていて、私たちはいくつかのことをテストすることができます. Putty でサーバーに接続し、次のコマンドを試しました。

echo "i 4 r 255 g 0 b 0." > /dev/ttyACM0

ttyACM0ストリームをシリアル インターフェイスにリダイレクトする仮想ファイルです。この特定のコマンドは、RGB LED の色を変更します。execしかし、同じコマンドは php ではorでは機能しませんshell_exec:

<?php
    // Script saved at /home/STUDENT_NAME/public_html/blink.php
    echo shell_exec("echo \"i 4 r 255 g 0 b 0.\" > /dev/ttyACM0"); // Doesn't work
    echo shell_exec("echo \"Hello\""); // Returns "Hello"
?>

2番目の呼び出しが機能するため、私はそれを知ってexecおり、shell_exec無効になっていませんshell_exec。私の次のアイデアは を使用するfopen("php://memory", "a");ことでしたが、これらのラッパーの使用方法がわかりません。だから私の質問:

  • これらのラッパーを正しく使用するには? (多分好き"php://memory/dev/ttyACM0"
  • より良い解決策はありますか?
4

1 に答える 1

1

Web を介してファイルで作業する場合、すべてのファイル アクセスは、Web サーバーを実行しているユーザーを介して実行されます。これは、PuTTY を介してログインするユーザーとは異なる可能性があります。したがって、許可の問題が発生している可能性があります。tty デバイスの権限を確認します。

ls -l /dev/ttyACM0

グループで書き込み可能になると思いますので、グループに注意して、ユーザーがそのグループに属しているかどうかを確認してください。

グループ

次に、HTTP サーバーを実行しているユーザーが同じ権限を持っているかどうかを確認します。

ps補助 | grep http

これにより、名前にhttpを含むすべてのプロセスのリストが表示され、Web サーバーがその中にある可能性があります。それを特定すると、対応する行の最初の列で、Web サーバーが使用しているユーザーがわかります。それがapacheであるとしましょう。今実行します:

グループアパッチ

(または、前のステップで発見したもの) これにより、ユーザーが属しているグループが表示されます。ttyACM0 が属しているグループは、それらのグループに含まれていないはずです。ユーザーをグループに追加するには、システム管理者に依頼する必要があります。

とにかくshell_exec、そのコンテキストで使用することは非常に悪い習慣です。シリアルデバイスを開いて書き込むことができると思います:

$fp = fopen ("/dev/ttyACM0", "w");
fwrite ($fp, "i 4 r 255 g 0 b 0.\n");
fclose ($fp);

もちろん、HTTP サーバーのユーザーがデバイスへの書き込み権限を持っていない場合、これは機能しません。また、 のライン ターミネーションに注意してfwrite()ください。それが必要な場合もそうでない場合もあり、別のものが必要な場合もあります (\rまたは\r\n)。

于 2014-09-22T15:19:26.503 に答える