FTPコマンドオプション完全ガイド:ファイル転送を効率化
はじめに
インターネットの黎明期から存在するファイル転送プロトコル(FTP)は、今なお多くの場面で利用されています。Webサイトのコンテンツアップロード、サーバー間のファイル移動、データのバックアップなど、その用途は多岐にわたります。現代においては、よりセキュアなSFTPやFTPS、あるいはHTTPを利用したファイル転送方法も普及していますが、シンプルで歴史の長いFTPは、特定の環境やレガシーシステムにおいて不可欠な技術であり続けています。
FTPを利用する際に、GUIベースのクライアントソフトウェアを使うのが一般的かもしれません。しかし、コマンドラインインターフェース(CLI)を用いたFTPクライアントも非常に強力で、その柔軟性と効率性から、特に自動化されたタスクやスクリプトによるファイル転送で真価を発揮します。コマンドラインFTPクライアントを使いこなすことは、日々のファイル転送作業を劇的に効率化し、より高度な操作を可能にする鍵となります。
この記事では、主要なコマンドラインFTPクライアント(特にUNIX/LinuxやWindowsに標準搭載されているftp
コマンドを基本とします)に焦点を当て、その基本的な使い方から、それぞれのコマンドが持つ様々なオプション、そしてそれらを活用してファイル転送を効率化する方法について、約5000語にわたる詳細な解説を行います。各コマンドの構文、具体的な使用例、そして知っておくべき注意点や応用方法までを網羅的に説明することで、FTPコマンドラインの真の力を引き出すための一助となることを目指します。
FTPコマンドラインは、一見すると難解に思えるかもしれませんが、その基本を理解し、主要なコマンドとそのオプションを使いこなせるようになれば、手作業では困難な大量のファイル転送や定型的なバックアップタスクなども、簡単に自動化できるようになります。この記事を通じて、あなたがFTPコマンドラインを自在に操り、ファイル転送の達人となるための知識とスキルを習得できることを願っています。
FTPの基本
FTPコマンドの解説に入る前に、まずはFTPプロトコル自体の基本的な仕組みについて理解しておくことが重要です。FTPは、クライアントとサーバーの間でファイルを転送するためのプロトコルです。
クライアント/サーバーモデル
FTPはクライアント/サーバーモデルを採用しています。ファイルを転送したいユーザーは「FTPクライアント」ソフトウェアを使用し、ファイルを提供したり受け入れたりするコンピューターは「FTPサーバー」ソフトウェアを実行します。クライアントがサーバーに接続要求を出し、認証を経てからファイルのアップロードやダウンロードを行います。
制御コネクションとデータコネクション
FTPには、他の多くのプロトコルとは異なる独特の仕組みがあります。それは、「制御コネクション」と「データコネクション」という、性質の異なる二つの接続を同時に使用することです。
-
制御コネクション (Control Connection):
- 通常、TCPポート21番を使用します(サーバー側)。
- FTPコマンド(例:
USER
,PASS
,PORT
,PASV
,RETR
,STOR
,LIST
,QUIT
など)の送信と、サーバーからの応答(ステータスコード付きのテキストメッセージ)の受信に使用されます。 - このコネクションは、FTPセッションが確立されている間、常にアクティブな状態を保ちます。FTPクライアントがFTPサーバーに接続し、ログインが成功すると、この制御コネクションが確立されます。
-
データコネクション (Data Connection):
- ファイルのリスト表示 (
LIST
,NLST
) や実際のファイル転送 (RETR
(ダウンロード),STOR
(アップロード),APPE
(追記), etc.) に使用されます。 - 使用されるポートは、アクティブモードかパッシブモードかによって異なります。
- ファイルのリスト表示 (
FTPのモード:アクティブモードとパッシブモード
データコネクションを確立する方法には、以下の二つのモードがあります。これは、特にファイアウォールなどのネットワーク構成において重要な考慮事項となります。
-
アクティブモード (Active Mode):
- クライアントが制御コネクション上で
PORT
コマンドを送信し、データコネクションを待ち受けるローカルポート番号をサーバーに通知します。 - サーバーは、そのポート番号(通常は20番ポートから)からクライアントのアドレスと指定されたポートに向けてデータコネクションを確立します。
- 問題点: クライアント側のファイアウォールが、外部からの着信接続(サーバーからのデータコネクション確立要求)をブロックする可能性があります。
- クライアントが制御コネクション上で
-
パッシブモード (Passive Mode):
- クライアントが制御コネクション上で
PASV
コマンドを送信します。 - サーバーは、データコネクションを待ち受ける自身のポート番号(通常は1024番以上のランダムなポート)をクライアントに応答します。
- クライアントは、サーバーが応答したポート番号に向けてデータコネクションを確立します。
- 利点: データコネクションの確立はクライアント側から行われるため、クライアント側のファイアウォール設定(特に内部から外部への接続許可)が比較的緩やかであれば通信しやすい傾向があります。多くのモダンなFTPクライアントやサーバーは、デフォルトでパッシブモードを使用します。
- クライアントが制御コネクション上で
コマンドラインFTPクライアントでも、これらのモードを切り替えるコマンドが提供されています。ネットワーク環境に応じて適切なモードを選択することが重要です。
FTPコマンドラインクライアントの起動と接続
多くのオペレーティングシステム(Windows、Linux、macOSなど)には、標準でFTPコマンドラインクライアントが搭載されています。一般的には、ターミナルまたはコマンドプロンプトを開き、ftp
コマンドを入力することで起動します。
ftp
コマンドの使い方
基本的な構文は以下の通りです。
bash
ftp [オプション] [ホスト名またはIPアドレス [ポート番号]]
ホスト名またはIPアドレス
: 接続したいFTPサーバーのホスト名(例:ftp.example.com
)またはIPアドレス(例:192.168.1.100
)を指定します。ポート番号
: FTPサーバーが標準の21番ポート以外のポートで待ち受けている場合に指定します。通常は省略可能です。
使用例:
-
FTPクライアントを起動し、後から接続する場合:
bash
ftp
起動後、プロンプト(通常ftp>
と表示されます)が表示され、ここで接続コマンドなどを入力します。 -
起動と同時に特定のサーバーに接続する場合:
bash
ftp ftp.example.com
またはIPアドレスで:
bash
ftp 192.168.1.100 -
特定のポートを指定して接続する場合(例: ポート2121):
bash
ftp ftp.example.com 2121
認証(ユーザー名とパスワード)
サーバーに接続すると、通常はユーザー名とパスワードによる認証が求められます。
Connected to ftp.example.com.
220 Welcome to the Example FTP server.
Name (ftp.example.com:your_local_username): [ここにFTPユーザー名を入力]
ユーザー名を入力してEnterキーを押すと、パスワードの入力を求められます。
331 Please specify the password.
Password: [ここにパスワードを入力]
パスワードを入力しても、セキュリティ上の理由から画面には表示されません。入力後、Enterキーを押します。認証が成功すると、サーバーからの歓迎メッセージが表示され、FTPプロンプトが表示されます。
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>
これで、FTPサーバーに対してコマンドを実行できるようになります。
主要なFTPコマンドとその詳細
FTPコマンドラインクライアントのプロンプト(ftp>
)で入力する主要なコマンドについて、その機能、構文、使用例、そして関連するオプションを詳細に解説します。コマンドは機能別に分類して説明します。
接続/切断関連コマンド
セッションの確立と終了に関わるコマンドです。
open
FTPサーバーに接続します。ftp
コマンドの起動時にホスト名を指定しなかった場合や、別のサーバーに再接続したい場合に使用します。
- 構文:
open ホスト名またはIPアドレス [ポート番号]
- 説明: 指定したホスト名またはIPアドレスのFTPサーバーに接続を試みます。ポート番号を省略した場合は標準の21番ポートを使用します。
- 使用例:
ftp
ftp> open ftp.example.com
ftp
ftp> open 192.168.1.100 2121
user
ログインに使用するユーザー名を送信します。接続時に自動的に求められますが、別のユーザーでログインし直したい場合などに使用できます。
- 構文:
user ユーザー名 [パスワード]
- 説明: 指定したユーザー名でログインを試みます。パスワードを省略した場合、後からパスワード入力を求められます。
- 使用例:
ftp
ftp> user myuser
Password:
ftp
ftp> user myuser mypassword
(注意: パスワードをコマンドラインで指定するのはセキュリティ上推奨されません。履歴に残る可能性があるためです。)
pass
ログインに使用するパスワードを送信します。通常はuser
コマンドや接続時に自動的に求められる際に入力します。
- 構文:
pass パスワード
- 説明: 指定したパスワードで認証を試みます。通常はプロンプトでパスワード入力を求められた際に使用するため、手動で入力することは稀です。
quit
または bye
FTPセッションを終了し、FTPクライアントを閉じます。
- 構文:
quit
またはbye
- 説明: サーバーにQUITコマンドを送信し、制御コネクションを閉じます。その後、FTPクライアントプログラムが終了します。
- 使用例:
ftp
ftp> quit
close
または disconnect
現在のFTPサーバーとのセッションを切断します。FTPクライアントプログラム自体は終了せず、別のサーバーに接続するためにプロンプトに戻ります。
- 構文:
close
またはdisconnect
- 説明: 現在のサーバーとの接続を閉じますが、FTPクライアントは起動したままです。異なるサーバーに立て続けに接続したい場合に便利です。
- 使用例:
ftp
ftp> close
Not connected.
ftp>
ナビゲーション関連コマンド
サーバー上のディレクトリ間を移動したり、現在の場所を確認したりするコマンドです。
pwd
Print Working Directory の略。FTPサーバー上の現在の作業ディレクトリを表示します。
- 構文:
pwd
- 説明: サーバーに
PWD
コマンドを送信し、応答として現在のディレクトリパスを表示します。 - 使用例:
ftp
ftp> pwd
257 "/home/myuser" is the current directory.
cd
Change Directory の略。FTPサーバー上の作業ディレクトリを変更します。
- 構文:
cd リモートディレクトリ
- 説明: 指定したリモートディレクトリに移動します。絶対パス(例:
/var/www/html
)または相対パス(例:sub_folder
)を使用できます。 - 使用例:
ftp
ftp> cd public_html
250 Directory successfully changed.
ftp
ftp> cd /var/www/html
250 Directory successfully changed.
cdup
Change Directory Up の略。FTPサーバー上の現在の作業ディレクトリの親ディレクトリに移動します。cd ..
と同じ機能です。
- 構文:
cdup
- 説明: 現在のディレクトリの一つ上の階層に移動します。
- 使用例:
ftp
ftp> pwd
257 "/home/myuser/public_html" is the current directory.
ftp> cdup
250 Directory successfully changed.
ftp> pwd
257 "/home/myuser" is the current directory.
ls
または dir
FTPサーバー上のファイルやディレクトリのリストを表示します。ローカルの ls
や dir
とは動作が異なります。
- 構文:
ls [リモートディレクトリ] [ローカルファイル]
dir [リモートディレクトリ] [ローカルファイル]
- 説明:
ls
はNLST
コマンドを、dir
はLIST
コマンドをサーバーに送信します。NLST
(ls
): ファイル名やディレクトリ名のみをシンプルなリスト形式で表示します。ワイルドカードが使用できます。LIST
(dir
): ファイルの詳細情報(パーミッション、所有者、サイズ、更新日時など)を含んだリストを、通常はUNIX形式またはDOS形式で表示します。ワイルドカードが使用できます。[リモートディレクトリ]
: リストを表示したいディレクトリを指定します。省略した場合は現在のディレクトリのリストを表示します。[ローカルファイル]
: 取得したリストを画面に表示する代わりに、指定したローカルファイルに保存します。
- 使用例:
ftp
ftp> ls
200 PORT command successful.
150 Here comes the directory listing.
file1.txt
file2.jpg
subdirectory
226 Directory send OK.
ftp
ftp> dir
200 PORT command successful.
150 Here comes the directory listing.
drwxr-xr-x 2 user group 4096 Jan 1 2023 subdirectory
-rw-r--r-- 1 user group 1234 Jan 5 2023 file1.txt
-rw-r--r-- 1 user group 56789 Jan 10 2023 file2.jpg
226 Directory send OK.
ftp
ftp> ls *.txt
200 PORT command successful.
150 Here comes the directory listing.
file1.txt
another_file.txt
226 Directory send OK.
ftp
ftp> dir /var/log server_logs.txt
200 PORT command successful.
150 Here comes the directory listing.
226 Directory send OK.
ftp> ! cat server_logs.txt # ローカルでファイル内容を確認 - 注意点:
ls
とdir
の出力形式や挙動は、サーバー側の実装(特にLIST
コマンドの出力形式)やFTPクライアントによって若干異なる場合があります。
ファイル操作関連コマンド
ファイルのアップロード、ダウンロード、削除、名前変更、ディレクトリ作成/削除など、実際のファイル操作を行うコマンドです。
get
FTPサーバーから単一のファイルをダウンロードし、ローカルに保存します。
- 構文:
get リモートファイル [ローカルファイル]
- 説明: 指定したリモートファイルをダウンロードします。
[ローカルファイル]
: ダウンロードしたファイルを指定した名前でローカルに保存します。省略した場合、リモートファイル名と同じ名前で保存されます。
- 転送モード: ファイルの種類に応じて
binary
またはascii
モードを使用する必要があります(後述)。通常、画像、実行ファイル、圧縮ファイルなどはbinary
、テキストファイルはascii
を使用します。 - 使用例:
ftp
ftp> binary # バイナリモードに設定
200 Type set to I.
ftp> get image.jpg
200 PORT command successful.
150 Opening BINARY mode data connection for image.jpg (56789 bytes).
226 Transfer complete.
56789 bytes received in 0.12 seconds (461.85 Kbytes/s)
ftp
ftp> ascii # アスキーモードに設定
200 Type set to A.
ftp> get index.html local_index.html
200 PORT command successful.
150 Opening ASCII mode data connection for index.html (1234 bytes).
226 Transfer complete.
1234 bytes received in 0.01 seconds (123.4 Kbytes/s) - オプション: 一部のクライアントでは、上書きを確認するオプションなどがありますが、標準的な
ftp
コマンドではあまり多くのオプションはありません。転送中の進捗表示にはhash
コマンドを使用します(後述)。
mget
FTPサーバーから複数のファイルを一括でダウンロードします。ワイルドカードが使用できます。
- 構文:
mget リモートファイル指定1 [リモートファイル指定2 ...]
- 説明: 指定したパターン(ワイルドカードを含む)に一致する複数のファイルをダウンロードします。
prompt
オプション:mget
コマンドを実行する前に、prompt
コマンドの状態を確認してください。デフォルトでは、ダウンロードする各ファイルに対して確認(プロンプト)が表示されます。prompt
をオフ(off
)にすると、確認なしにすべてのファイルがダウンロードされます。- 転送モード:
get
と同様、適切な転送モード(binary
またはascii
)を設定する必要があります。 - 使用例:
ftp
ftp> prompt off # 確認プロンプトを無効にする
Interactive mode off.
ftp> binary
200 Type set to I.
ftp> mget images/*.jpg # images ディレクトリ内のすべての jpg ファイルをダウンロード
200 PORT command successful.
150 Opening BINARY mode data connection for images/image1.jpg (12345 bytes).
226 Transfer complete.
12345 bytes received in 0.05 seconds (246.9 Kbytes/s)
150 Opening BINARY mode data connection for images/image2.jpg (67890 bytes).
226 Transfer complete.
67890 bytes received in 0.20 seconds (339.45 Kbytes/s)
...
ftp
ftp> prompt # 確認プロンプトを有効にする
Interactive mode on.
ftp> ascii
200 Type set to A.
ftp> mget *.txt # 現在のディレクトリのすべての txt ファイルをダウンロード(確認あり)
mget file1.txt? y
200 PORT command successful.
150 Opening ASCII mode data connection for file1.txt (100 bytes).
226 Transfer complete.
...
mget file2.txt? n
... - 注意点: サブディレクトリ内のファイルを再帰的にダウンロードする機能は、標準的な
ftp
コマンドにはありません。これはmget
が単に現在のサーバーディレクトリでワイルドカードを展開し、一致するファイルに対してRETR
コマンドを発行するためです。サブディレクトリを含めた再帰的なダウンロードには、lftp
やncftp
といったより高機能なクライアントを使用するか、スクリプトで制御する必要があります。
put
ローカルの単一ファイルをFTPサーバーにアップロードします。
- 構文:
put ローカルファイル [リモートファイル]
- 説明: 指定したローカルファイルをアップロードします。
[リモートファイル]
: アップロード後のサーバー上のファイル名を指定します。省略した場合、ローカルファイル名と同じ名前で保存されます。
- 転送モード: ファイルの種類に応じて
binary
またはascii
モードを使用する必要があります。 - 使用例:
ftp
ftp> binary
200 Type set to I.
ftp> put my_document.pdf
200 PORT command successful.
150 Ok to send data.
226 Transfer complete.
123456 bytes sent in 0.3 seconds (411.52 Kbytes/s)
ftp
ftp> ascii
200 Type set to A.
ftp> put local_config.txt server_config.txt
200 PORT command successful.
150 Ok to send data.
226 Transfer complete.
500 bytes sent in 0.01 seconds (50.0 Kbytes/s)
mput
ローカルの複数のファイルを一括でFTPサーバーにアップロードします。ワイルドカードが使用できます。
- 構文:
mput ローカルファイル指定1 [ローカルファイル指定2 ...]
- 説明: 指定したパターン(ワイルドカードを含む)に一致するローカルの複数のファイルをアップロードします。
prompt
オプション:mput
コマンドを実行する前に、prompt
コマンドの状態を確認してください。デフォルトでは、アップロードする各ファイルに対して確認(プロンプト)が表示されます。prompt
をオフ(off
)にすると、確認なしにすべてのファイルがアップロードされます。- 転送モード:
put
と同様、適切な転送モード(binary
またはascii
)を設定する必要があります。 - 使用例:
ftp
ftp> prompt off
Interactive mode off.
ftp> binary
200 Type set to I.
ftp> mput backups/*.zip # ローカルの backups ディレクトリ内のすべての zip ファイルをアップロード
200 PORT command successful.
150 Ok to send data.
226 Transfer complete.
...
ftp
ftp> prompt
Interactive mode on.
ftp> ascii
200 Type set to A.
ftp> mput *.html # 現在のローカルディレクトリのすべての html ファイルをアップロード(確認あり)
mput page1.html? y
...
mput page2.html? n
... - 注意点: サブディレクトリ内のファイルを再帰的にアップロードする機能は、標準的な
ftp
コマンドにはありません。ローカルの現在のディレクトリでワイルドカードが展開されます。サブディレクトリを含めた再帰的なアップロードには、より高機能なクライアントを使用するか、スクリプトで制御する必要があります。
delete
FTPサーバー上の単一ファイルを削除します。
- 構文:
delete リモートファイル
- 説明: 指定したリモートファイルをサーバーから削除します。
- 使用例:
ftp
ftp> delete old_file.txt
250 Delete operation successful.
mdelete
FTPサーバー上の複数のファイルを一括で削除します。ワイルドカードが使用できます。
- 構文:
mdelete リモートファイル指定1 [リモートファイル指定2 ...]
- 説明: 指定したパターン(ワイルドカードを含む)に一致する複数のファイルをサーバーから削除します。
prompt
オプション:mdelete
コマンドを実行する前に、prompt
コマンドの状態を確認してください。デフォルトでは、削除する各ファイルに対して確認(プロンプト)が表示されます。prompt
をオフ(off
)にすると、確認なしにすべてのファイルが削除されます。- 使用例:
ftp
ftp> prompt off
Interactive mode off.
ftp> mdelete *.bak # すべての .bak ファイルを削除(確認なし)
250 Delete operation successful.
...
ftp
ftp> prompt
Interactive mode on.
ftp> mdelete temp_* # temp_ で始まるファイルを削除(確認あり)
delete temp_1.txt? y
...
delete temp_2.txt? n
...
rename
FTPサーバー上のファイル名を変更します。
- 構文:
rename 古いリモートファイル名 新しいリモートファイル名
- 説明: 指定した古いリモートファイル名を、新しいリモートファイル名に変更します。
- 使用例:
ftp
ftp> rename file1.txt document.txt
350 File or directory exists, ready for new name.
250 Rename successful.
mkdir
FTPサーバー上に新しいディレクトリを作成します。
- 構文:
mkdir リモートディレクトリ名
- 説明: 指定した名前でリモートディレクトリを作成します。絶対パスまたは相対パスを使用できます。
- 使用例:
ftp
ftp> mkdir new_folder
257 "new_folder" created.
ftp
ftp> mkdir /home/myuser/backups/daily
257 "/home/myuser/backups/daily" created.
rmdir
FTPサーバー上の空のディレクトリを削除します。
- 構文:
rmdir リモートディレクトリ名
- 説明: 指定した名前のリモートディレクトリを削除します。ディレクトリが空でない場合は削除できません。
- 使用例:
ftp
ftp> rmdir old_folder
250 RMD command successful.
append
ローカルファイルをFTPサーバー上の既存ファイルの末尾に追記します。
- 構文:
append ローカルファイル リモートファイル
- 説明: 指定したローカルファイルの内容を、サーバー上の指定した既存ファイルの末尾に追記します。サーバー上にリモートファイルが存在しない場合は新規作成されます。
- 転送モード: テキストファイルを追記する場合は
ascii
、バイナリデータを追記する場合はbinary
を使用します。 - 使用例:
ftp
ftp> ascii
200 Type set to A.
ftp> append local_log.txt server_log.txt
設定関連コマンド
ファイル転送の挙動やクライアントの表示方法などを設定するコマンドです。
binary
および ascii
ファイル転送モードを設定します。これはFTPにおいて非常に重要な設定です。
- 構文:
binary
またはtype i
ascii
またはtype a
- 説明:
binary
: バイナリ転送モードを設定します。画像、実行ファイル、圧縮ファイル、PDFなど、バイト列として正確に転送する必要があるファイルに使用します。このモードでは、データの変換は行われません。ascii
: アスキー転送モードを設定します。テキストファイルに使用します。異なるOS間(例: WindowsとUnix/Linux)でテキストファイルの改行コード(CR+LF vs LF)を自動的に変換します。
- 重要性: 誤ったモードで転送すると、テキストファイルでは改行がおかしくなったり、バイナリファイルではファイルが破損したりする原因となります。ファイル転送を行う前に必ず適切なモードを設定してください。多くのクライアントはデフォルトでバイナリモードになっています。
- 使用例:
ftp
ftp> binary
200 Type set to I.
ftp> ascii
200 Type set to A.
hash
ファイル転送中にハッシュ記号(#
)を表示させ、進捗状況を確認できるようにします。
- 構文:
hash
- 説明:
hash
コマンドを実行するたびに、ハッシュ表示機能の有効/無効が切り替わります。有効になっている場合、一定のバイト数転送されるごとに##...
と表示されます。転送速度やファイルサイズが大きい場合に便利です。 - 使用例:
ftp
ftp> hash
Hash mark printing now ON.
ftp> get large_file.zip
######### ####################### ... #########
226 Transfer complete.
もう一度hash
を実行すると無効になります。
ftp> hash
Hash mark printing now OFF.
prompt
mget
および mput
コマンド実行時に、各ファイルを転送する前に確認(プロンプト)を表示するかどうかを設定します。
- 構文:
prompt
- 説明:
prompt
コマンドを実行するたびに、プロンプト機能の有効/無効が切り替わります。- デフォルトは有効(
on
)で、各ファイルごとにmget file.txt? [y/n]
のように表示され、y
と入力しないと転送されません。 - 無効(
off
)にすると、ワイルドカードに一致するファイルがすべて確認なしに転送されます。自動化されたスクリプトなどでは無効にするのが一般的です。
- デフォルトは有効(
- 使用例:
ftp
ftp> prompt
Interactive mode off. # 無効になった
ftp
ftp> prompt
Interactive mode on. # 有効になった
bell
ファイル転送が完了した際に、ビープ音を鳴らすかどうかを設定します。
- 構文:
bell
- 説明:
bell
コマンドを実行するたびに、ビープ音機能の有効/無効が切り替わります。 - 使用例:
ftp
ftp> bell
Bell mode on.
verbose
詳細表示(サーバーからの応答コードやメッセージなど)を有効/無効にします。
- 構文:
verbose
- 説明:
verbose
コマンドを実行するたびに、詳細表示機能の有効/無効が切り替わります。デフォルトは有効です。無効にすると、FTPコマンドの応答コードなどが表示されず、より簡潔な出力になります。デバッグやエラーの原因特定には有効にしておくのが便利です。 - 使用例:
ftp
ftp> verbose
Verbose mode off.
ftp> get file.txt
150 ...
226 ...
# サーバー応答コードが表示されなくなる
debug
デバッグ情報を表示するかどうかを設定します。
- 構文:
debug
- 説明:
debug
コマンドを実行するたびに、デバッグ機能の有効/無効が切り替わります。有効にすると、クライアントとサーバー間でやり取りされるコマンドや応答コードなどが詳細に表示されます。プロトコルの問題を診断する際に役立ちます。 - 使用例:
ftp
ftp> debug
Debugging on (client side debugging).
ftp> pwd
---> PWD
<--- 257 "/home/myuser" is the current directory.
257 "/home/myuser" is the current directory.
# コマンドや応答が詳細に表示される
literal
または quote
任意のFTPコマンドをサーバーに直接送信します。標準のFTPクライアントコマンドにマッピングされていないサーバー固有のコマンドなどを実行したい場合に便利です。
- 構文:
literal FTPコマンドと引数
またはquote FTPコマンドと引数
- 説明: 指定した文字列をFTPコマンドとしてそのままサーバーに送信します。FTPプロトコルのRFCで定義されているコマンドであれば、ほぼ何でも実行可能です。例えば、
SITE CHMOD 755 my_script.sh
のように、サーバー側のファイルパーミッションを変更するSITE CHMOD
コマンドなどを実行できます(サーバーが対応している場合)。 - 使用例:
ftp
ftp> literal SYST # サーバーのシステム情報を取得
---> SYST
<--- 215 UNIX Type: L8
215 UNIX Type: L8
ftp
ftp> quote SITE CHMOD 755 public_html/index.cgi # ファイルパーミッションを変更
---> SITE CHMOD 755 public_html/index.cgi
<--- 200 CHMOD command successful.
passive
データ転送モードをパッシブモードに設定します。
- 構文:
passive
- 説明: クライアントとサーバー間のデータ転送にパッシブモードを使用するよう設定します。通常、ファイアウォールがある環境ではパッシブモードが推奨されます。
- 使用例:
ftp
ftp> passive
Passive mode on.
active
データ転送モードをアクティブモードに設定します。
- 構文:
active
- 説明: クライアントとサーバー間のデータ転送にアクティブモードを使用するよう設定します。ネットワーク環境によってはアクティブモードの方が適している場合もありますが、クライアント側のファイアウォールでポートを開放する必要があることが多いです。
- 使用例:
ftp
ftp> active
Passive mode off.
(多くのクライアントでは、アクティブモードへの切り替えはパッシブモードをオフにすることで行われます。)
ローカル操作関連コマンド
FTPクライアントは、リモートサーバーだけでなく、クライアントが実行されているローカルマシン上のファイルシステムにもアクセスします。これらのコマンドはローカル操作に関わります。
lcd
Local Change Directory の略。FTPクライアントが実行されているローカルマシンの現在の作業ディレクトリを変更します。
- 構文:
lcd [ローカルディレクトリ]
- 説明:
mget
,mput
,put
,get
コマンドなどでファイルを転送する際の、ローカル側の基準ディレクトリを指定します。ローカルディレクトリを省略した場合、ホームディレクトリに戻ります。 - 使用例:
ftp
ftp> lcd /home/myuser/downloads
Local directory now /home/myuser/downloads
ftp
ftp> lcd ..
Local directory now /home/myuser
lpwd
Local Print Working Directory の略。FTPクライアントが実行されているローカルマシンの現在の作業ディレクトリを表示します。
- 構文:
lpwd
- 説明:
lcd
コマンドで設定したローカルの作業ディレクトリを表示します。 - 使用例:
ftp
ftp> lpwd
Local working directory: /home/myuser/downloads
! command
FTPプロンプトから、FTPクライアントを終了せずにローカルのシェルコマンドを実行します。
- 構文:
! ローカルシェルコマンド
- 説明: 感嘆符(
!
)の後に続く文字列を、オペレーティングシステムのシェルコマンドとして実行します。実行後、FTPプロンプトに戻ります。ローカルファイルの確認や移動、その他のシステム操作が必要な場合に便利です。 - 使用例:
ftp
ftp> ! ls -l # ローカルディレクトリのファイルリストを表示
total 10
-rw-r--r-- 1 user user 1000 Jan 15 10:00 local_file.txt
drwxr-xr-x 2 user user 4096 Jan 14 15:00 local_folder
ftp>
ftp
ftp> ! mkdir temp_upload # ローカルに一時ディレクトリを作成
ftp>
情報取得関連コマンド
FTPクライアントやサーバーの状態に関する情報を取得するコマンドです。
status
現在のFTPクライアントセッションの状態を表示します。接続先のサーバー、ログインユーザー、転送モード(バイナリ/アスキー)、データ転送モード(アクティブ/パッシブ)、プロンプトモード、ハッシュモードなどの設定が表示されます。
- 構文:
status
- 説明: 現在のクライアントの状態設定や接続情報を確認できます。
- 使用例:
ftp
ftp> status
Connected to ftp.example.com.
Logged in as myuser.
Type: binary; Verbose: on; Bell: off; Prompt: on; Hash: off; Glob: on.
Mode: stream; Structure: file.
Data connection: passive.
system
FTPサーバーのオペレーティングシステム情報を取得します。
- 構文:
system
- 説明: サーバーに
SYST
コマンドを送信し、サーバーのオペレーティングシステムやタイプに関する応答を表示します。 - 使用例:
ftp
ftp> system
215 UNIX Type: L8
help
または ?
FTPクライアントがサポートしているコマンドのリストや、特定のコマンドの簡単な説明を表示します。
- 構文:
help [コマンド名]
または? [コマンド名]
- 説明:
- コマンド名を指定しない場合、クライアントが認識するすべてのコマンドのリストを表示します。
- コマンド名を指定した場合、そのコマンドの簡単な説明を表示します。
-
使用例:
“`ftp
ftp> help
Commands may be abbreviated. Commands are:! debug mdelete prompt rstatus
? dir mdir proxy rhelp
account disconnect mget send rmdir
append form mkdir site status
ascii get mlsd size struct
bell glob mlst system sunique
binary hash mode tar tenex
bye help mput trace type
case idle nlist user verbose
cd image nmap open ?
cdup lcd ntrans
close ls nerr
cr macdef passive
delete mdelete pdirftp> help get
get receive file
“`
その他のコマンドや概念
site
FTPサーバー固有のサイトコマンドを実行します。機能はサーバーによって異なります。
- 構文:
site サイトコマンドと引数
- 説明: サーバーに
SITE
コマンドとして指定した文字列を送信します。ファイルパーミッションの変更(CHMOD
)、ファイル所有者の変更(CHOWN
)、グループの変更(CHGRP
)などが一般的です。ただし、サーバーがこれらのコマンドに対応している必要があります。literal
コマンドを使ってSITE ...
と入力するのと同等です。 - 使用例:
ftp
ftp> site CHMOD 644 index.html
200 SITE CHMOD command successful.
glob
mget
, mput
, mdelete
などでワイルドカードを展開するかどうかを設定します。
- 構文:
glob
- 説明:
glob
コマンドを実行するたびに、ワイルドカード展開機能の有効/無効が切り替わります。デフォルトは有効(on
)です。無効にすると、mget *.txt
のようなコマンドは、文字通り “*.txt” という名前の単一ファイルを転送しようとします(そのようなファイルが存在すれば)。通常は有効のままにしておきます。 - 使用例:
ftp
ftp> glob
Globbing off.
ftp> mget *.txt
# "*.txt" という名前の単一ファイル転送を試みる
転送速度やファイルサイズの制限
標準的なftp
コマンドには、転送速度を制限したり、特定のファイルサイズ以上のファイルだけを転送したり、といった高度なオプションは通常ありません。これらの機能が必要な場合は、lftp
や ncftp
といった他の高機能なコマンドラインFTPクライアントを検討する必要があります。
再帰的な操作 (mirror
など)
ディレクトリ構造を維持したまま、ディレクトリとそのサブディレクトリ内のすべてのファイルを再帰的にダウンロードまたはアップロードする機能も、標準的なftp
コマンドにはありません。mget
や mput
は現在のディレクトリのみで機能します。この機能も lftp
の mirror
コマンドなどが提供しています。
FTPコマンドラインクライアントの使用を効率化するヒント
コマンドラインFTPを単体で使うだけでなく、他のツールや設定と組み合わせることで、さらに効率的にファイル転送を行うことができます。
スクリプト化(バッチファイル、シェルスクリプト)
定型的なファイル転送タスク(例: 毎日のバックアップ、定期的なレポートファイルのアップロード)は、スクリプトにすることで自動化できます。FTPコマンドラインクライアントは、コマンドを標準入力から受け付けることができるため、スクリプトからFTPセッションを制御することが可能です。
基本的なスクリプトの例(Bashシェルスクリプト、Linux/macOS向け):
“`bash
!/bin/bash
FTP_SERVER=”ftp.example.com”
FTP_USER=”myuser”
FTP_PASS=”mypassword” # 非推奨!後述の.netrcを参照
LOCAL_DIR=”/path/to/local/backups”
REMOTE_DIR=”/path/to/remote/destination”
TIMESTAMP=$(date +”%Y%m%d%H%M%S”)
BACKUP_FILE=”backup_${TIMESTAMP}.zip”
ローカルでバックアップファイルを作成(例)
zip -r “${LOCAL_DIR}/${BACKUP_FILE}” /path/to/data_to_backup
FTPコマンドをヒアドキュメントでftpクライアントに渡す
ftp -n ${FTP_SERVER} <<EOF
user ${FTP_USER} ${FTP_PASS}
binary
cd ${REMOTE_DIR}
lcd ${LOCAL_DIR}
prompt off
put ${BACKUP_FILE}
bye
EOF
バックアップファイルのアップロードが成功したかどうかの確認(簡易的)
if [ $? -eq 0 ]; then
echo “Backup file ${BACKUP_FILE} uploaded successfully.”
else
echo “Error uploading backup file ${BACKUP_FILE}.”
fi
ローカルの一時ファイルを削除(オプション)
rm “${LOCAL_DIR}/${BACKUP_FILE}”
“`
このスクリプトでは、
* ftp -n ${FTP_SERVER}
: FTPクライアントを起動し、指定されたサーバーに接続します。-n
オプションは、接続時に自動ログイン(.netrc
ファイルの参照)を抑制するために使用しますが、ユーザー/パスワードを直接渡す場合は不要なこともあります(環境による)。
* <<EOF ... EOF
: ヒアドキュメントと呼ばれる構文で、<<EOF
から次の EOF
までのテキストブロックを標準入力として ftp
コマンドに渡します。ここにFTPコマンド(user
, binary
, cd
, lcd
, prompt off
, put
, bye
)を記述します。
Windowsのバッチファイルでも同様のことが可能ですが、構文が異なります。FTPコマンドをテキストファイルに記述し、ftp -s:コマンドファイル名
の形式で実行するのが一般的です。
コマンドファイル (ftp_commands.txt
):
open ftp.example.com
user myuser mypassword
binary
cd /path/to/remote/destination
lcd C:\path\to\local\backups
prompt off
put backup_file.zip
bye
バッチファイル (upload_backup.bat
):
“`batch
@echo off
set FTP_COMMANDS=ftp_commands.txt
set BACKUP_FILE=backup_%date:~-4,4%%date:~-10,2%%date:~-7,2%%time:~0,2%%time:~3,2%%time:~6,2%.zip
REM ローカルでバックアップファイルを作成(例)
REM jar cf %BACKUP_FILE% C:\path\to\data_to_backup
REM コマンドファイルの一部を動的に生成する場合
echo open ftp.example.com > %FTP_COMMANDS%
echo user myuser mypassword >> %FTP_COMMANDS%
echo binary >> %FTP_COMMANDS%
echo cd /path/to/remote/destination >> %FTP_COMMANDS%
echo lcd C:\path\to\local\backups >> %FTP_COMMANDS%
echo prompt off >> %FTP_COMMANDS%
echo put %BACKUP_FILE% >> %FTP_COMMANDS%
echo bye >> %FTP_COMMANDS%
ftp -s:%FTP_COMMANDS%
REM エラーチェックなどをここに追加
REM 一時コマンドファイルを削除
del %FTP_COMMANDS%
“`
セキュリティに関する注意: スクリプト内にパスワードを平文で記述するのは非常に危険です。次に説明する .netrc
ファイルを使用することを強く推奨します。
.netrc
ファイル(自動ログイン)
UNIX/Linux環境の標準的なftp
クライアントは、ユーザーのホームディレクトリにある .netrc
という名前のファイルを自動的に読み込み、接続先のサーバーに応じたログイン情報を取得する機能があります。これにより、スクリプトにパスワードを記述したり、接続時に手動で入力したりする必要がなくなります。
.netrc
ファイルのフォーマットは以下の通りです。
machine ホスト名またはIPアドレス
login ユーザー名
password パスワード
複数のエントリを持つことができます。
“`
machine ftp.example.com
login myuser
password mypassword
machine backup.example.com
login backupuser
password backuppass
“`
.netrc
ファイルを使用する際のセキュリティ:
1. パーミッション: .netrc
ファイルのパーミッションは、必ず所有者のみが読み書きできるように設定してください。他のユーザーに読み書きされると、パスワードが漏洩する危険があります。UNIX/Linuxでは、chmod 600 ~/.netrc
コマンドで設定します。パーミッションが適切でない場合、ftp
クライアントはこのファイルを無視することがあります。
2. 平文パスワード: パスワードがファイルに平文で保存されるため、ファイルシステムへのアクセス権限を持つ攻撃者にとってはリスクとなります。より高いセキュリティが必要な場合は、SFTPやFTPSを使用するか、鍵認証などの代替手段を検討してください。
.netrc
ファイルが存在し、パーミッションが適切に設定されていれば、ftp ftp.example.com
のように接続するだけで、自動的にユーザー名とパスワードが送信されてログインが試みられます。スクリプトで-n
オプションを使用しない場合も、この自動ログイン機能が利用されます。
エイリアス設定
頻繁に使用する一連のFTPコマンドを、短いエイリアスとして登録できるクライアントもあります(標準的なftp
コマンドにはこの機能は限定的かもしれません)。これにより、タイプ量を減らし、作業効率を向上させることができます。より高機能なクライアント(例: lftp
)では強力なエイリアス機能やマクロ機能が提供されています。
ワイルドカードの活用
mget
, mput
, mdelete
, ls
, dir
コマンドでワイルドカード(*
, ?
, []
など)を効果的に活用することで、複数ファイルを一括で操作できます。ただし、使用できるワイルドカードの種類や挙動は、FTPサーバーの実装やクライアントによって若干異なる場合があります。一般的には、*
(任意の文字列)や ?
(任意の一文字)が広くサポートされています。
エラーハンドリングの重要性
スクリプトでFTPコマンドを実行する場合、コマンドが成功したか失敗したかを判断し、適切にエラーを処理することが重要です。標準的なftp
コマンドは、コマンドの実行結果に応じて終了コード(シェル変数 $?
などで取得可能)を返すことがありますが、詳細なエラー情報の取得や複雑なエラー処理は難しい場合があります。より堅牢な自動化を行うには、よりスクリプト向きに設計されたクライアント(例: ncftpget
, ncftpput
など)や、FTPプロトコルライブラリを使用できるプログラミング言語(Python, Perlなど)を利用する方が適している場合もあります。
セキュリティに関する考慮事項
FTPは非常に古いプロトコルであり、設計された当時はセキュリティが今日のようには重視されていませんでした。そのため、いくつかの重大なセキュリティ上の脆弱性を抱えています。
FTPの脆弱性(平文通信)
FTPの最も大きな問題点は、ユーザー名、パスワード、そしてデータ転送そのものがすべて暗号化されずに平文でネットワーク上を流れることです。
- 認証情報の漏洩: 悪意のある第三者がネットワーク上の通信を傍受(パケットスニッフィング)した場合、FTPのログイン情報(ユーザー名とパスワード)を容易に取得できます。これにより、サーバーへの不正アクセスを許してしまう可能性があります。
- データの中身の漏洩: 転送されるファイルの内容も平文で流れるため、機密性の高い情報を含むファイルをFTPで転送すると、その内容が傍受されるリスクがあります。
- 中間者攻撃 (Man-in-the-Middle Attack): アクティブモードにおけるデータコネクションの仕組みは、特定のタイプの中間者攻撃に対して脆弱であると指摘されることがあります。パッシブモードである程度緩和されますが、根本的な解決にはなりません。
これらの理由から、特にインターネット経由で重要なファイルや認証情報をやり取りする場合には、FTPをそのまま使用することは強く推奨されません。信頼できる閉じたネットワーク内でのみ使用するか、後述するよりセキュアな代替手段を利用するべきです。
SFTP, FTPSなどの代替手段の紹介
FTPのセキュリティ上の問題を克服するために、いくつかの代替プロトコルや拡張機能が開発されています。
- SFTP (SSH File Transfer Protocol): SSHプロトコル上で動作するファイル転送プロトコルです。SSHはもともとリモートログインのための暗号化されたプロトコルであり、その上でファイル転送を行うため、認証情報もファイルデータもすべて暗号化されます。ポート22番を使用します。多くのSSHサーバーはSFTPサーバー機能も内蔵しており、SSHクライアントソフトウェアの多くがSFTPクライアント機能を備えています。FTPとは全く異なるプロトコルです。
- FTPS (FTP over SSL/TLS): 既存のFTPプロトコルにSSL/TLS暗号化を追加したものです。制御コネクションまたはデータコネクション、あるいはその両方をSSL/TLSで暗号化できます。接続方法によって大きく分けて2種類あります。
- Explicit FTPS (AUTH TLS): 標準のFTPポート21番で接続を開始し、その後
AUTH TLS
コマンドなどを使って暗号化されたセッションに昇格させます。サーバーとクライアントの両方がこの機能をサポートしている必要があります。 - Implicit FTPS: FTPの制御コネクションとデータコネクションの両方を最初からSSL/TLSで暗号化します。通常、標準のFTPポート21番ではなく、ポート990番を使用します。
FTPSはFTPプロトコルをベースにしているため、FTPのコマンド構造などは引き継がれていますが、SSL/TLSハンドシェイクなどのプロセスが追加されます。
- Explicit FTPS (AUTH TLS): 標準のFTPポート21番で接続を開始し、その後
セキュリティが求められる環境では、FTPの代わりにSFTPやFTPSを使用することを強く検討してください。多くのコマンドラインツールやライブラリがSFTPやFTPSに対応しています。例えば、OpenSSHに含まれる sftp
コマンドや、様々なプログラム言語のライブラリ、サードパーティ製のクライアントソフトウェアなどが利用可能です。
まとめ
この記事では、FTPコマンドラインクライアント、特に標準的なftp
コマンドに焦点を当て、その基本的な仕組みから、接続、ナビゲーション、ファイル操作、設定、情報取得、そしてローカル操作に至るまで、主要なコマンドとそのオプションについて詳細に解説しました。
open
でサーバーに接続し、user
/pass
で認証、cd
/pwd
/ls
/dir
でサーバー上のファイルシステムを探索し、get
/put
/mget
/mput
でファイルを転送し、delete
/mdelete
/rename
/mkdir
/rmdir
でファイルを管理する。これらの基本的な操作をコマンドラインで行えるようになるだけで、GUIクライアントでは実現しにくい高度な作業や自動化が可能になります。
特に、binary
/ascii
での転送モードの切り替え、prompt
による複数ファイル操作時の確認の有効/無効、hash
による進捗表示、そしてpassive
/active
によるデータ転送モードの選択といった設定関連のコマンドは、FTP通信を適切に行う上で不可欠です。また、lcd
/lpwd
や!
コマンドは、ローカル環境との連携をスムーズに行うために役立ちます。
FTPコマンドラインクライアントは、スクリプトと組み合わせることでその真価を発揮します。シェルスクリプトやバッチファイル、そして.netrc
ファイルを活用することで、定型的なファイル転送タスクを自動化し、運用コストを大幅に削減できます。
ただし、FTPプロトコルが持つセキュリティ上の脆弱性、特に認証情報やデータが平文で流れる点は十分に理解しておく必要があります。機密性の高い情報を取り扱う場合や、信頼できないネットワーク経由で接続する場合は、SFTPやFTPSといったよりセキュアな代替手段の利用を強く推奨します。
FTPコマンドラインの学習は、単にファイル転送ができるようになるだけでなく、ネットワークプロトコルの仕組みの一端を理解する上でも貴重な経験となります。この記事が、あなたがFTPコマンドラインをマスターし、ファイル転送作業をより効率的かつ自在に行えるようになるための羅針盤となることを願っています。様々なコマンドやオプションを実際に試し、あなたのニーズに合った使い方を見つけてください。