2011-01-18 13 views
1

現在、PHPでデプロイメントフレームワークを作成しています。このフレームワークはサーバーに接続し、SSHを介してコマンドを実行します。私はこれをより良くするためにPHPで方法を見つけようとしている間、ずっと探してきました。ここに要件があります。この手法では、次のことが可能になります:PHPでSSH経由で複数のサーバーと対話する

  1. プログラムでSSHパスワードを入力します。 SSH鍵を使用することは、パスワードなしのSSHログオンが必要なときに行く方法ですが、これはデプロイメントフレームワークです。一度に25台のサーバーに展開する可能性があります。ユーザーがフレームワークを使用するためにSSHキーを設定する必要はなく、パスワードを25回入力したいと思うのは当然でしょうか?私はここでモデルとしてCapistranoを使用しています。パスワードを一度尋ねてから、ユーザーに再度プロンプトを表示せずにSSH接続を確立するために使用します。パスワードを配布スクリプトに保存するよう提案するのではなく、一度だけ入力して配布タスクが終了するまで使用します。

  2. 出力をPHPスクリプトに送信します。私は、SSHセッションのそれぞれから独立して端末の出力を傍受し、それを修正して、それを端末に送り返して見せるようにしたいと考えています。このようにして、サーバの名前を出力の各行に付加して、何が起きているのかを示すことができます。

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

  4. サポートSSH v2。

現在、私のフレームワークは、展開スクリプトのコマンドを1つの巨大な文字列に「コンパイル」し、SSHコマンドを使ってそれらを実行します。これらのSSHコマンドのそれぞれがpassthru機能に組み込みのPHPのを介して実行される

ssh -t -t -p 12345 [email protected] 'command1; command2;'

::私はほぼすべては、proc_openとを使用して試してみました

<?php passthru("ssh -t -t -p 12345 [email protected] 'command1; command2;'"); ?>

各最終deployコマンドは次のようになりますPHPの他のコマンド実行機能のうち、役に立つものはありません。これらの機能のうち、私が上に挙げたすべての機能を提供するものはありません。さらに、純粋なPHP SSH実装を試してみました。ライブラリは端末への書き込みアクセスを提供しないか、SSH v2をサポートしません。

これに関するお手伝いがあれば、よろしくお願いいたします。

答えて

2

あなたはそう、あなたはphpseclib's pure PHP SSH implementationでそれを行うことができた場合は、次の端末への書き込みアクセス?:

ssh -t -t -p 12345 [email protected] 'command1; command2;' 

の一例であると考えています。例えば。

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

その後、(1)私はあなたが現在の実装だとし、(2)あなたはphpseclib作成者は」と呼ばしているものをしたい場合は、しているよりも、あなたがphpseclibを使用したほうが良いだろうと思いますされていない場合インタラクティブな "サポートは、おそらくあなたは著者に連絡することができますか?フィーチャーを開発するために彼にインセンティブを与えるために彼にいくらかのお金を払うことを提案するかもしれない。サポートフォーラムを見ると、著者は十分に反応しているようです。

+0

うーん、悪い提案ではありません。私は前にphpseclibを使用しようとしましたが、それはかなり良いと判明しましたが、書き込みアクセスはありませんでした。これは、書き込みアクセス権を持つv1をサポートしますが、v2はサポートしません。あなたが書いた最初のコマンドが 'パススルー 'を使って実行されているため、実際には書き込みアクセスであるとは考えていません。私が本当に探しているのは、stdin/stdoutへのストリームです。 – Cameron

+0

私は最終的に私が必要とするものに対してphpseclibを動作させることができました。あなたがSSH2を使用している場合、書き込みアクセスは提供しませんが、サブバージョンチェックアウトのようなものに対してユーザーがキーを設定するとは思えません。正しい方向に私を指してくれてありがとう! – Cameron

0

PHPでPECL拡張とSSH接続を行うことができます。あなたは、より高度な事をする必要がある場合も)(のssh2_shellと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); 

+0

良いアイデアですが、私はPECLがPHPに組み込まれなければならないことを実現したときにそのアプローチを放棄したことを覚えているようです。ユーザーにそれを要求するのは大したことではないと思いますが、それは自分のフレームワークを使用することを妨げる可能性があります。しかし、良いアイデア、ありがとう! – Cameron

+0

はい私はできるだけPECLを避けようとします。 – ztripez

+0

私はそれが皆さんの「可能な限り」の定義にかかっていると思います。他のソリューションが存在しないために本当に必要な場合は、それは理にかなっています... – Cameron

1

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

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

+0

私はあなたに同意しますが、bashスクリプトはPHPよりも柔軟性がありません。私は、コマンドラインからWebからデプロイメントフレームワークを使用するつもりはありません。フレームワークは、ほとんどが同種の環境で作業したい、つまり自分のサイトとその展開スクリプトでPHPを使用する開発者のためのものです。 Rubyのデプロイメントフレームワーク(Capistrano)をレールアプリ用に開発したのと同じ哲学です。 – Cameron

+0

私は、同種の環境の動機を理解しておらず、この作業のために選択した言語としてPHPを推奨しません。これは、システムとパススルーの基本機能の呼び出しを開始したら明白になるはずです。単純にシェルに委任してPHPライブラリの欠点を補うだけです。 –

+0

とにかく、出力バッファリングを使って端末の出力をキャプチャし、必要な場所でパイプを走らせることができます。それはおそらくカピストラーノのことです。 –

関連する問題