FTPコマンドオプション完全ガイド:ファイル転送を効率化


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には、他の多くのプロトコルとは異なる独特の仕組みがあります。それは、「制御コネクション」と「データコネクション」という、性質の異なる二つの接続を同時に使用することです。

  1. 制御コネクション (Control Connection):

    • 通常、TCPポート21番を使用します(サーバー側)。
    • FTPコマンド(例: USER, PASS, PORT, PASV, RETR, STOR, LIST, QUITなど)の送信と、サーバーからの応答(ステータスコード付きのテキストメッセージ)の受信に使用されます。
    • このコネクションは、FTPセッションが確立されている間、常にアクティブな状態を保ちます。FTPクライアントがFTPサーバーに接続し、ログインが成功すると、この制御コネクションが確立されます。
  2. データコネクション (Data Connection):

    • ファイルのリスト表示 (LIST, NLST) や実際のファイル転送 (RETR (ダウンロード), STOR (アップロード), APPE (追記), etc.) に使用されます。
    • 使用されるポートは、アクティブモードかパッシブモードかによって異なります。

FTPのモード:アクティブモードとパッシブモード

データコネクションを確立する方法には、以下の二つのモードがあります。これは、特にファイアウォールなどのネットワーク構成において重要な考慮事項となります。

  1. アクティブモード (Active Mode):

    • クライアントが制御コネクション上で PORT コマンドを送信し、データコネクションを待ち受けるローカルポート番号をサーバーに通知します。
    • サーバーは、そのポート番号(通常は20番ポートから)からクライアントのアドレスと指定されたポートに向けてデータコネクションを確立します。
    • 問題点: クライアント側のファイアウォールが、外部からの着信接続(サーバーからのデータコネクション確立要求)をブロックする可能性があります。
  2. パッシブモード (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番ポート以外のポートで待ち受けている場合に指定します。通常は省略可能です。

使用例:

  1. FTPクライアントを起動し、後から接続する場合:
    bash
    ftp

    起動後、プロンプト(通常 ftp> と表示されます)が表示され、ここで接続コマンドなどを入力します。

  2. 起動と同時に特定のサーバーに接続する場合:
    bash
    ftp ftp.example.com

    またはIPアドレスで:
    bash
    ftp 192.168.1.100

  3. 特定のポートを指定して接続する場合(例: ポート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サーバー上のファイルやディレクトリのリストを表示します。ローカルの lsdir とは動作が異なります。

  • 構文: ls [リモートディレクトリ] [ローカルファイル]
    dir [リモートディレクトリ] [ローカルファイル]
  • 説明: lsNLST コマンドを、dirLIST コマンドをサーバーに送信します。
    • 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 # ローカルでファイル内容を確認
  • 注意点: lsdir の出力形式や挙動は、サーバー側の実装(特に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 コマンドを発行するためです。サブディレクトリを含めた再帰的なダウンロードには、lftpncftp といったより高機能なクライアントを使用するか、スクリプトで制御する必要があります。
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 pdir

    ftp> 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コマンドには、転送速度を制限したり、特定のファイルサイズ以上のファイルだけを転送したり、といった高度なオプションは通常ありません。これらの機能が必要な場合は、lftpncftp といった他の高機能なコマンドラインFTPクライアントを検討する必要があります。

再帰的な操作 (mirrorなど)

ディレクトリ構造を維持したまま、ディレクトリとそのサブディレクトリ内のすべてのファイルを再帰的にダウンロードまたはアップロードする機能も、標準的なftpコマンドにはありません。mgetmput は現在のディレクトリのみで機能します。この機能も lftpmirror コマンドなどが提供しています。

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ハンドシェイクなどのプロセスが追加されます。

セキュリティが求められる環境では、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コマンドラインをマスターし、ファイル転送作業をより効率的かつ自在に行えるようになるための羅針盤となることを願っています。様々なコマンドやオプションを実際に試し、あなたのニーズに合った使い方を見つけてください。


コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

上部へスクロール