Windowsのコマンド操作でFTPサーバーとファイル転送する方法

Windowsのコマンド操作でFTPサーバーとファイル転送する方法

ここでは、Windowsに搭載されているコマンドを使って、FTPサーバーとの間でファイル転送する(ファイルをダウンロードしたりアップロードする)方法を解説します。

FTPコマンドを使った方法

FTPコマンドを使ってFTPサーバーとファイルの送受信を行う場合、対話形式でコマンドを1つずつ実行する方法と、あらかじめ実行するコマンドを記述したテキストファイルを用意しておき、自動実行させる方法があります。

対話形式での実行方法

対話形式での実行するときは、コマンドプロンプトやPowerShellを起動して、まず「ftp」と入力してエンターキーを押します。

すると、プロンプトが「ftp>」という表示に切り替わるので、順にコマンド実行します。

ftp>

FTPサーバーへの接続

リモートのFTPサーバーに接続するときは、以下のようにコマンドを実行します。(FTPサーバーのデフォルトの待ち受けポートがTCP21番ポート以外の場合は、ホスト名の後ろに半角スペースを空けてポート番号を指定することもできます。)

ftp> open <FTPサーバーのホスト名やIPアドレス> [ポート番号]

たとえば、IPアドレスが「192.168.10.233」のFTPサーバーに接続するときは、以下のようにコマンドを実行します。

ftp> open 192.168.0.100

正常に接続できれば、以下のようにユーザー名を入力するプロンプトが表示されます。

ftp> open 192.168.0.100
192.168.10.233 に接続しました。
220 Browser Ftp Server.
530 Please login with USER and PASS.
ユーザー (192.168.0.100:(none)):

ユーザー認証

ユーザー名を入力するプロンプトが表示されたら、FTPサーバーへ接続するためのユーザー名を入力して、エンターキーを押します。(匿名接続するときは「anonymous」と入力してエンターキーを押します。)

ユーザー (192.168.0.100:(none)):

パスワードが入力するよう求められたときは、パスワードを入力してエンターキーを押します。(匿名接続するときはパスワード入力は求められません)

正常にFTPサーバーにログインできれば「230 User Logged in.」と表示されます。

ユーザー (192.168.0.100:(none)): user01
331 Password required for this user.
パスワード:
230 User Logged In.
ftp>

ローカルのカレントフォルダーの移動

ローカル側(FTPクライアント側)のカレントフォルダーを移動するときは、以下のようにコマンドを実行します。

ftp> lcd <移動先のフォルダーパス>

リモートのカレントフォルダーの移動

リモート側(FTPサーバー側)のカレントフォルダーを移動するときは、以下のようにコマンドを実行します。

ftp> cd <移動先のフォルダーパス>

リモートフォルダーのファイル一覧を表示

リモート側(FTPサーバー側)のフォルダー内のファイル一覧を表示するときは、以下のようにコマンドを実行します。

FTP> dir <フォルダーパス>

フォルダーパスを指定せずに実行した場合は、カレントフォルダーのファイル一覧が表示されます。

ftp> dir
200 PORT command successful.
150 Opening data channel.
-rw-rw-rw- 1 user group 578 Aug 12 22:23 sample1.txt
-rw-rw-rw- 1 user group 578 Aug 12 22:23 sample2.txt
-rw-rw-rw- 1 user group 578 Aug 12 22:23 sample3.txt
-rw-rw-rw- 1 user group 578 Aug 12 22:23 sample4.txt
226 Transfer complete.
ftp: 263 バイトが受信されました 0.12秒 2.17KB/秒。

転送モードの指定

データの転送モードにはASCIIモードとバイナリモードがあり、ASCIIモードでは環境に合わせてテキストデータの改行コードなどを変換してくれますが、通常はバイナリモードでの転送がおすすめです。

バイナリモードで転送するときは、以下のようにコマンドを実行してからファイルのダウンロードやアップロードを実行します。

ftp> binary
200 Binary transfer mode active.
ftp>

ファイルのダウンロード

FTPサーバーからファイルをダウンロードするときは、以下のようにコマンドを実行します。

ftp> get <ダウンロードするファイル名>

コマンド実行後「226 Transfer complete.」と表示されれば、正常にダウンロードできています。

ftp> get sample.txt
200 PORT command successful.
150 Opening data channel.
226 Transfer complete.
ftp: 578 バイトが受信されました 0.17秒 3.48KB/秒。

ダウンロードしたファイルは、ローカル(FTPクライアント)のカレントフォルダーに保存されます。

複数のファイルを一括ダウンロードどできるmgetというコマンドがありますが、WindowsのFTPコマンドでは正常に動作しないようなのでご注意ください。

ファイルのアップロード

FTPサーバーへファイルをアップロードするときは、以下のようにコマンドを実行します。

ftp> put <アップロードするファイル名>

コマンド実行後「226 Transfer complete.」と表示されれば、正常にアップロードできています。

ftp> put sample1.txt
200 PORT command successful.
150 Opening data channel.
226 Transfer complete.
ftp: 578 バイトが送信されました 0.06秒 10.51KB/秒。

