シェルスクリプトでftp転送

シェルスクリプトftp転送する処理のサンプル。メモ。

#!/bin/sh

DATE=`date '+%Y%m%d'`
tar cvfz ${DATE}.tar.gz ./hoge

ftp -ivn 192.168.11.11 << __END__
user username password
bin      # バイナリ転送モード
passive  # パッシブモードoff
cd /foo/var
put ${DATE}.tar.gz
quit
__END__

ファイル転送時にはascii/binaryの転送モードに注意です。

例えば、tar.gzファイルの転送で、転送先で解凍しようとしてこんな感じにメッセージが出て

tar: 次のヘッダをスキップします
tar: アーカイブに廃れた base-64 ヘッダが含まれています

gzip: stdin: invalid compressed data--format violated
tar: Child returned status 1
tar: 処理中にエラーが起きましたが、最後まで処理してからエラー終了させました

gunzipだけで以下のようなメッセージが出る場合

gunzip: 20080120.source.tar.gz: invalid compressed data--crc error

gunzip: 20080120.source.tar.gz: invalid compressed data--length error

転送モードがバイナリになっていない事が原因である可能性が高いと思います。