1

私は現在、PHPでデプロイメントフレームワークを書いています。フレームワークはサーバーに接続し、SSH経由でコマンドを実行します。私はこれをより良くするためにPHPで方法を見つけようとしてかなり長い間探していました。要件は次のとおりです。テクニックは次のことができるはずです:

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

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

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

  4. SSHv2をサポートします。

現在、私のフレームワークは、デプロイスクリプトからのコマンドを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実装を試しましたが、これも役に立ちませんでした。ライブラリは、端末への書き込みアクセスを提供しないか、SSHv2をサポートしていません。

これに関するどんな助けも大いに感謝されるでしょう-事前に感謝します!

4

3 に答える 3

2

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

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の作成者が「インタラクティブ」サポートと呼んでいるものを必要とする場合は、試すことができます作者に連絡?たぶん、機能を開発するように彼にインセンティブを与えるために、彼にいくらかのお金を支払うことを申し出ます. サポート フォーラムを見ると、作成者は十分に対応しているようです。

于 2011-01-19T03:26:33.343 に答える
1

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

PHP を使用したいと思う唯一の理由は、どこかのページのリンクをクリックしてプロセスを開始し、それによってシステムのセキュリティに大きな穴を開けるためです。しかし、どうしても必要な場合は、よりシェルに適した言語でスクリプトを記述し、単純に php をゲートウェイとして使用してスクリプトを呼び出す方が簡単です。

于 2011-01-19T00:02:55.683 に答える
0

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インタラクティブシェルを作成することもできます。

于 2011-01-18T23:34:36.040 に答える