アップロードしたファイルは、リモート(FTPサーバー)のカレントフォルダーに保存されます。

複数のファイルを一括でアップロードするときは、mputコマンドを使って以下のようにコマンドを実行できます。

複数のファイルをスペース区切りで記述する方法:

ftp> mput sample1.txt sample1.txt sample1.txt

ワイルドカードを指定する方法:

ftp> mput *.txt

なお、複数ファイルを一括でアップロードすると、1ファイルずつアップロードしてよいかのプロンプトが表示されますが、あらかじめ「prompt」コマンドを実行しておけば、プロンプトを表示させずに一括アップロードできます。

ftp> prompt

FTPサーバーへの接続を終了

FTPサーバーへの接続を終了するときは、以下のようにコマンドを実行します。

ftp> quit
221 Goodbye.

コマンドのヘルプ

FTPサーバーへの接続中に使用できるサブコマンドは「help」と入力してエンターキーを押すことで一覧表示できます。

ftp> help
コマンドは省略することができます。コマンド:

!               delete          literal         prompt          send
?               debug           ls              put             status
append          dir             mdelete         pwd             trace
ascii           disconnect      mdir            quit            type
bell            get             mget            quote           user
binary          glob            mkdir           recv            verbose
bye             hash            mls             remotehelp
cd              help            mput            rename
close           lcd             open            rmdir

サブコマンドごとの用途を表示するときは、以下のようにコマンドを実行します。

ftp> ? get
get             ファイルを受信します

より詳しいつい方を確認したいときは、いかのMicrosoft公式ページが参考になるでしょう。

ftp | Microsoft Learn

以上が、対話形式での一般的な操作方法です。

コマンドファイルでの自動実行方法

コマンドファイルの作成と実行

バッチファイルなどのスクリプトファイル内でFTPサーバーへ接続する場合は、あらかじめ行う処理をテキストファイルに記述しておくことで、FTPサーバーへの接続からデータの転送、接続の終了までを自動化することができます。

たとえば、FTPサーバーへ接続してファイルをダウンロードして接続を終了するという処理を行う場合は、以下のように記述します。(基本的には対話形式で入力するコマンドを順に記述すればOKです。)

open <FTPサーバーのホスト名やIPアドレス>
<ユーザー名>
<パスワード>
binary
lcd <ローカルのカレントフォルダー>
get <ダウンロードするファイル名>
quit

上の内容をメモ帳などで記述して、テキストファイルとして保存したら、ftpコマンド実行時に以下のように指定することで、テキストファイルに記述された処理を自動実行できます。

> ftp -s:<コマンドファイルのパス>

データ転送結果の判定

バッチファイルなどのスクリプトファイル内でFTPコマンドを使ってFTPサーバーに接続してデータ転送した場合、転送が正常に終了したか失敗したかをコマンドのリターンコードで判定することができません。

そこで、ftpコマンドの実行結果をログファイルにリダイレクトして、ログファイルに記述されている文字列を検索して判定する方法がおすすめです。

GETやPUTによるファイルのダウンロード/アップロードでは、正常に転送が完了すると「226 Transfer complete.」というメッセージが記録されるので、ログファイルからその文字列を検索して、転送したファイルの数とログファイルに記録されているメッセージの数を比較して転送結果を判定できます。

for /f %%A in ('findstr /b /c:"226 Transfer complete." <ログファイルのパス> ^| find /c "226"') do set cnt=%%A
if not %cnt%==3 echo FPT-GET処理に失敗しました

パッシブモードに対応していない

WindowsのFTPコマンドを利用するときに注意点としては、最近のFTP接続で一般的なパッシブモードでの接続に対応しておらず、旧来のアクティブモードのみが利用可能という点です。

パッシブモードとは

FTPでの通信には、制御用の通信とデータ転送用の通信があり、一昔前のFTPで一般的だったアクティブモードでは、制御用の通信はクラアントを起点にサーバーのTCP21番ポートに対して行われ、データ転送用の通信はサーバーのTCPポート20番ポートを起点にクライアントに対して通信が行われます。

そのため、FTPをアクティブモードで使用するには、FTPクライアントマシンのファイアウォールでFTPのデータ転送通信の受信を許可する必要があります。

対して、パッシブモードでは、制御用の通信とデータ転送用の通信ともにクラアントを起点に行われるため、クラアイン側のファイアウォールでポートの開放が不要というセキュリティ的なメリットがあり、最近のFTPではパッシブモードで使用することがほとんどです。

そのため、コマンド操作かつパッシブモードでFTP接続したいときは、以下に紹介しているcURLコマンドを使った方法や、PowerShellを使った方法を利用する必要があります。

cURLコマンドを使った方法

現在のWindows 10や11には、Linuxでは一般的なcURLコマンドが標準搭載されており、このコマンドを使ってFTPサーバーとデータ転送することができます。

cURLコマンドは、パッシブモードでFTPサーバーに接続でますが、日本語ファイルのダウンロードやアップロードは文字化けが発生するのでご注意ください。

ファイルのダウンロード

cURLコマンドでFTPサーバーからファイルをダウンロードするときは、以下のようにコマンドを実行します。

カレントフォルダーにダウンロードする場合:

