質問

現在、PHPで展開フレームワークを書いています。フレームワークはサーバーに接続し、SSHを介してコマンドを実行します。私はこれをより良くするためにPHPで方法を見つけようとしているのを探していました。ここに要件があります。テクニックは次のことができるはずです

  1. プログラムでSSHパスワードを入力します。 SSHキーを使用することは、パスワードのないSSHログオンが必要なときに行く方法であることを知っていますが、これは展開フレームワークであることを忘れないでください。一度に25のサーバーに展開する可能性があります。ユーザーにSSHキーを設定してフレームワークを使用するように要求し、パスワードを25回入力したい人は誰ですか?私はここでモデルとしてCapistranoを使用しています - それはあなたのパスワードを一度要求し、それを使用して、ユーザーを再登録せずにSSH接続を確立します。パスワードを展開スクリプトに保存することを提案していません。一度(静かに)入力され、展開タスクが完了するまで使用されます。

  2. PHPスクリプトに出力を送信します。各SSHセッションからの端末出力を個別に傍受し、変更してから、ユーザーが確認できるように端末に送り返すことができます。このようにして、サーバーの名前を各出力ラインにプリデントして、何が起こっているのかを表示できます。

  3. ターミナルへの書き込み(および読み取り)アクセスを提供します。ユーザー(またはスクリプト)が、SSHパスワードだけに加えて、端末に他の情報を入力できることが重要です。

  4. SSH V2をサポートします。

現在、私のフレームワークは、展開スクリプトのコマンドを1つの巨大な文字列に「コンパイル」し、SSHコマンドを使用してそれらを実行します。各最終展開コマンドは次のようになります:

ssh -t -t -p 12345 user@server.com 'command1; command2;'

これらの各SSHコマンドは、PHPの組み込みを介して実行されます passthru 働き:

<?php passthru("ssh -t -t -p 12345 user@server.com 'command1; command2;'"); ?>

私はProc_openを使用してみましたが、PHPの他のコマンド実行機能のほぼすべてが役に立ちませんでした。上記のすべての機能を提供していません。さらに、いくつかの純粋なPHP SSH実装を試しましたが、役に立ちませんでした。ライブラリは、端末への書き込みアクセスを提供しないか、SSH V2をサポートしません。

これに関する助けは大歓迎です - 事前に感謝します!

役に立ちましたか?

解決

以下は、端末への書き込みアクセスの例だと考えていますか?:

ssh -t -t -p 12345 user@server.com 'command1; command2;'

もしそうなら、あなたはそれをすることができます PHPSECLIBの純粋なPHP SSH実装. 。例えば。

$ssh = new Net_SSH2(...);
$ssh->login(..., ...);
$ssh->exec('command1; command2;');

そうでない場合(1)PHPSeclibを使用している方が、現在の実装よりも、(2)PHPSECLIBの著者が「インタラクティブ」サポートと呼んでいるものが必要な場合は、試してみることができると思います。著者に連絡しますか?たぶん、彼に機能を開発するために彼を奨励するために彼にお金を払うことを申し出てください。サポートフォーラムを見ると、著者は十分に敏感に思えます。

他のヒント

PHPがここで適切なツールであるかどうかはわかりません。バッシュスクリプトのように、シェル環境に近いものを使用してみませんか?

PHPを使用したいと思う唯一の理由は、どこかでページのリンクをクリックしてプロセスを開始し、システムがと思うセキュリティに大きな穴を開けてプロセスを開始できることです。しかし、本当に必要な場合は、よりシェルフレンドリーな言語でスクリプトを書き、PHPをガートウェイとして使用してスクリプトを呼び出す方が簡単です。

PHPのPECL拡張機能とSSH接続を行うことができます。http://php.net/manual/en/book.ssh2.php

$connection = ssh2_connect('server.com', 22);
ssh2_auth_password($connection, 'username', 'password');
$stream1 = ssh2_exec($connection, $command1);
$stream2 = ssh2_exec($connection, $command2);

より高度なものが必要な場合は、SSH2_Shell()を使用してSSHインタラクティブシェルを作成することもできます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top