ssh-xferを使って既存のSSH接続経由でファイルをすばやく取得する

 Secure Shell(SSH)とSecure Copy(SCP)を使えば、システムのリモート管理や、セキュアなリンク経由のファイルコピーは難しくない。SSHとSCPは、どちらも同じSSHプロトコルを使用してネットワーク通信を保護するが、シェルの実行やファイルのコピーにはユーザの介在を必要とする。また、リモートマシンへの既存のSSH接続を使ったファイル取得は容易ではなく、SCPによるファイルコピーの際には別のSSH接続が必要になる。だが、 ssh-xfer を使えば話は別だ。

 ssh-xferでは、ローカルのSSHエージェント(ssh-agent)を利用することで、既存のSSH接続を介したファイル転送が簡単に実行できる。ssh-xferを使うにあたり、SSHのクライアントやサーバのプログラムの変更は不要だが、ssh-agentにパッチを当てる必要がある。できればssh-agentにパッチを当てずに済ませたいところだが、これには複数のSSH接続を介したファイル転送が可能になるという大きな利点もある。たとえば、まずファイアウォールに接続し、そこから順にリモートサーバ、リモートデスクトップマシンへと接続して、そのリモートマシンのSSHから「/etc/foo.conf」ファイルを取得しようとする場合に、ローカルマシンからそのファイルにたどり着くまでの過程や、SCPによってすべての中間ホストを介してそのファイルを転送する方法を考えなくても済むのだ。リモートマシンのSSHから単純に「ssh-xfer /etc/foo.conf」とするだけで、このファイルがローカルマシンの「~/Desktop」にコピーされる。また、デフォルトの転送先ディレクトリはssh-xfer用パッチの「XFER_DEST_DIR」で指定できる。もちろん、リモートマシン側でssh-xferプログラムが使えるようにしておく必要があるが、サーバ側のSSH環境の変更は一切必要ない。

 ssh-xferにはFedora用、Ubuntu用、openSUSE用のいずれのパッケージも存在しない。ここでは、64ビット版Fedoraマシンでssh-xferバージョン0.15のソースからのビルドを行う。また、SSHにはFedora 9のアップデートリポジトリから入手したOpenSSH 5.0p1-3.fc9を用いる。

 下記の「rpmbuild --recompile」コマンドにより、FedoraがOpenSSHに追加したすべてのパッチを含め、OpenSSHのソース取得とビルドが行われる。ここではssh-agentにパッチを当てるので、ディストリビューションで使用する際にそのソースを再生成したうえでssh-xferのパッチを適用するのがよさそうだ。パッチには最新のソースにうまく適用できない部分がいくつかあったが、返り値のちょっとした違い(返り値がないところで0が返されるなど)に関係したものがほとんどで、それ以外は確かにパッチの適用を妨げる内容ではあったが門外漢でも簡単に修正できるものだった。とりあえず、Fedora 9のアップデートにあるOpenSSHのバージョン5.0p1-3.fc9を使って生成した更新済みのパッチをアップロードしておいたので、ほかの人はこうした修正に煩わされずに済むだろう。

$ rpmbuild --recompile /FromWeb/openssh-5.0p1-3.fc9.src.rpm
$ cd ~/rpmbuild/BUILD/openssh-5.0p1/
$ patch -p0 < /FromWeb/ssh-xfer-0.15.diff
...
patching file ssh-agent.c
...
Hunk #16 FAILED at 1417.
2 out of 16 hunks FAILED -- saving rejects to file ssh-agent.c.rej
... use my patch above or fix these issues by hand.

 ssh-agentのソースにパッチを当てたら、以下のコマンドでソースツリーを構成し直してからssh-agentおよび新しいssh-xferプログラムのリビルドを行う。そのあと、ローカルのデスクトップマシンで修正済みのssh-agentを実行すると共に、ファイルの転送元となるリモートマシンでssh-xferのバイナリが使えるようにする必要がある。リモートマシン側のディストリビューションがssh-agentおよびssh-xferをビルドしたマシンのものと同じ場合は、SCPを使ってリモートマシンにssh-xferを用意するのが手っとり早いだろう。

$ ./config.status
$ make all ssh-xfer
$ su -l

# chown root:root ssh-xfer
# chmod 755 ssh-xfer
# scp -pv ssh-xfer myserver:/usr/local/bin
# install --mode 755 ssh-agent /usr/local/bin/ssh-agent-xfer