yuu_nkjm blog


2011-12-03(Sat) [長年日記]

[FTP][openSUSE] コマンドラインからFTPSでFTPサーバ上のデータを取得

対話型だと自動処理に不向きなので,コマンドラインでFTPサーバからデータを取得したい.さくらインターネットでftpsが使える様になったということなので,ftpsによる接続を試みた.ncftpではftpsを扱えない様なので,FTPクライアントをlftpに代えた.

「Explicitモード(?)」の節が,うまくいったコマンドについて書いた部分である.

Implicitモード(?)

lftp -u user,passwd  -e "mirror --only-newer --verbose /home/hoge/ /srv/www/repos/hoge" ftps://hoge.sakura.ne.jp:21

sakuraサーバはFTPSに990番ポートでなく21番ポートを使う様なので,ポート番号を指定する.

lftp -u hoge -e "debug 12" ftps://hoge.sakura.ne.jp:21
 
lftp hoge@hoge.sakura.ne.jp:~> ls
---- dns cache hit
---- hoge.sakura.ne.jp (xxx.xx.xx.xxx) ポート 21 に接続中
`ls' (現在 0 バイト) [FEAT negotiation...]
**** gnutls_handshake: A TLS packet with unexpected length was received.
---- コントロールソケットを閉じています
ls: 致命的エラー: gnutls_handshake: A TLS packet with unexpected length was received.

上記の様なエラーが出て接続出来なかった.何でだろ….何かExplicitとImplicitとかいってた辺りが怪しい気がする.ひとまずwikipediaでも見てみる.

暗号化の種類

FTPSには、認証コマンド(AUTHコマンド)実行後に暗号化通信を開始するExplicitモードと、FTPSサーバ接続開始時点から暗号化通信を開始するImplicitモードの2種類が存在する。

Explicitモード

サーバに接続した後にクライアントがAUTHコマンドを実行して、使用するプロトコル(SSLまたはTLS)のネゴシエーションをおこない、適合したプロトコルでのハンドシェイク完了後に暗号化された通信がおこなわれる。 つまりExplicitモードの場合、クライアントがAUTHコマンドを実行しなければ通常のFTPとして機能する。

Implicitモード

サーバに接続した直後にSSLまたはTLSによるハンドシェイクがおこなわれる。 Implicitモードで動作するサーバに接続する場合、クライアントはサーバが採用している暗号化プロトコルに適合したFTPSクライアントソフトを使用する必要がある。 また、データ転送チャネル(PORTまたはPASVコマンドで作成されるチャネル)での通信を暗号化する場合、PROTコマンドを用いて保護レベルをP (Private) に設定する必要がある。

さくらインターネットの説明サイトにExplicitモードで接続する様に書いてあった.上記の蹴られ方を見ると,さっきはImplicitモードで接続しようとしていることになるのかな.「Explicitモードの場合、クライアントがAUTHコマンドを実行しなければ通常のFTPとして機能する」って書いてあるから,いきなりftpsを指定するのはこの説明に合わない気がする.語感としては,ftpsって指定する方がEplicitに思えるけど….

Explicitモード(?)

ユーザ毎の設定は~/.lftprcに,サーバ全体のlftpの設定は/etc/lftp.confに書く.

# ~/.lftprc
 
set ftp:ssl-auth TLS
set ftp:ssl-force true
set ftp:ssl-allow yes
set ftp:ssl-protect-list yes
set ftp:ssl-protect-data yes
set ftp:ssl-protect-fxp yes
# set ssl:verify-certificate no サーバによってはこれが必要になるケースもある?

~/.lftprcに上記の様に記述し,以下のコマンドを実行した.先ほどと違うのは,ftpsではなくftpを指定した点である.

lftp -u hoge -e "debug 12" ftp://hoge.sakura.ne.jp
 
lftp hoge@hoge.sakura.ne.jp:~> ls
(snip)
---- hoge.sakura.ne.jp (xxx.xx.xx.xxx) ポート 21 に接続中
<--- 220 ProFTPD 1.3.3c Server (SAKURA Internet FTP Server) [xxx.xx.xx.xxx]
---> FEAT
(snip)
---> AUTH TLS
<--- 234 AUTH TLS successful
(snip)

"AUTH TLS successful"と出てるし,FTP over SSL/TLSが出来ていることが分かる.

ミラーリング用のスクリプト

# hoge-bkup.conf
 
set ftp:ssl-auth TLS
set ftp:ssl-force true
set ftp:ssl-allow yes
set ftp:ssl-protect-list yes
set ftp:ssl-protect-data yes
set ftp:ssl-protect-fxp yes
# set ssl:verify-certificate no サーバによってはこれが必要になるケースもあるようだ.
# 接続先のポート番号はftp://xxxxの後ろに:ポート番号で指定する.
open -u hoge,passwd ftp://hoge.sakura.ne.jp
debug 12 -o /tmp/lftp_hoge_bkup.log
mirror --only-newer --verbose /home/hoge /srv/www/hoge

上記の様なスクリプトを作成し,lftpの-fオプションで渡して実行するようにした.パスワードを書き込むときは,そのファイルのアクセス権限に十分に注意する.

lftpのオプションは以下.-fと他のオプションの併用は出来ないようだ.

lftp -help
 
使い方: lftp [OPTS] 
`lftp' は rc ファイルを読み込んだあと最初に実行されるコマンドです
 -f            ファイルで指定されたコマンドを実行し終了する
 -c             コマンドを実行して終了する
 --help              このヘルプを表示して終了する
 --version           lftp のバージョンを表示して終了する
他のオプションは `open' コマンドのものと同じです
 -e             選択のすぐあとに指定のコマンドを実行する
 -u [,]  認証で指定のユーザ/パスワードを使う
 -p            接続に指定のポートを使う
               ホスト名、URL あるいはブックマーク名

備考

残った疑問
lftp -v
 
Libraries used: Readline 6.1

lftpのバージョン情報を表示させるとこんな感じ.ここでOpenSSLモジュールが組み込まれていると表示されないとFTPSが使えないと書いてある記事を見かけたのだが,どうなんだろう.

ncftp (ncftpget)

昔はncftpを使っていた.

ncftpget -u user -p 'passwd' -d /home/hoge/tmp/ncftp_hoge_bkup.log -T -R  hoge.sakura.ne.jp /srv/www/repos/hoge /home/hoge
本日のリンク元
アンテナ
その他のリンク元
検索

トップ «前の日記(2011-12-02(Fri)) 最新 次の日記(2011-12-04(Sun))» 月表示 編集 設定
2006|01|06|12|
2007|06|09|
2008|01|03|04|06|07|08|09|10|12|
2009|01|02|05|06|07|08|10|11|12|
2010|03|04|05|06|07|08|09|10|11|
2011|01|02|03|04|05|06|07|08|09|11|12|
2012|01|02|04|06|07|08|10|11|12|
2013|01|02|03|07|08|10|11|12|
2014|01|02|04|05|06|07|08|09|10|11|
2015|01|02|07|11|12|
2016|01|03|05|07|08|09|