LinuxでFTPサーバに接続してファイル転送する方法と安全上の注意点

LinuxからFTPサーバに接続し、ファイルをアップロード・ダウンロードするには、接続先だけでなく、手元とサーバのどちらを操作しているかを意識することが大切です。この記事では、対話型のftpコマンドを使う基本手順と、転送に失敗したときの確認点、SFTP・FTPSとの違いを解説します。

暗号化しないFTPは、ファイルの内容だけでなくユーザー名とパスワードも平文で送信します。実際の業務データや認証情報を扱う場合は、接続先が提供するSFTPまたはFTPSを優先してください。以下のFTP手順は、管理者が利用を認めた学習・検証環境などを想定しています。

目次

FTPとは何か

FTP(File Transfer Protocol)は、ネットワークを介してファイルを送受信するためのプロトコルです。ログインやコマンドをやり取りする「制御接続」と、ファイルや一覧を送る「データ接続」を分けて使います。通常、FTPの制御接続にはTCPポート21を使用しますが、接続先の指定を優先します。

  • アクティブモード:クライアントが待ち受けるデータ用ポートへ、サーバから接続します。
  • パッシブモード:サーバが通知したデータ用ポートへ、クライアントから接続します。NATやファイアウォールの内側から利用する場合によく使われます。

どちらもデータ接続の作り方の違いであり、暗号化を有効にする機能ではありません。仕組みはRFC 959、ファイアウォールとの関係はRFC 1579で説明されています。

LinuxでFTPクライアントを利用する前の準備

クライアントの有無と種類を確認する

ftpコマンドが標準で入っているとは限りません。また、同じコマンド名でもGNU Inetutils、tnftpなど実装が異なり、オプションや初期設定に違いがあります。まずLinuxのシェルで確認します。

command -v ftp
man ftp

見つからない場合は、利用中のディストリビューションとバージョンに対応した公式パッケージを確認してください。例えば、Debian 13(trixie)ではGNU InetutilsのFTPクライアントをinetutils-ftpとして提供しています。その環境で導入する場合の例は次のとおりです。

sudo apt update
sudo apt install inetutils-ftp

これはDebian向けの例です。Ubuntuなどの派生環境やRed Hat系に同じパッケージ名をそのまま当てはめず、公式リポジトリと管理者の運用方針を確認してください。以降のFTP例はGNU Inetutilsを基準にしています。

接続情報と作業場所を用意する

  • 接続方式:FTP、明示的FTPS、暗黙的FTPS、SFTPのどれか。ホスト名だけでは判断できません。
  • ホスト名・ポート番号・認証方法:ユーザー名、パスワード、またはSSH鍵など、管理者が指定した情報。
  • ファイルと権限:ダウンロード元、アップロード先、読み書きの許可、既存ファイルを置き換えてよいか。
  • 手元の作業場所:保存先と送信元を区別できる、確認済みのディレクトリ。

この記事のftp.example.com、alice、ディレクトリ名は説明用です。許可された接続先と実在するパスに置き換えてください。匿名FTPはサーバが明示的に許可している場合だけ利用し、ログイン情報はその提供元の案内に従います。

FTPサーバへの接続方法

GNU Inetutilsでパッシブモードを指定して接続する例です。これはLinuxのシェルで実行します。-pはパッシブモード指定で、ポート番号指定ではありません。

ftp -p ftp.example.com

制御接続のポートが21以外と案内されている場合は、ホスト名の後ろに指定します。例えば2121の場合は次の形です。

ftp -p ftp.example.com 2121

ユーザー名とパスワードを求められたら入力します。パスワードが画面に表示されなくても、FTPの通信が暗号化されたわけではありません。パスワードをコマンドやURLに書き込まず、学習環境でも他のサービスのパスワードを使い回さないでください。

ログイン後はftp>という対話プロンプトが表示されます。以下の例では入力場所を示すためプロンプトを付けていますが、ftp>自体は入力しません。オプションの仕様はGNU Inetutilsの公式マニュアルで確認できます。

ftp> pwd
ftp> ls
ftp> cd downloads
ftp> pwd

pwdはサーバ側の現在地、lsはサーバ側の一覧、cd downloadsはサーバ側のディレクトリ移動です。downloadsが存在してアクセスできる場合だけ移動できます。エラーが出たらそのまま続けず、パスや権限を確認します。

手元のディレクトリを変えるにはlcd、手元の現在地を表示するにはlpwdを使います。ftp>でのpwdと、Linuxのシェルで実行するpwdは対象が異なります。利用中のクライアントで使えるコマンドはhelpでも確認できます。

ファイルのアップロードとダウンロード

転送前にバイナリモードを指定する