> curl.exe -L -u user01:P@ssw0rd -O ftp://192.168.0.100/tmp/sample.txt --disable-epsv

カレントフォルダーに複数のファイルを一括ダウンロードする場合:

> curl.exe -L -u user01:P@ssw0rd -O ftp://192.168.10.233/tmp/sample.txt -O ftp://192.168.10.233/tmp/sample3.txt --disable-epsv

保存先とファイル名を指定してダウンロードする場合:

> curl.exe -L -u user01:P@ssw0rd ftp://192.168.0.100/tmp/sample3.txt -o e:\test\sample3.txt --disable-epsv

コマンドの最後尾で「--disable-epsv」オプションで拡張パッシブモードを無効化しているのは、環境によってはこのオプションを付けないとFTPサーバーと正常に接続できない場合があるためです。

ファイルのアップロード

cURLコマンドでFTPサーバーへファイルをアップロードするときは、以下のようにコマンドを実行します。

単一ファイルをアップロードする場合:

> curl.exe -T E:/test/sample.txt -u user01:P@ssw0rd ftp://192.168.0.100/tmp/ --disable-epsv

複数ファイルを一括アップロードする場合:

> curl.exe -T {E:/test/sample.txt,E:/test/sample3.txt} --user user01:P@ssw0rd ftp://192.168.10.233/tmp/ --disable-epsv

PowerShellコマンドレットを使った方法

PowerShellでFTPサーバーとファイル転送する場合、必要な処理を記述するのが少々面倒ですが、パッシブモードでの転送ができ、日本語ファイルの転送も問題なくできます。

ファイルのダウンロード

PowerShellでFTPサーバーからファイルをダウンロードするときはいくつかの方法がありますが、Invoke-WebRequestコマンドレットを使った方法がシンプルでおすすめです。

Invoke-WebRequestコマンドレットを使ってFTPサーバーからファイルをダウンロードするときは、以下のように記述します。

# FTPサーバーへの接続ユーザーとパスワード
$user = 'user01'
$pass = 'P@ssw0rd'
$hostName = '192.168.0.100'
$ftpUrl = 'ftp://' + $hostName

# ダウンロードするファイルのパスとダウンロード先のパスを設定
$serverFilePath = '/tmp/sample.txt'
$localFilePath = 'E:\test\sample1.txt'

# FTPサーバーへのログイン情報の資格情報オブジェクトの生成
$secstr = ConvertTo-SecureString $pass -AsPlainText -Force
$cred = New-Object System.Management.Automation.PSCredential($user, $secstr)

# FTPサーバーからファイルをダウンロード
Invoke-WebRequest -Uri $ftpUrl$serverFilePath -OutFile $localFilePath -Credential $cred

ファイルのアップロード

PowerShellでFTPサーバーにファイルアップロードするときは、.NET FrameworkのWebClientクラスを使った方法がおすすめです。

WebClientクラスを使ってFTPサーバーにアップロードするときは、以下のように記述します。

# FTP接続に必要な情報を設定
$user = 'user01'
$pass = 'P@ssw0rd'
$hostName = '192.168.0.100'
$ftpUrl = 'ftp://' + $hostName + '/'

# アップロードするファイルのパスとアップロード先のパスを設定
$localFilePath = 'E:\test\sample.txt'
$serverFilePath = '/tmp/sample1.txt'

# FTP接続のオブジェクトを生成
$webClient = New-Object System.Net.WebClient
$webClient.Credentials = New-Object System.Net.NetworkCredential($user,$pass)
$webClient.BaseAddress = $ftpUrl

# ファイルのアップロード
$webClient.UploadFile($serverFilePath , $localFilePath)
$webClient.Dispose()

ファイルを一括でアップロードしたいときは上のスクリプトの「# ファイルのアップロード」部分のコマンドを書き換えます。

たとえば、ローカルの指定したフォルダー内のテキストファイル(拡張子が「.txt」のファイル)を一括アップロードしたいときは、以下のように記述します。

# FTP接続に必要な情報を設定
$user = 'user01'
$pass = 'P@ssw0rd'
$hostName = '192.168.0.100'
$ftpUrl = 'ftp://' + $hostName + '/'

# アップロードするファイルのパスとアップロード先のパスを設定
$localDirectoryPath = 'E:\test'
$serverDirectoryPath = '/tmp'

# FTP接続のオブジェクトを生成
$webClient = New-Object System.Net.WebClient
$webClient.Credentials = New-Object System.Net.NetworkCredential($user, $pass)
$webClient.BaseAddress = $ftpUrl

# ファイルの一括アップロード
foreach($item in (Get-ChildItem $localDirectoryPath\*.txt)){
  $serverPath = $serverDirectoryPath + '/' + $item.Name
  $webClient.UploadFile($serverPath , $item.FullName)
}
$webClient.Dispose()

あとがき

一昔前だと、Windowsでコマンドを使ってFTPサーバーに接続するときは、ftpコマンドを使うのが一般的でしたが、現在ではパッシブモードに対応しており、リターンコードによるエラー判定もしやすい、cURLコマンドやPowerShellコマンドレットを使った方法がおすすめです。