2008/10/01

IP reachableでない場合のremote copy

リモートマシンのファイルをコピーする場合、ローカルマシンとIP到達性が確保されていれば、普通にscpを使ってコピーすれば問題ない。しかし、IP到達性が確保されていない場合はどうするか?ここでは、base64コマンドを使う方法を紹介する。

IP到達性が確保されていない場合とは例えば、
  • Xen環境でDomUとDom0間がXenコンソールでしか繋がっていない
  • シリアルポートからTTY接続している
などだ。

上の様な場合でも、標準出力はローカルマシンのコンソールに出力されるので、ここからコピーすればよいのだが、単にファイルをcatすると、バイナリファイルは正常にコピーできないし、テキストファイルであっても、端末エミュレータによってはタブが空白に変換されたり、行末の空白が無視されたりする。

これを避けるために、TTYで正常に出力されるキャラクタ集合でエンコードする。その昔は、uuencodeを使ったが、最近のLinuxでは、base64コマンドが使いやすい。
まず、コピー元のマシンで、以下の様にエンコードする。
[root@dc1 ~]# base64 /usr/share/doc/yum-3.2.8/README
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpZdW0gLSBhbiBhdXRvbWF0aWMg
dXBkYXRlciBhbmQgaW5zdGFsbGVyIGZvciBycG0tYmFzZWQgc3lzdGVtcwotLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpJbmNsdWRlZCBwcm9ncmFtczoKL3Vzci9iaW4veXVt
<<略>>
dHRwOi8vbGludXguZHVrZS5lZHUveXVtLwp3aWtpOiBodHRwOi8vd2lraS5saW51eC5kdWtlLmVk
dS9ZdW0K
[root@dc1 ~]#
この出力結果をデコードするには、base64コマンドに-diオプションを付けて実行する。以下の実行例では、ローカルマシン上で実行しているが、実際には、コンソール間でエンコードされたデータをコピー&ペーストする。
[root@dc1 ~]# base64 /usr/share/doc/yum-3.2.8/README | base64 -di
-------------------------------------
Yum - an automatic updater and installer for rpm-based systems
-------------------------------------

Included programs:
/usr/bin/yum Main program
<<略>>
wiki: http://wiki.linux.duke.edu/Yum
[root@dc1 ~]#
なお、base64コマンドが無い場合は、opensslコマンドで代用する。
[root@dc1 ~]# openssl base64 < /usr/share/doc/yum-3.2.8/README | openssl base64 -d
-------------------------------------
Yum - an automatic updater and installer for rpm-based systems
<<略>>