基礎

PHPの実行演算子(バッククォート)|OSコマンドを実行する方法

PHPの実行演算子は、バッククォート(`)で文字列を囲むことで、その文字列をOSのシェルコマンドとして実行し、結果を取得できる構文です。shell_exec() 関数と同じ動作をしますが、より短く書けるのが特徴です。

サーバー管理スクリプトやバッチ処理など、PHPからシステムコマンドを呼び出す必要がある場面で使われます。ただし、セキュリティ上のリスクが伴うため、使用には細心の注意が必要です。

基本的な使い方

バッククォートで囲んだ文字列がシェルコマンドとして実行され、その出力が文字列として返されます。

PHP
<?php
// 現在のディレクトリの一覧を取得
$output = `ls -la`;
echo $output;

// shell_exec()と同じ動作
$output2 = shell_exec("ls -la");
echo $output2;
実行結果
total 8
drwxr-xr-x  3 user  staff  96 Feb 19 10:00 .
drwxr-xr-x  5 user  staff 160 Feb 19 10:00 ..
-rw-r--r--  1 user  staff 100 Feb 19 10:00 test.php
...

バッククォートの中にはPHPの変数も埋め込めます。ダブルクォートの文字列と同様に、変数が展開されます。

変数を埋め込む

PHP
<?php
$dir = "/tmp";
$result = `ls {$dir}`;
echo "一時ディレクトリの内容:\n";
echo $result;

// 日付コマンドの実行
$format = "+%Y-%m-%d %H:%M:%S";
$now = `date "{$format}"`;
echo "現在時刻: " . trim($now) . "\n";
実行結果
一時ディレクトリの内容:
(/tmpディレクトリの内容が表示される)
現在時刻: 2026-02-19 10:00:00

shell_exec()との比較と他のコマンド実行関数

PHPにはコマンド実行の手段が複数あります。

PHP
<?php
// 1. バッククォート(実行演算子):出力を文字列で取得
$output1 = `echo "hello"`;
echo "バッククォート: " . trim($output1) . "\n";

// 2. shell_exec():バッククォートと同じ
$output2 = shell_exec('echo "hello"');
echo "shell_exec: " . trim($output2) . "\n";

// 3. exec():最後の行のみ取得。全行は配列で受け取れる
$lines = [];
$returnCode = 0;
exec('echo "line1" && echo "line2"', $lines, $returnCode);
echo "exec: " . implode(", ", $lines) . "(終了コード: {$returnCode})\n";

// 4. system():出力を直接表示し、最後の行を返す
echo "system: ";
$lastLine = system('echo "hello from system"');
echo "\n";
実行結果
バッククォート: hello
shell_exec: hello
exec: line1, line2(終了コード: 0)
system: hello from system

セキュリティ対策

ユーザー入力をコマンドに含める場合は、必ずエスケープ処理を行います。

PHP
<?php
// 危険な例(絶対にやってはいけない)
// $userInput = $_GET["file"];
// $output = `cat $userInput`;  // コマンドインジェクションの危険!

// 安全な例:escapeshellarg()でエスケープ
$filename = "test file.txt";
$safeFilename = escapeshellarg($filename);
echo "エスケープ後: " . $safeFilename . "\n";

// escapeshellcmd()でコマンド全体をエスケープ
$command = "ls -la /tmp";
$safeCommand = escapeshellcmd($command);
echo "コマンド: " . $safeCommand . "\n";
実行結果
エスケープ後: 'test file.txt'
コマンド: ls -la /tmp
コマンドインジェクションに注意

ユーザーからの入力値をそのままコマンドに埋め込むと、任意のコマンドが実行されるコマンドインジェクション攻撃を受ける可能性があります。必ず escapeshellarg()escapeshellcmd() でエスケープするか、ホワイトリスト方式で入力を制限してください。

使用できない環境

php.inidisable_functionsshell_exec が無効化されている場合、バッククォート演算子も使用できません。共有ホスティング環境では、セキュリティ上の理由からコマンド実行関数が制限されていることが多いです。

まとめ

  • バッククォート `コマンド` でシェルコマンドを実行し、出力を文字列で取得できる
  • shell_exec() と同じ動作で、変数の埋め込みも可能
  • exec(), system(), passthru() など他のコマンド実行関数もある
  • ユーザー入力は必ず escapeshellarg() でエスケープする
  • セキュリティリスクが高いため、コマンド実行は必要最低限に留める