Windowsのftpコマンドをスクリプトで使うTech TIPS

ftpコマンドをスクリプト・ファイルと組み合わせて使えば、毎日の定期的なファイル転送処理などを簡単に実行できる。スクリプト・ファイルには、通常のftpコマンドをそのまま記述しておけばよい。インタラクティブなコマンドを利用する場合は、あらかじめプロンプトを無効にしておく。

» 2003年02月15日 05時00分 公開
[打越浩幸デジタルアドバンテージ]
「Tech TIPS」のインデックス

連載目次

対象OS:Windows 2000 Professional/Windows XP Professional/Windows XP Home Edition/Windows 2000 Server/Windows 2000 Advanced Server



解説

 ftpコマンドは、TCP/IPネットワーク環境における汎用的なファイル転送手段として広く使われている。Windows OSのマシンだけならば、SMBプロトコルを使ったファイル共有で転送することが可能だが、Linuxを始めとするUNIX系マシンやメインフレーム・コンピュータなどではftpしか使えないことも多い。また、インターネット・データ・センターやリモートのサイトなどに置かれているコンピュータとデータをやりとりする場合には、セキュリティの都合上、せいぜいftp程度しか許されていないことも多いからだ。

 ftpはコマンドラインで動作するので、GUI環境でなくても利用できるというメリットがある。またインタラクティブに使うだけでなく、ftpで実行するコマンドの内容をファイルに記述しておいて、自動的にファイル転送処理を行わせることもできる。スクリプトに組み込んで実行すれば、例えばログ・ファイルの収集を毎日定期的にタスク実行することも可能である。

操作方法

 Windowsに付属しているftpコマンドをスクリプトに従って実行させるには、ftpのオプションとして「-s:ファイル名」を与えればよい。指定したファイルには、ファイル転送を実行するための、一連のftpコマンドを記述しておく。通常のインタラクティブな環境で使用するftpコマンドをほとんどそのまま記述することができる。

 例えばftpサーバserver01に、ユーザー名user1、パスワードpasswd1で接続し、/logfiles/todaylog.txtをテキスト・モード(asciiモード)で取得するには、次のようなスクリプト・ファイルを用意する。

open server01
user1
passwd1
ascii
get /logfiles/todaylog.txt
quit



 最初の「open server01」は、接続するftpサーバのホスト名である。セキュリティのために、標準以外のftpポート番号を指定している場合は、「open server01 9021」のように、ホスト名に続けてポート番号も指定する。接続するホストの名前は、ftpコマンドを起動するときのパラメータとしても与えることができるが、ホスト名とコマンドの記述が分散すると面倒になるので、できることならこのようにスクリプト・ファイル中にまとめて書いておくのがよいだろう。

 次にある「user1」と「passwd1」はftpで使用するユーザー名とパスワードである。このようにスクリプト・ファイル中にパスワードを直接記述しなければならないため、セキュリティ対策のために、スクリプト・ファイル自身のアクセス権設定を正しく行っておく必要がある(サービスとして起動するならば、サービスで使用するアカウントからも読み出せるようにする必要がある)。なおftpの通信パケット中にはパスワードが平文で流れているが、これはftpプロトコルの仕様上、仕方がない。ftpサーバ側では、転送するファイル以外へのアクセス権を与えないようにするなどの設定が必要だろう。

 ファイルを転送するには、(まず転送モードを指定してから)、getもしくはputコマンドを使用する。転送が終了したら、最後に「quit」コマンドを実行して、ftpを終了させておく。

 以上のようなコマンドを記述したファイルの名前が、logget.ftpだとすると、自動実行するには次のftpコマンドを実行すればよい。

C:\>ftp -s:logget.ftp
ftp> open server01
Connected to server01.
220 SERVER01 Microsoft FTP Service (Version 5.0).
User (server01:(none)):
331 Password required for user1.

230-Default FTP Site
230 User user1 logged in.
ftp>
ftp> bin
200 Type set to I.
ftp> get /logfiles/todaylog.txt
200 PORT command successful.
150 Opening BINARY mode data connection for /logfiles/todaylog.txt(65536 bytes).
226 Transfer complete.
ftp: 65536 bytes received in 0.00Seconds 65536000.00Kbytes/sec.
ftp> quit
221



 ここでは1つのファイルを転送するgetコマンドを使用しているが、mgetという複数ファイルを扱うためのコマンドもある。デフォルトではこれらのコマンドでは、各ファイルを転送するかどうかをユーザーに問い合わせるようになっている。スクリプトで自動処理する場合はこれは不要なので、最初に「prompt」コマンドを発行してプロンプト表示を無効にしておくか、ftpの起動コマンドラインで「-i」オプションを指定して、問い合わせを行わないようにしておく。

 ftpコマンドのコマンドライン・オプションについては、「ftp -?」を実行すると表示される。ftpのサブコマンドについては、Windowsに付属のヘルプ・ファイルを参照していただきたい。

※動的なスクリプトの生成について

以上の例では、静的なスクリプト・ファイルを用意してファイルを転送していたが、Webサーバの稼働ログなどでは、日付をベースにしたファイル名などが使われていることが多い。このような場合は、例えばバッチ・ファイル中で、echoコマンドと%date%環境変数などを組み合わせてスクリプト・ファイルの内容を実行時に作成し、それを使うといった工夫が必要になるだろう。


「Tech TIPS」のインデックス

Tech TIPS

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。