Net::SSHモジュール(日本語翻訳)

by 太田俊哉さん

太田俊哉さんにいただいたNet::SSHの翻訳なのです。
太田さんどうもありがとうございます(川合孝典 2002/2/28)



名前

Net::SSH::Perl - Perl client Interface to SSH


記述方法

    use Net::SSH::Perl;
    my $ssh = Net::SSH::Perl->new($host);
    $ssh->login($user, $pass);
    my($stdout, $stderr, $exit) = $ssh->cmd($cmd);


説明

Net::SSH::Perlは、SSH(Secure Shell)クライアントを実装しているPerlのみのモジュールである。これは、SSH-1とSSH-2プロトコルと互換性を持つ。

Net::SSH::Perlは、簡単に、そして、安全にリモート・マシンの命令を実行して、STDOUT、STDERRとそのリモート命令のexitステータスを受けるのを可能にする。 これは、サーバーが認証する(パスワード認証、RSAチャレンジ-レスポンス認証、その他)、いろいろなメソッドのビルトイン・サポートを含む。 これは、I/Oバッファリング、パケット・トランスポートとSSHプロトコルのユーザー認証層を完全にインプリメントして、外部のperlライブラリの使用法を用意する(Crypt:: ファミリモジュールで)安全でないネットワークを経由して送られる全てのデータの暗号化を取り扱う。 また、既存のSSH構成ファイル(/etc/ssh_configなど)、RSA identityファイル、DSA identityファイル、既知のhostファイル、その他を読むことができる。

sshクライアントのラッバー形式インプリメンテーション上で、Net::SSH::Perlを使うことの1つの利点は、それがプロセス・オーバーヘッドを軽減するということである。もはや1つのsshdに接続するために、別々のプロセスをフォークして実行する必要がない。プロセスをフォークするのに、大量の時間とメモリが必要になることに依存するので、この勝利は、全く相当でありえる。特に、新しいプロセスをフォークすることがプロセスとメモリ・リソースの消耗である、永続しているperl環境において動作しているならば(たとえば、mod_perl )。

これはまた、sshを囲んでラッバーを書くとき、多分sshクライアントを制御して、それにパスワードを与えるためにExpectを使う必要がある、パスワードに基づく認証を使うプロセスを単純化する。 Net::SSH::Perlは、認証プロトコルのビルトイン・サポートが用意されているので、もはや任意の外部のプロセスと通信する苦労は少しもない。

SSH2プロトコル・サポート(バージョン1.00として現在のNet::SSH::Perlで提供)は、OpenSSHでのSSH2インプリメンテーションと互換性を持って、また、充分に公式のSSHインプリメンテーションと互換性を持つべきである。 もしも、Net::SSH::Perlと互換性を持たないSSH2インプリメンテーションを発見したならば、(AUTHOR & COPYRIGHTSセクションでの電子メール・アドレス)知らせてください。いくつかのSSH2インプリメンテーションが他との微妙な違いを持っていることがわかる。 3DES (3des-cbc), Blowfish (blowfish-cbc)とRC4 (arcfour)暗号は現在SSH2による暗号化と完全性チェックに対してサポートされていて、hmac-sha1 hmac-md5 アルゴリズムのとちらかによる完全性チェックが実行される。 圧縮が要求されても、方式はZlibに限られる。 サポートされたサーバー・ホスト・キー・アルゴリズムは、ssh-dss(既定値)とssh-rsa(Crypt::RSAを必要とする)であリ、また、サポートされたSSH2公開鍵認証アルゴリズムは、同じものである。

あなたがSFTPサポートを捜しているならば、SFTPのフル機能のperlインプリメンテーションを提供している、Net::SSH::Perlのトップに位置するNet::SFTPを見なさい。 SFTPは、SSH2プロトコルを使うことを必要とする。


BASIC USAGE

Net::SSH::Perlの使用法は、非常にシンプルである。

Net::SSH::Perl->new($host, %params)