ファイルのバイト列をそのまま転送したい場合は、binaryを指定します。画像、PDF、ZIPなどはもちろん、テキストも改行を変換せず保持したい場合に適しています。ASCIIモードでは改行などが変換されることがあるため、既定の転送形式に頼らないようにします。

ftp> binary

転送形式の違いはGNU Inetutilsの転送パラメータの説明を参照してください。SFTPには、このFTPのASCII/バイナリ切り替えはありません。

ファイルをダウンロードする

get リモートファイル名 ローカルファイル名で、サーバから手元へ保存します。次の例は、サーバ側の現在のディレクトリにあるexample.txtを、手元の作業ディレクトリへ別名で保存する操作です。/home/alice/ftp-workは、事前に用意した実際の保存先に置き換えます。

ftp> lcd /home/alice/ftp-work
ftp> lpwd
ftp> get example.txt downloaded-example.txt

第2引数を省略したget example.txtも利用できますが、通常は元と同じ名前で保存されます。保存先に同名ファイルがあると上書きされる場合があり、必ず確認が出るとは限りません。別名を指定した場合も、その名前が未使用であることを先に確認してください。

ファイルをアップロードする

put ローカルファイル名 リモートファイル名で、手元からサーバへ送信します。次の例は、先ほどの手元の作業ディレクトリにあるupload.txtを、サーバの/incomingへ別名で保存する操作です。書き込みが許可された実際の転送先に置き換えます。

ftp> cd /incoming
ftp> pwd
ftp> ls
ftp> put upload.txt uploaded-example.txt
ftp> ls uploaded-example.txt

FTPで見える/はアカウント用の公開領域のルートであり、サーバOS全体のルートと一致するとは限りません。第2引数を省略したput upload.txtも可能ですが、転送先の同名ファイルを上書きするおそれがあります。既存ファイルを置き換える前に、対象と復元方法を確認します。

getとputでは、最初の引数が転送元、2番目が転送先です。操作対象の詳細はGNU InetutilsのFTPコマンド一覧で確認できます。

転送結果を確認して終了する

プロンプトが戻っただけで成功と判断せず、直前の転送に対する完了応答とエラーの有無を確認します。226などの完了応答が出たか、転送先に想定した名前・サイズのファイルがあるかを確認してください。途中で切断された場合は、不完全なファイルが残ることがあります。

大切なファイルは、双方で計算したSHA-256などのハッシュ値も照合します。ハッシュ値の受け渡しにも信頼できる経路を使ってください。サイズの一致だけでは、内容の一致や配布元の正しさまでは証明できません。

ftp> quit

byeでも終了できます。終了後はLinuxのシェルに戻るので、例えば次のコマンドでダウンロード先のサイズを確認できます。

ls -l /home/alice/ftp-work/downloaded-example.txt

接続・転送に失敗したときの確認点

  • 接続そのものができない:ホスト名、接続方式、指定ポート、VPNなどの利用条件を確認します。接続拒否やタイムアウトは、パスワードを入力する前の段階の問題である場合があります。
  • ログインを拒否される:ユーザー名、認証方法、アカウントの利用可否を確認します。パスワードを何度も試すとロックされることがあるため、管理者に確認します。
  • ログインできるのにls・get・putで止まる:制御接続とは別のデータ接続が通っていない可能性があります。パッシブモードの利用状況と、サーバが通知する接続先・データ用ポートの到達性を管理者に確認します。TCP 21へ接続できるだけでは十分ではありません。
  • ファイルが見つからない・書き込めない:手元とサーバの現在地、名前の大文字・小文字、権限、空き容量や容量制限を確認します。

接続方式を確かめずにポートだけを変えたり、ファイアウォール全体を無効にしたりするのは避けてください。必要な通信条件を管理者と確認するのが基本です。相談するときは失敗した操作とエラー文を伝え、パスワードなどの秘密情報はログから除きます。

セキュリティ対策と注意点

平文FTPのリスクは、強いパスワードやIP制限だけでは解消できません。RFC 2577でも、認証情報を含む制御情報とデータが暗号化されずに送られることが指摘されています。公開ファイルを匿名で取得する場合でも、改ざん対策や配布元の確認は別に必要です。

  • 業務用・個人用の機密ファイルには、管理者が提供する暗号化された転送方式を使います。
  • ファイルを読み書きする範囲は必要最小限にし、共有アカウントや不要な権限の利用を避けます。
  • パスワードや秘密鍵を公開用のコマンド例、シェル履歴、作業ログへ残さないようにします。
  • 暗号化されていても、接続先の確認や上書き防止、転送結果の確認は省略できません。

SFTP・FTPS・scpを使う場合

SFTP:SSHを使う別のプロトコル

