#!/usr/local/bin/perl #!D:/Perl/bin/perl.exe # FTPクライアントPerlスクリプトその1(Net::FTPモジュール使用例) # NETftp1.pl 2002.08.21 作成:鷹の巣 http://sakaguch.com/ # 参考URL # 説明が豊富なURL:http://x68000.q-e-d.net/~68user/net/http-2.html # 説明が豊富なURL:http://ash.or.jp/perl/socket_http.htm #■□■ FTPサーバーの設定 ■□■ $FTPserver = 'example.com'; # FTPサーバーのホスト名。 $FTPuser = 'userID'; # FTP接続のユーザ名。 $FTPpass = 'password'; # FTP接続のパスワード。 # FTPサーバーのディレクトリとファイル名の設定 $FTPdir = '/public_html'; # FTPサーバーに接続した後、change-directoryする場所 $FTPremotefile = 'remote.txt'; # FTPサーバーのファイル名 $FTPlocalfile = $FTPremotefile; # FTPクライアントのファイル名は、FTPサーバーのファイル名と同じにする。 #■□■ FTPサーバー関係の設定終わり ■□■ use Net::FTP; &main(); exit; #--------------------------------------- # 主回路 #--------------------------------------- # プロバイダ等のリモートサーバーにFTP接続して、データファイルをダウンロードし、 # 何かのデータ処理を施した後、 # 元のリモートサーバーにアップロードし、データを更新する。 sub main{ $FTP = Net::FTP -> new($FTPserver) or warn('初回Net::FTP失敗'); # FTP接続 if ($FTP) { $FTP -> login($FTPuser, $FTPpass) or warn('初回login失敗'); # ログイン $FTP -> cwd($FTPdir) or warn('cwd失敗'); # ディレクトリの変更 $FTP -> get($FTPremotefile, $FTPlocalfile) or &err_retry('初回get失敗');# ゲット(ファイルのダウンロード) print "ダウンロードに成功しました。\n"; # &XXXXXXXX($FTPlocalfile)); # データ処理を施す $FTP -> put($FTPlocalfile, $FTPremotefile) or &err_retry('初回put失敗');# プット(ファイルのアップロード) print "アップロードに成功しました。\n"; $FTP -> quit or warn('初回quit失敗'); # FTP切断 } close(MOUT); } #--------------------------------------- # エラー時の再試 #--------------------------------------- sub err_retry { my $err_message = $_[0]; # 引数0:エラーメッセージ worn($err_message); my $retry_count = 0; for (;;){ # 無限ループ sleep (1); # 処理を少し休止する(休止時間1秒は要調整) $retry_count++; $FTP -> abort or warn("再試$retry_count回abort失敗"); # FTPデータ転送の中断 $FTP -> quit or warn("再試$retry_count回quit失敗"); # FTP切断 $FTP = Net::FTP -> new($FTPserver) or warn("再試$retry_count回Net::FTP失敗");# FTP接続 if ($FTP) { $FTP -> login($FTPuser, $FTPpass) or warn("再試$retry_count回login失敗");# ログイン $FTP -> cwd($FTPdir) or warn("再試$retry_count回cwd失敗"); # ディレクトリの変更 if ($err_message =~ /^get/) { $FTP -> get($FTPremotefile, $FTPlocalfile); # ゲット(ファイルのダウンロード) if ($FTP) { last; } # ゲット成功でループを抜ける worn("再試$retry_count回get失敗"); next; } if ($err_message =~ /^put/) { $FTP -> put($FTPlocalfile, $FTPremotefile); # プット(ファイルのアップロード) if ($FTP) { last; } # プット成功でループを抜ける worn("再試$retry_count回put失敗"); next; } } } }