PHP_PHP チュートリアルでシステム外部コマンドを実行する

WBOY
リリース: 2016-07-13 17:28:28
オリジナル
786 人が閲覧しました

PHP はサーバー側のスクリプト言語として、単純または複雑な動的 Web ページの作成などのタスクを完全に実行できます。ただし、常にそうとは限りません。場合によっては、特定の機能を実装するために、半分の労力で 2 倍の結果を得ることができるように、オペレーティング システムの外部プログラム (またはコマンド) に頼らなければなりません。 では、PHP スクリプトで外部コマンドを呼び出すことは可能でしょうか?もしそうなら、どうすればいいですか?どのような懸念がありますか?この記事を読めば、きっとこれらの疑問に答えられると思います。 出来ますか? 答えは「はい」です。 PHP は、他のプログラミング言語と同様に、プログラム内で外部コマンドを呼び出すことができます。呼び出しは非常に簡単です。1 つまたはいくつかの関数を使用するだけです。 前提条件 PHP は基本的に WEB プログラム開発に使用されるため、セキュリティは重要な考慮事項となっています。そこで、PHP 設計者は PHP への扉、つまりセーフ モードを追加しました。セーフ モードで実行する場合、PHP スクリプトには次の 4 つの制限が適用されます。 セーフ モードでは、MySQL データベースに接続する外部プログラムのみが実行されます。特定のディレクトリを実行することはできますが、他のプログラムへの呼び出しは拒否されます。このディレクトリは、php.ini ファイルのsafe_mode_exec_dir ディレクティブを使用するか、PHP のコンパイル時に --with-exec-dir オプションを追加することで指定できます。デフォルトは /usr/local/php/bin です。 結果を出力できるはずの外部コマンド (PHP スクリプトにエラーがないことを意味します) を呼び出しても空白が表示される場合は、ネットワーク管理者が PHP をセーフ モードで実行している可能性があります。 実行する方法? PHP で外部コマンドを呼び出すには、次の 3 つの方法を使用できます。 1) PHP が提供する特殊関数を使用する PHP には、外部コマンドを実行するための合計 3 つの特殊関数 (system()、exec()、および passthru()) が用意されています。 。 system() プロトタイプ: string system (string command [, int return_var]) system() 関数は、他の言語の関数と似ており、指定されたコマンドを実行し、結果を出力します。 2 番目のパラメーターはオプションであり、コマンドの実行後にステータス コードを取得するために使用されます。 例: system("/usr/local/bin/webalizer/webalizer"); ?> exec() プロトタイプ: string exec (string command [, string array [, int return_var]]) exec() 関数は system に似ています。 () も指定されたコマンドを実行しますが、結果は出力されず、結果の最後の行が返されます。コマンド結果の最後の行のみを返しますが、2 番目のパラメーター配列を使用すると、配列の最後に結果を 1 行ずつ追加することで完全な結果を取得できます。したがって、配列が空でない場合は、呼び出す前に unset() を使用して配列をクリアするのが最善です。第3パラメータは第2パラメータを指定した場合のみ、コマンド実行時のステータスコードを取得できます。 例: exec("/bin/ls -l"); exec("/bin/ls -l", $res); () プロトタイプ: void passthru (string command [, int return_var]) passthru() はコマンドを呼び出すだけで結果は返さず、コマンドの実行結果をそのまま標準出力装置に直接出力します。したがって、 passthru() 関数は、pbmplus (元の画像のバイナリ ストリームを出力する、Unix で画像を処理するツール) のようなプログラムを呼び出すためによく使用されます。コマンド実行時のステータスコードも取得できます。 例: header("Content-type: image/gif"); passthru("./ppmtogif Hunte.ppm"); ?> 2) Popen() 関数を使用してプロセスを開くだけです。コマンドを使用できますが、コマンドと対話することはできません。ただし、コマンドに何かを入力する必要がある場合があります。たとえば、Linux システム ユーザーを追加する場合、su を呼び出して現在のユーザーを root に変更する必要があり、su コマンドはコマンド ラインに root パスワードを入力する必要があります。この場合、明らかに上記の方法を使用することはできません。 Popen() 関数は、プロセス パイプを開いて指定されたコマンドを実行し、ファイル ハンドルを返します。ファイルハンドルが返されるので、読み書きが可能です。 PHP3 では、この種のハンドルは書き込みまたは読み取りの 1 つの操作モードでのみ使用できますが、PHP4 以降は読み取りと書き込みを同時に行うことができます。ハンドルが 1 つのモード (読み取りまたは書き込み) で開かれていない限り、ハンドルを閉じるには pclose() 関数を呼び出す必要があります。 例 1: $fp=popen("/bin/ls -l", "r"); ?> 例 2 (この例は、PHP China Alliance の Web サイト http://www.phpx.com/show.php? から引用しています。 d= col&i=51): /* PHP でシステム ユーザーを追加する方法 以下は、james という名前のユーザーを追加するルーチンです。root パスワードは非常に優れています。参考のみ*/ $sucommand = "su --login root --command"; $useradd = "verygood"; $user = "james"; %s"",$sucommand,$useradd,$user); $fp = @popen($user_add,"w"); @pclose($fp); ) バッククォート (~ と同じ、キーボードの ESC キーの下にある `) を使用します。この方法はこれまで PHP ドキュメントに記載されておらず、秘密のテクニックとして存在します。方法は非常に簡単です。実行するコマンドを 2 つのバックティックで囲み、この式の値がコマンドの実行結果になります。例: $res=/bin/ls -l; echo .$res ; ?> このスクリプトの出力は次のようになります。 考慮すべき問題は 2 つあります: セキュリティとタイムアウトです。 まずは安全性を見てみましょう。たとえば、小規模なオンライン ストアを運営しており、販売可能な製品のリストがファイルに保存されているとします。ユーザーに電子メール アドレスの入力を求め、製品のリストを送信するフォームを含む HTML ファイルを作成します。 PHP の mail() 関数を使用したことがない (または聞いたことがない) と仮定すると、Linux/Unix システムのメール プログラムを呼び出してこのファイルを送信します。プログラムは次のようなものです: system("mail $to このコードを使用しても一般のユーザーには危険はありませんが、実際には非常に大きなセキュリティ ホールがあります。悪意のあるユーザーがそのような EMAIL アドレスを入力した場合: --bla ; somebody@domain.com にメールを送信して )、ファイルから読み取ります ( /tmp/null &"); ?>

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/531771.html技術記事 PHP はサーバー側のスクリプト言語として、単純または複雑な動的 Web ページの作成などのタスクを完全に実行できます。でも、物事はいつもこうであるとは限らず、時には何かを達成するために...
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!