新しいコネクションを確立するためには、$hostに繋ぎ、Net::SSH::Perlオブジェクトを返す、newメソッドを呼ぶ。

newは、%params中の、以下で名をつけられたパラメータを受け付ける。

$ssh->login([ $user [, $password ] ])

sshdデーモンで認証時に使われる、ユーザー名とパスワードをセットする。 ユーザー名$userは全ての認証プロトコル(リモート・サーバーに自分自身を識別するために)のために必要とされるが、もしも指定しないならば、プログラムを実行しているユーザーのユーザー名が使われる。 パスワード$passwordは、パスワード認証(暗号化されたRSA/DSA識別ファイル上のパスフレーズとしては使用されないが、たぶん)だけのために必要とされる。 そして、インタラクティブ・セッションで動作していて、かつ、パスワードを提供しないならば、パスワードのためのプロンプトが表示される。

($out, $err, $exit) = $ssh->cmd($cmd, [ $stdin ])

リモート・サーバー上で命令$cmdを動作させ、stdoutstderrとその命令のexitステータスを返す。

$stdinが指定されると、リモートコマンド$cmdの標準入力に供給される。

注意: リモート・シェルがコマンドを評価することができるために、コマンドが一連になっている限り、SSH-1プロトコルは、コネクションあたり複数のコマンドの実行をサポートしない。 このため、cmdを呼び出すたび毎に新しいソケット・コネクションが作成され、終了後になくなる。言い換えれば、以下のコード

    my $ssh = Net::SSH::Perl->new("host1");
    $ssh->login("user1", "pass1");
    $ssh->cmd("foo");
    $ssh->cmd("bar");

は、cmdの最初の起動時に、実際にsshdに接続し、切断する。そして、第二番目のcmdの起動に一度接続し、切断する。

これはがSSH-2プロトコルにはあてはまらないことに注意。SSH-2は、同じコネクション上で複数のコマンド実行を十分にサポートする。

$ssh->shell

リモート・マシン上のインタラクティブ・シェルをオープンし、それをSTDINに接続する。 疑似TTYで使われるとき、これは最も効果的である。それ以外では、コマンド・ライン・プロンプトを得られず、シェルのようには見えない。この理由 -- それを特に避けている間は -- により、もしも、引数new(上記説明)に、use_ptyをセットしない場合でも、pty はリモート・マシンから要求される。

これは、対話型プログラムでのみ役に立つ。

それに加え、多分このメソッドを呼ぶ前に、手元のターミナルをraw入力にセットすることを希望するだろう。これは、タイプした文字を、Net::SSH::Perlに、各文字毎に処理させ、リモート・マシンに送る。

そうしたいならば、プログラム中でTerm::ReadKey を使うのがよい。

    use Term::ReadKey;
    ReadMode('raw');
    $ssh->shell;
    ReadMode('restore');

実際、プログラムがその行を処理する前に exitする場合に備えて、1つの ENDブロック中にrestore行を置くことをしてもよい。

もしも例を必要とするならば、sshシェルを実装するためのほとんど正確なコードを使っているeg/psshを参照しなさい。

$ssh->register_handler($packet_type, $subref [, @args ])

クライアント・ループの間、タイプ$packet_typeのパケットを取り扱うために匿名のサブルーチン・ハンドラー$subrefを登録する。 タイプ$packet_typeのパケットを受け取った時、サブルーチンは呼ばれ、標準の引数(下記参照)に加えて、指定されるならば、@argsで任意の追加の引数を受けとる。

リモート・サーバーに送る命令をコマンドを送った後で、任意のSTDINデータが送られたあと、クライアント・ループに入る。 サーバーがリモートで実行されたコマンドのexitステータスを送るまで、サーバー(STDOUTパケット、STDERRパケット、その他)から、パケットを読み込む。この時点で、クライアントはクライアント・ループを抜け出し、サーバーから切り離される。

