0

そのため、5 台のクラウド マシンを実行しており、最初の 1 台は apache サーバーとしてセットアップしています。私の目標は、ユーザーが Web ページの送信ボタンをクリックすることです。これにより、最初のマシンで並列 ssh が実行され、他のクラウド マシンでスクリプトが起動されます。Web ページを実行し、スクリプトを実行しています。これは、index.php から parallel-ssh を起動しようとする試みです。

したがって、「master.txt」は、他のクラウド マシンに関する情報を保持する 1 番目のクラウド マシンにあります。StrictHostKeyChecking は、セキュリティ チェックを無視するために使用されます。そして、perl コマンドは、すべてのクラウド マシンで起動されるものです。私はこの質問がかなり混乱していることを知っていますが、私はphpとperlの両方に慣れていないので、このプロジェクトの答えが本当に必要です. 申し訳ありませんが、これは 1 つの大きなコマンドですが、ここでは表示されないため、複数の行に分割する必要がありました。

4

2 に答える 2

0

これは大きな命令です。よりよく理解できるように、代わりにこれをお勧めします。次のコードでは、すべてのシェル引数が適切にエスケープされ、攻撃を受けないようにするために、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 公開鍵ベースの認証の設定は、実際には非常に簡単です。ただし、これまでに行ったことがない場合はそうではありません。設定方法に関する記事がたくさんあると思います。手順は基本的に次のとおりです。

  1. 公開鍵と秘密鍵を生成します (パスフレーズなし)。

    • 最初のクラウド サーバーで次のコマンドを入力します。ssh-keygen
    • パスフレーズを求められたら入力しないでください
  2. id_rsa.pub ファイルを各セカンダリ クラウド サーバーの ~/.ssh/authorized_keys ファイルにコピーします。

  3. 各クラウド サーバーで .ssh フォルダーに 700 のアクセス許可があることを確認します。

  4. .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 ファイルを危険にさらす可能性があるため、セキュリティ上の懸念が生じます。このファイルにアクセスできる人は誰でも、各クラウド サーバーに簡単にアクセスできます。そのため、ファイルの保護を軽視しないでください。

于 2013-07-18T05:19:50.043 に答える