ASH | サーバ | セキュリティ | Linux | FreeBSD | DB | Web | CGI | Perl | Java | XML | プログラム | ネットワーク | 標準 | Tips集

FTPコマンドでファイル転送

 FTPコマンドで、ファイル転送する方法と、FTPプロトコルについて、説明します。
 telnetでファイル転送?(FTP)のページで、telnetコマンドを使ってFTPプロトコルを使おうとしましたが、ユーザ認証しかできませんでした。 そこで、コマンドモードのFTPコマンドを使って、FTPプロトコルを解析してみましょう。 コマンドモードのFTPコマンドには、-dオプションがあり、使用しているFTPプロトコルを表示することができますので、この機能を使います。
 最後に、ftpコマンドによるファイルの一括転送方法を紹介します。

FTPコマンド

 FTPコマンドは、ホスト名とポート番号を指定して起動します。 すると、ユーザ名とパスワードを聞いて来るので入力します。 ユーザ認証がOKの場合、各種ftpコマンドが使えます。 bye(quit/exit)コマンドで、終了します。
 FTPコマンドには、以下のサブコマンドがあります。

ftpコマンド使用FTPプロトコル機能
ftpUSER
PASS
SYST
FTPを起動する
lsPORT / PASV
LIST
リモートのファイルの一覧を表示
pwdPWDリモートのカレントディレクトリを表示
cdCWDリモートのカレント作業ディレクトリを移動
mkdirMKDリモートのディレクトリ作成
!ls ローカルのファイルの一覧を表示
!pwd ローカルのカレントディレクトリを表示
lcd ローカルのカレント作業ディレクトリを移動
get TYPE
SIZE
PORT / PASV
RETR
MDTM
ファイルをダウンロード
mget PORT / PASV
NLST
*TYPE
*SIZE
*PORT / PASV
*RETR
*MDTM
複数のファイルをダウンロード
put TYPE
PORT / PASV
STOR
ファイルをアップロード
mput *TYPE
*PORT / PASV
*STOR
複数のファイルをアップロード
passive   Passiveモードの切り替え
bin / binary TYPE バイナリ転送モードに切り替え
asc / ascii TYPE ASCII転送モードに切り替え
bye / quit / exit QUIT FTPコマンド終了

 各サブコマンドで使用するFTPプロトコルの対応もまとめてあります。
 mgetやmputでは、*の付いたFTPプロトコルが繰り返し使われます。
 ローカル側の処理を行った場合は、FTPプロトコルは使われません。

FTPコマンド(-dオプション)の実行例

 では、実際にFTPコマンドを-dオプションで使ってみましょう。
 FTPプロトコルは、---< の後に表示される、英字4文字のコマンドを発行します。 また、返却値の先頭の数字3桁が、リターンコードになります。

Linux# ftp -d localhost
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 ftp.ash.jp FTP server (Version 6.00) ready.

 まず、ユーザ名を入力します。

Name (localhost:joe): ftp
---> USER ftp
331 Guest login ok, send your email address as password.

 次に、パスワードを入力します。
 今回は、annonimous FTPを使いますので、マナーとして、メールアドレスを入力します。

Password: joe@ash.jp
---> PASS XXXX
230- Welcome to FTP server.
230 Guest login ok, access restrictions apply.
---> SYST
215 UNIX Type: L8 Version: BSD-199506
Remote system type is UNIX.
Using binary mode to transfer files.

 cdコマンドで、カレントディレクトリをetcに移動します。

ftp> cd etc
---> CWD etc
250 CWD command successful.

 lsコマンドで、ディレクトリ内のファイル一覧を表示します。

ftp> ls
---> PORT 127,0,0,1,157,41
200 PORT command successful.
---> LIST
150 Opening ASCII mode data connection for '/bin/ls'.
total 166
-rw-r--r--  1 ftpadmin  ftp     23 Nov 17 03:11 ftpmotd
-rw-r--r--  1 ftpadmin  ftp     37 Nov 17 03:10 group
-rw-------  1 ftpadmin  ftp    216 Nov 17 03:06 master.passwd
-rw-r--r--  1 ftpadmin  ftp  40960 Nov 17 03:07 pwd.db
-rw-------  1 ftpadmin  ftp  40960 Nov 17 03:07 spwd.db
226 Transfer complete.

 PORTコマンドは、データ転送用のIPアドレスと、ポート番号を渡します。 最初の4桁がIPアドレスで、残りの2桁がポート番号です。 ポート番号は、1桁目 * 256 + 2桁目で計算した値です。

 getコマンドで、groupというファイルをダウンロードします。

ftp> get group
local: group remote: group
---> TYPE I
200 Type set to I.
---> SIZE group
213 37
---> PORT 127,0,0,1,157,42
200 PORT command successful.
---> RETR group
150 Opening BINARY mode data connection for 'group' (37 bytes).
100% |**************************************************|    37       00:00 ETA
226 Transfer complete.
37 bytes received in 0.00 seconds (16.36 KB/s)
---> MDTM group
213 20001117031013

 最後に、bye(quit/exit)コマンドで終了します。

ftp> bye
---> QUIT
221 Goodbye.

 このように、ftpコマンドの-dオプションを使うことにより、FTPプロトコルの送受信データの流れを見ることができます。

FTPコマンドで一括転送

 同じファイルを定期的に転送する場合や、複数のファイルを一括して転送する場合は、よく発生します。 このような場合には、FTPコマンドで一括転送すると便利です。 以下に、その方法を紹介します。

#!/bin/csh -f
#"@(#)ftp_all.sh 1995/07/01 Copyright(C)1995 ASH"
#
# name: ftp all files
#

ftp -n host_name << _EOD
user user_name password
passive
binary
cd /directory
get file_name
bye
_EOD

 このシェルを参考にして、以下の変数の値を変更すれば、一括転送できます。 ただし、パスワードをファイルに記述することになりますから、必ず、ファイルの参照権ははずしましょう。 _EODまでの間のコマンドが、バッチ形式で実行されます。

host_nameホスト名
user_nameユーザ名
passwordパスワード
diectoryディレクトリ名
file_nameファイル名


Copyright (C)1995-2002 ASH multimedia lab.
mail : info@ash.jp