cmdメソッドを呼び出す時、クライアント・ループは既定値では単にSTDOUTパケットをスカラー変数に入れ、呼び出し側にその値を返す。STDERRパケットとプロセスのexitステータスにも同じことを行なう(cmdのドキュメントを参照)。

しかし、それらの既定の動作を変更でき、かつクライアントに送られるデータそれ自身を代わりに処理することができる。 これを行なうには、register_handlerメソッドを呼び出し、かつ、特定の時間に呼ばれるハンドラーをセットアップする。

register_handlerメソッドの動作は、Net::SSH::Perl SSH-1とSSH-2インプリメンテーション間では違う。これはプロトコルの違いに由来する(すべてのSSH-2クライアント-サーバー通信は、入力パケットが違って処理されることを意味するチャネル・メカニズムを経由する)。


ADVANCED METHODS

基本的なSSHの必要性は、上記でリストされるメソッドによって有効に達成できる。 しかし、もしもそうでなけれらば、ここでリストされる追加のメソッドの一部を使ってもよい。 それらの一部は、他が書いた、エンドユーザ向けの、実際により便利であろう認証モジュールまたは暗号、その他である。

$ssh->config

SSHオブジェクトのために構成データを管理しているNet::SSH::Perl::Configオブジェクトを返す。 これはコンストラクタnew(上記参照)から渡されるデータから構成され、ユーザーとシステムの構成ファイル読み出されたデータがマージされる。 このオブジェクト(多分getsetメソッドにより興味を持つだろう)を呼ぶことができるメソッドに関する詳細は、Net::SSH::Perl::Configドキュメントを参照のこと。

$ssh->sock

sshdへのソケット・コネクションを返す。もしもクライアントが接続されていないと die が実行される。

$ssh->debug($msg)

debuggingが現セッションでオンにされていると(上記のnewメソッドへのdebugパラメータを参照)、STDERR$msgを出力する。その他の場合は何もしない。

$ssh->incoming_data

タイプNet::SSH::Perl::Bufferのオブジェクトである入力データ・バッファである。 バッファ・オブジェクトを返す。

このアイデアの背景は、ソケットが非ブロッキングであり、そのため、完全なパケットを読んだか、入力をバッファし、それを観察するために定期的にチェックする事である。 もしも、完全なパケットがあれば、入力データ・バッファからそれを取り出し、処理し、それを問い合わせた呼び出し側に返す。

このデータは、Net::SSH::Perl::Packet中の根底にあるパケット層に「属している」。 あなたが本当に、何をしようとしているか真に分かっていない限り、そのデータを捨ててはならない。

$ssh->session_id

キーと共に送られるチェックビットと、サーバーのホストとサーバー・キーから生成されるセッションIDを返す。 サーバーは、(例えばRSAチャレンジに応答する時)他のパケットの中で渡されるセッションIDを必要としてもよい。

$packet = $ssh->packet_start($packet_type)

タイプ$packet_typeの新しいパケットの構築を始める。 これは、怠惰な人々のためのちょうど手ごろなメソッドである。 内部では、Net::SSH::Perl::Packet::newを呼び出すので、詳細はそれらのドキュメントに目を通しなさい。


サポート

サンプル/チュートリアルは、配布ディレクトリeg/中のスクリプトにある。

なにか質問、コード・サンプル、バグ・レポートまたはフィードバックをがあるならば、、以下の宛先に電子メールを送ってください

    ben@rhumba.pair.com


著者と著作権

Benjamin Trott, ben@rhumba.pair.com

特に記述がある場合を除いて、Net::SSH::PerlはCopyright 2001 Benjamin Trott である。 著作権所有。 Net::SSH::Perlは、フリー・ソフトウェアであリ、再配布および修正は、はperlと同じ条件の下で大なってもよい。


ホーム Perlの小技

ご意見、ご質問はこちらの掲示板で受け付けています。
またメールは河馬屋(Nifty)にお願いします。