私はこのphpコードを使用しています:
exec("unrar e file.rar",$ret,$code);
そして、不正なコマンドのエラーコード、つまり127を取得しています...しかし、sshを介してこのコマンドを使用している場合、サーバーにunrarがインストールされているため...誰もがなぜexecが正しいことをしていないのか推測できますか?
アプリケーションの直接パス (/usr/bin/unrar など) を使用してみてください。php がアプリケーションを見つけられないようです。
Apache と php を chroot した場合は、chroot した環境に /bin/sh も配置する必要があります。そうしないと、exec() または passthru() が正しく機能せず、エラー コード 127、ファイルが見つかりませんが生成されます。
これはGoogleでトップの回答として出てくるので、修正を共有したいと思いました:
私が行った簡単な修正は、php.ini ファイルで safe_mode を無効にすることでした。
; Safe Mode
; http://www.php.net/manual/en/ini.sect.safe-mode.php#ini.safe-mode
safe_mode = Off
あなたの応答に感謝します!!
私はこれを試しました
//somedir is inside the directory where php file is
chdir("somedir");
exec("/home/username/bin/unrar e /home/path/to/dir/file.rar");
そして今、それは終了コードを返しませんでした...他のコマンドはファイルを実行しています..私はmkdirなどを試しました..:s
他の誰かがまだこの問題を抱えている場合に備えて、ここの投稿を見てください。
http://gallery.menalto.com/node/2639#comment-8638
見積もり:
問題が見つかりました。問題は、私のセキュリティ偏執症の OpenBSD でした。3.1 から 3.2 にアップグレードする際に、以下が追加されました。
- Apache はデフォルトで chroot されて実行されます。これを無効にするには、新しい -u オプションを参照してください。
chroot により、Apache はディレクトリの外部にアクセスできなくなりました。そのため、netpbm を含むすべてを apache ディレクトリに移動しました。すべてがアクセス可能で実行可能でしたが、exec() が常に 127 を返したため、何らかの「セーフ モード」のままだったと思います。
とにかく、 -u オプションを指定して httpd を実行すると、安全性の低い chroot されていない apache 起動に戻り、exec() が再び機能するようになりました。
ohkiee guyz ありがとうございます ...そして、はい、$PATH にエラーが発生する可能性があります ...しかし、指定されたフル パスでは機能します :)
exec("/home/user/bin/unrar e /home/user/xxx/yyy/file.rar");