• ベストアンサー

PHPでUNIXシステムコマンドをコールする方法

PHPでWeb Serverアプリケーションを作っています。 PHPでUNIXシステムコマンドを実行することはできますでしょうか? 具体的に何をしたいかというと、動的に作られるページだとgoogle等に登録されるまで時間かかるので、 あるページに情報が登録されるたびに、wgetで動的ページをファイルに吐き出して、検索はgrepで引っ掛けて、内部的に処理したいと考えております。 (1)PHPで、wgetを呼び出して、ファイルに吐き出すこと (2)Webページで、検索フィールドに文字を入力すると 入力文字がgrepの引数に渡されて、その結果をPHPで 受けること を実現する方法はございますでしょうか。

  • kbr
  • お礼率43% (28/65)
  • PHP
  • 回答数2
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • galluda
  • ベストアンサー率35% (440/1242)
回答No.1

がると申します。 とりあえず、バッククォートまたは shell_exec という関数を用いることで、任意のコマンドが発行できます。 http://php.s3.to/man/function.shell-exec.html あたりをご覧下さい。 なお、設計次第では「OSインジェクション」などのセキュリティホールを生みますので、どうぞご注意くださいませ。

kbr
質問者

お礼

ありがとうございます。 SQLインジェクションだけでなく、OSインジェクションというのもあるんですね。 勉強させていただきます

その他の回答 (1)

回答No.2

あなたがサーバ管理者であるなら、全てのコマンドを利用する事が出来ます。 #1さんの指摘通り、セキュリティには万全の注意をする必要があります。 関数としては exec、shell_exec 等のプログラム実行関数があります。 http://php.s3.to/man/ref.exec.html ここで注意しなくてはいけないのは、この関数はPHPが動いている環境、おそらくapacheやnobodyの実行権限でされるという事です。今回の質問者さんのやりたいことですと、一般ユーザ権限で出来るwgetやgrepなので特に問題はありませんが、実行権限のないコマンド、例えばuseraddとか、passwdとかは、sodoを使って実行権限を委譲すれば、WEBからも実行可能です。sodoの使い方は長くなるので説明は省きます。 繰り返しますが、プログラム実行関数は非常に大きなセキュリティホールになる可能性がありますので、くれぐれも気をつけて下さい。 別にシェルスクリプトを作ってWEBディレクトリ以外に作成しておいて、実行権限をPHP(WEB、通常nobodyかapache)にしておいて、それを呼び出す、というのが比較的安全かもしれません。 なお、質問者さんのやりたい事ですと、curl関数でファイルに保存し、namazuモジュールで検索、という方法も考えられると思います。 curl関数 http://www.php.net/manual/ja/ref.curl.php PHPでnamazu http://suwako.plala.jp/pukiwiki/index.php?%5B%5BPHP%A4%C7Namazu%5D%5D

参考URL:
http://taketan.mydns.jp/xoops/modules/bwiki/?PHP
kbr
質問者

お礼

ありがとうございます。 やはりセキュリティには気をつけないといけませんね。 namazuをPHPで呼び出すのを調べたのですが、 UNIX用のnamazu呼び出しモジュールが現在公開されていないようです。

