これは大きな命令です。よりよく理解できるように、代わりにこれをお勧めします。次のコードでは、すべてのシェル引数が適切にエスケープされ、攻撃を受けないようにするために、escapeshellarg を頻繁に使用しています。これは、変数が信頼されているかどうかにも依存しますが、各引数変数が実際に複数の引数またはその他のあまり一般的でないもので構成されていない限り、問題はありません。
<?php
$result = shell_exec(
'parallel-ssh -h master.txt "-O StrictHostKeyChecking=no" ' . // SSH command
'-t 5 ' . // 5 second timeout on each host
'-l divx ' . // User
'-i ' . // Inline mode used for troubleshooting.. Take this out once it works.
'-P ' . // Print the output. This will only return it so it is stored in $result
escapeshellarg(
'perl /mnt/nas-storage/EncoderSetup/commTools/con.pl ' . // Executes a perl file
escapeshellarg($input) . ' ' . // $input arg to perl command
escapeshellarg($output) . ' ' . // $output arg to perl command
escapeshellarg($intraperiod) . ' ' . // $intraperiod arg to perl command
escapeshellarg($res) . ' ' . // $res arg to perl command
escapeshellarg($qp) . ' ' . // $qp arg to perl command
escapeshellarg($framerate) . ' ' . // $framerate arg to perl command
escapeshellarg($startframe) . ' ' . // $startframe arg to perl command
escapeshellarg($numgop) . ' ' . // $numgop arg to perl command
escapeshellarg($enc) . ' ' . // $enc arg to perl command
escapeshellarg($cfg) . ' ' . // $cfg arg to perl command
escapeshellarg($sao) . ' ' . // $sao arg to perl command
escapeshellarg($wafrosync) . ' ' . // $wafrosync arg to perl command
escapeshellarg($amp) . ' ' . // $amp arg to perl command
escapeshellarg($tmvp) . ' ' . // $tmvp arg to perl command
escapeshellarg($transkp) . ' ' . // $transkp arg to perl command
escapeshellarg($fasttranskp) . ' ' . // $fasttranskp arg to perl command
escapeshellarg($goploc) // $goploc arg to perl command
)
);
print $result;
これでうまくいくはずですが、考慮すべき点がいくつかあります。まず、それを実行して $result を出力し、実際の出力を確認します。次のようなものが得られた場合
[FAILURE] server.hostname Exited with error code 255
次に、pssh が各ホストのパスワードを要求している可能性があります。パスワードを要求する -A オプションを使用していることに気付きました。php の shell_exec でこれを行うことはできません。これは、スクリプトがハングして、パスワードを永久に待機するためです。代わりに、最初のクラウド サーバーがパスワードなしで他のクラウド サーバーに ssh 接続できるように、SSH キーをセットアップする必要があります。SSH 公開鍵ベースの認証の設定は、実際には非常に簡単です。ただし、これまでに行ったことがない場合はそうではありません。設定方法に関する記事がたくさんあると思います。手順は基本的に次のとおりです。
公開鍵と秘密鍵を生成します (パスフレーズなし)。
- 最初のクラウド サーバーで次のコマンドを入力します。
ssh-keygen
- パスフレーズを求められたら入力しないでください
id_rsa.pub ファイルを各セカンダリ クラウド サーバーの ~/.ssh/authorized_keys ファイルにコピーします。
各クラウド サーバーで .ssh フォルダーに 700 のアクセス許可があることを確認します。
.ssh/authorized_keys ファイルに、各クラウド サーバーで 600 のアクセス許可があることを確認します。
すべてが計画通りに進んだ場合、メインのクラウド サーバーから各クラウド サーバーでパスワードなしで安全にコマンドを実行できるはずです。これで、コマンドを実行するだけで動作するはずです.... または、少なくとも、実行されなかった理由についての出力が得られるので、トラブルシューティングを続けることができます。
もう 1 つの問題は、shell_exec を実行するユーザーです。メインのクラウド サーバーで Web サーバーを実行している場合は、現在のユーザー (通常は apache) が .ssh フォルダーに id_rsa ファイルを持っていることを確認する必要があります。 )。したがって、id_rsa ファイルを /var/www/.ssh/ フォルダーに置き、それが apache によって所有されていることを確認します。また、それを保護するために chmod 600 であることを確認してください。
id_rsa ファイルの保護など、他にもセキュリティ上の懸念事項があります。サーバー上で信頼できないスクリプトを実行したり、自分の Web サイト用に自分のファイルをアップロードするユーザーに対して仮想ホストを使用したりしないでください。apache として実行されるスクリプトは簡単にアクセスして、id_rsa ファイルを危険にさらす可能性があるため、セキュリティ上の懸念が生じます。このファイルにアクセスできる人は誰でも、各クラウド サーバーに簡単にアクセスできます。そのため、ファイルの保護を軽視しないでください。