SFTP(SSH File Transfer Protocol)は、SSHの暗号化された接続上で動くファイル転送プロトコルです。FTPに暗号化オプションを付けたものではなく、通常のftpコマンドの設定変更だけで切り替えることはできません。接続先がSFTPを提供しており、手元にSFTPクライアントがあることを確認します。

指定されたSSHポートが22以外なら、例えばsftp -P 2222 [email protected]のように大文字の-Pを使います。初回接続時にホスト鍵の指紋(フィンガープリント)が表示されたら、管理者や公式管理画面などの信頼できる別の経路で入手した値と一致することを確認してから承認します。未知の鍵を無条件に承認したり、鍵変更の警告を理由確認なしで回避したりしないでください。確認方法はOpenSSHのホスト鍵確認の説明を参照できます。

接続後はsftp>で操作します。次はコマンドの例です。パスとファイル名を実際のものに置き換え、手元・サーバの転送先が未使用であることを先に確認します。

sftp> lcd /home/alice/ftp-work
sftp> lpwd
sftp> cd /incoming
sftp> pwd
sftp> put upload.txt uploaded-example.txt
sftp> get uploaded-example.txt downloaded-copy.txt
sftp> bye

ローカルにはlcd・lpwd、リモートにはcd・pwdを使います。詳しい構文はOpenSSHのsftpマニュアルを確認してください。SFTPでも同名ファイルの上書きに注意し、転送後の名前・サイズ・内容を確認します。

FTPS:FTPをTLSで保護する

FTPSはFTPにTLSによる保護を加える方式です。FTPと同様、制御接続とデータ接続が分かれているため、ログインだけでなくファイル転送側も暗号化する設定が必要です。制御・データ接続の保護はRFC 4217で説明されています。

  • 明示的FTPS:通常はポート21に接続し、AUTH TLSでTLSへ切り替えます。
  • 暗黙的FTPS:接続開始時からTLSを使用し、通常はポート990を使います。

方式とポートはサーバの指定に合わせます。curlでは、明示的FTPSにftp://と–ssl-reqd、暗黙的FTPSにftps://を使用します。両者はURLの書き方を自由に置き換えられるものではありません。

FTP・FTPSに対応したcurlで、明示的FTPSからファイルを取得する例です。これはLinuxのシェルで実行します。

curl --ssl-reqd --user alice \
  --output downloaded-example.txt \
  ftp://ftp.example.com/downloads/example.txt

--user aliceのようにユーザー名だけを指定すると、パスワードは対話的に求められます。--ssl-reqdはTLSへの切り替えを必須にし、切り替えられない場合は失敗させます。平文へ戻る可能性がある--sslだけの指定や、データを暗号化しない--ftp-ssl-controlで代用しないでください。URL内のパスは、この例ではログイン先のディレクトリを基準にします。出力ファイルが既にあると上書きされるため、事前に未使用の名前を選びます。詳しくはcurlの公式マニュアルを参照してください。

FTPSではTLS証明書の信頼性と接続先ホスト名の検証も重要です。検証エラーを-kや--insecureで無効にして進めず、ホスト名、証明書の期限、信頼する認証局を管理者に確認してください。社内CAの場合は、正規の経路で配布されたCA証明書を使用します。詳細はcurlの証明書検証の説明にあります。

scp:コマンド一つでコピーする

scpはSSH経由でファイルをコピーするコマンドです。OpenSSH 9.0以降は、既定の転送プロトコルとしてSFTPを使います。古いSCPプロトコルとコマンド名を混同しないようにします。この変更はOpenSSH 9.0のリリースノートに記載されています。

scp ./upload.txt [email protected]:/incoming/uploaded-example.txt

これは手元のファイルをサーバへコピーする、Linuxのシェル用の例です。SFTPと同じく接続先のホスト鍵確認、権限、上書きの有無を確認します。転送後はエラー表示を確認し、終了ステータスが成功を表す0か、転送先の内容が正しいかを確認してください。構文と終了ステータスはscpのマニュアルで確認できます。

scpなら必ず高速、あるいは暗号化されていれば常に安全、というわけではありません。速度は回線やサーバ、ファイル構成などに左右されます。対話的にファイルを確認するならSFTP、コピー元とコピー先が決まっているならscpなど、作業に合った方法を選びます。

まとめ

LinuxのFTP操作は、接続後に手元とサーバの現在地を確認し、binary、get、putを使い分けるのが基本です。転送先の同名ファイルと完了応答を確認し、ログインだけ成功して一覧や転送が止まる場合はデータ接続を切り分けます。

平文FTPでは認証情報も保護されません。実運用では接続先が対応するSFTPまたはFTPSを優先し、SSHホスト鍵やTLS証明書の検証を省略しないでください。暗号化の有無だけでなく、接続先・保存先・転送結果まで確認することが、誤送信や上書き事故を防ぐ基本です。

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次