関連するQ&A

  • unixのfindコマンド

    unixのfindコマンドで、ある複数のディレクトリから指定のファイル名だけを 検索し、その結果をgrepしたいのですが、 例えば 01_dir 02_dir : 11_di : 21_dir : と言うディレクトリがあります。 そこから、「0」で始まっているディレクトリの中なら拡張子が*.txtを 検索し、その検索したファイルに対して、grepを実行したいのですが、 上手くいきません。 もちろん、各ディレクトリには、「.txt」以外のファイルもありますし、 ファイル名にも条件を付与したいです。 以下の様に、 find . -name "0*_dir" -type d -print | xargs ls -l *.txt | grep "検索文字" find . -name "0*_dir" -type d -print | xargs ls *.txt | grep "検索文字" find . -name "0*_dir" -type d -print | xargs -i ls -l '{} /*.txt' | grep "検索文字" find . -name "0*_dir" -type d -print | xargs -i ls {} "検索文字" とやってみたのですがだめでした。 find ./ -type d \( -name '1_*dir' -o -name '2*_dir' -o -name '3*_dir' \) -prune -o -type f -print と「-prune」で除外するディレクトリを指定すればできなくはないですが、 すべてのディレクトリ書くのはいい方法ではないです。 よい方法をお願いします。 OSは、Solaris 11.3です。

  • UNIXコマンドwgetについての質問です

    UNIXコマンドのwgetを用いてGoogleの検索結果ページを取得したいのですが、エラーが返ってきてしまいます。 打ち込んだコマンドは「wget 取得したいURL」という形式です。 他の一般的なWebページは問題なく取得することができました。 Googleの検索結果ページを取得する際には何か他にオプションなどが必要なのでしょうか。 解決策わかる方、ご回答よろしくお願いします。

  • UNIXコマンド "grep" "find" の使い方教えて下さい。

    1)以下(1)、(2)を検索したいとします。  (1)"wrk_str"という文字列の記述があるファイル名  (2)tmp_file.c という名前のファイル名 2)ディレクトリ構成が以下になってるとします。  /home/users/複数のディレクトリが存在/複数のディレクトリが存在/複数のファイルが存在 3)/home/users/ 配下に検索したい文字列、ファイルがあるとした場合、どのように   探せばいいでしょうか?   /home/users/配下で得に条件なしでgrepすると、"Arg list too long"(量が多い?)の   メッセージが出て、検索できませんでした。 UNIXコマンドに詳しい方、宜しくお願いします。 それ以外にも、色々検索方法知っていたら教えて下さい!!

  • [PHP][XAMPP]でUnixコマンドを使う方

    windows10が入っているPCにxamppをインストールして使っています。 エディタはVSCodeを使って学習しています。 ここでループや条件分岐等の基礎文法や、ceil,mt_rand, sprintf, sort, などのビルドイン関数の学習をしていました。問題なく動作します。 が、途中で学習項目が以下のようなUnixコマンドを使ってファイルに文字を書き込んだり、ディレクトリ操作、Unixタイムスタンプや日時を扱う関数の項目にはいりました。 fopen(),fwrite(),fclose(),fread(),file_get_contents(),file(),opendir(), readdir() 当然、今までのようにエディタでは動作しません。 xamppの「Shell」を開いてみると「Xampp for Windows」が開きます。 ここでも'ls'はじめ上記のようなコマンドは動いてくれません。 Unixコマンドを使う方法を調べているとubuntsというLinuxディストリビューションをインストールしました。とりあえずこれを使えばUnixコマンドは使えるようです。実際は少し前に入れていたものなのですが、 このubuntsのコマンドラインに pwd と打つと xx-00@DESKTOP-XXX:^$ pwd /home/xx-00 このように表示されます。 現在 C://:xampp/htcdocs/ 内に学習用フォルダを作成してxamppを使いphpを学習しています。 たとえば c:> xampp/htcdocs/php/study フォルダとします。 ubuntsのルートディレクトリ /home/xx-00 をxamppと同じ c:> xampp/htcdocs/php/study に変更してやると統合? 現在の環境でUnixコマンドが使えるようになりますか? もしご存じでしたら教えて下さい。 基本的に初心者で自分自身が詳しくわかっていません。 教材は添付画像のようになっています。 これと同じ環境を作りたいと考えています。 考え方が根本的に間違っているのかもしれません。その場合現在のWindows10にXamppを入れた環境でunixコマンドを利用する方法が別に何かありますか? 教材は添付画像のようになっています。 これと同じ環境を作りたいと考えています。よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • UNIXで文字コードの検索は可能ですか?

    UNIXマシンで、ディレクトリを再帰的に探し、SJISで書かれたファイル一覧を取得したいのですが、どのように検索すれば良いでしょうか? とりあえず、ディレクトリ内だけでもOKです。 grep ^M *とやってみたのですが、 grep: html: Is a directory としたでず、どのファイルがSJISなのかわかりませんでした。よろしくお願いします。

  • unixのperlで

    UNIXのPerlでは引数は@ARGVに入ると思うのですが、 a.pl *.c "*.c" という引数を入れるとファイルが展開されそのフォルダの中の "12-1.c" とか "12-2.c" とかいう引数が、配列に1つずつ入ってきました。 引数の文字列を何の修正もなしに(できればスペースも)受け取る方法はないですか?

    • ベストアンサー
    • Perl
  • PHP 引数の使い方

    PHPファイルどうしで引数を共有する方法を教えてください。 例えば、 「sample001.php」では、 <form action="sample002.php" method="post"> <input type="text" name="word" size="30"> <input type="submit" value="登録"> のタグによって文字列を入力し登録します。 「sample002.php」では、 $arr_word = $_POST["word"]; により、入力された文字列が“$arr_word”に格納されます。 「sample003.php」でも 入力された文字列を使いたい場合は、どうすればよいですか? “$arr_word” もしくは $_POST["word"] もしくは action="sample003.php"  を活用することでできるのでしょうか? PHPはまだまだ初心者です。教えてください。

    • ベストアンサー
    • PHP
  • linuxのgrepコマンドに関して

    linuxのgrepコマンドに関して ファイルの中から、1や2という文字が単独で存在する行を検索したくて grep 1 file名 とするのですが、そうすると11や23など文字が単独ではなく、含まれている行が出力されます。 含まれる、ではなく文字そのものを検索するにはどうしたらよいでしょうか?

  • PHPによる検索システムでの文字化けについて

    PHPによる検索システムでの文字化けについて 現在、ダウンロード販売によるシェアソフトを利用し、PHPによる検索システムを作成しています。 (掲示板のようなフォームから登録するとHTMLを自動生成し、そのHTMLから一覧を自動生成、検索が行える、といったシステムです。) このソフトは作成時の文字コードをShift_JIS又はEUC-JPにユーザーが自由に選択出来るようになっているのですが、困ったことにどちらを選択しても一部の文字が文字化けを起こしてしまいます。 (Shift_JISの場合に文字化けする語句と、EUC-JPの場合に文字化けする語句は違います。) 現在のところShift_JISで作成しています。 (検索システムを導入するサイトの他のページをShift_JISに統一しているためShift_JISにしました。) ファイル構造としましては、 <form>のactionで実行されるphpファイル 登録したデータが格納されているHTMLファイル 登録したデータを流し込んで表示するテンプレート(HTMLファイル) 登録画面のテンプレート(HTMLファイル) といった形で、HTMLファイルは全てformのaction属性によりPHPファイルを実行するようになっています。 色々と検索をして調べてみましたが、PHPを介している限り、文字化けを防止するのはPHPファイルを編集するしか方法はないのでしょうか。 というのも、PHPファイルは全て暗号化されており、こちらでは編集が出来ません。 HTMLファイルは自由に編集が可能です。 こちらでもJavaScriptのreplace関数を使った置換やformにaccept-charset属性を追加するなど、色々と試してみましたが、やはり上手く行きませんでした。 ソフト制作会社には問い合わせを入れているのですが、何度問い合わせを入れても「調査中です」といってかれこれ1ヶ月以上経ちますが、解決策は打ち出されておりません。 こちらの環境はWindowsXP、IE8です。 質問内容に不備などありましたら申し訳ありません。 もし何か方法をご存知の方がいらっしゃいましたら、ご教授頂けますでしょうか。 よろしくお願い致します。

    • ベストアンサー
    • PHP
  • PHPでUNIXコマンドを発行してファイルへ追記できない

    PHPでUNIXコマンドを発行してファイルへ追記できない 現在,/etc/aliasesファイルへ,PHPから文字列を追加したいのですが,うまくいかず,皆様のお知恵を頂ければと思います. 現在,sudoersにapacheユーザを追加しており,パスワードを渡せば全権限を持たせています. それで,PHP上で $command = "echo '".___APACHEPASS___."' | sudo -S cp /etc/aliases /etc/alias_bak/aliases.bak.".date("YmdHis"); exec($command, $output); とすれば,aliasesファイルのバックアップファイルが生成されます. ところが,文字列を追記するため,コマンド $command = "echo '".___APACHEPASS___."' | sudo -S echo '{$_POST['user_name']}: | /var/www/html/test.php' >> /etc/aliases"; を発行しても追記されません. バックアップファイルコマンドが実行されれば,/var/log/secureにログが残りますが,追記コマンドでは失敗のログすら記録されていません. なお,コマンド自体を表示させると, echo 'apache-password' | sudo -S echo 'user-name: | /var/www/html/test.php' >> /etc/aliases となっており,rootのコマンドラインで echo 'user-name: | /var/www/html/test.php' >> /etc/aliases を実行すれば,正常に追記されます. 乱文となってしまいましたが,追記されない原因の見当がついたかた,ご教授頂けると幸いです. よろしくお願い致します.

専門家に質問してみよう