人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

PHPで書いたスクリプトです。
- foo.php -
<?php
exec("ls -la");
?>
これをコマンドラインから php -f foo.php と叩いたところ、
sh: /ls: No such file or directory
というエラーになります。PHP 4.3.9 (cgi)です。
何が原因でしょうか?

●質問者: orihomot
●カテゴリ:インターネット ウェブ制作
✍キーワード:CGI LA LS PHP sh
○ 状態 :終了
└ 回答数 : 4/4件

▽最新の回答へ

1 ● pahoo
●23ポイント

エラーメッセージを見ると、shがルートにlsを探しに行っているようですが、

  1. safe_mode が ON になっており、かつ、safe_mode_exec_dir に正しいパスが指定されていないということはありませんか?
  2. コマンドラインPHPは、CLI版とCGI版のどちらを使っていますか?
◎質問者からの返答

ありがとうございました。

safe_mode は ON になっており、かつ、safe_mode_exec_dir は空白になっているようです。

コマンドラインPHPはCGI版だと思われます。


2 ● taku_j_7
●23ポイント

恐らくUnixコマンドを実行して、実行結果を格納するという流れだと思いますが、

execはあくまで「プログラムを実行する」関数ですので、Unixコマンドを直接実行できません。

別ソースのプログラムを起動する際に使います。


PHPからUnixコマンドを直接呼び出す場合は「shell_exec」を使います。

http://php.s3.to/man/function.shell-exec.html

http://manual.xwd.jp/function.shell-exec.html

今回の場合、下記のような感じですね。


$str = shell_exec('ls -la');

echo "$str";


尚、Unixコマンドの実行を許可するという事は「OSインジェクション」という脆弱性にも繋がるので、

セキュリティの対策は十分に気をつけて下さい。作り方によっては最悪、rootを奪取されてしまいます。

◎質問者からの返答

ありがとうございます。

実は本当に実行したいのはImageMagickのコマンドでして、それがうまくいかず

試しにサンプルのような簡単なものを書いて実行してみても同じ結果だったので

原因は同じところにあるのかなと思っていました。


3 ● y-kawaz
●22ポイント

lsコマンドにPATHが通ってないだけかと思います。

以下のようにフルパスで指定してみてはどうでしょうか。

exec("/bin/ls -la")
◎質問者からの返答

ありがとうございます。

フルパスを指定しても結果は同じでした。


4 ● pahoo
●22ポイント

safe_mode が ON の状態はセーフモードと呼ばれており、「セーフモードにより制限を受けるか無効となる関数」に明記されており通り、exec 関数は

safe_mode_exec_dir の中でのみ実行可能です。現実的な理由により、現在、実行パスに ..を含めることは許可されていません。

ということになります。

ところが、ls はシェル内コマンドですので、うまく指定してやることができません。


根本的な解決策としては、safe_mode を OFF にすることです。

セキュリティ上の関係などで OFF にできない場合は、safe_mode_exec_dir に ImageMagick のパスを通してやれば、とりあえず ImageMagick だけでも動くようになるはずです。

もし動かないようでしたら原因は別にあると思うので、結果をお知らせください。


※設定された回答回数の上限になりました。さらにフォローが必要でしたら、コメント欄を開けていただくか、回答回数を増やしてください。

◎質問者からの返答

ありがとうございます。

結局、php.iniのsafe_mode_exec_dirにImageMagickの存在するパスを設定してあげただけで解決しました。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