2005/12/04(日) [n年前の日記]
#5 [windows] _batファイルによるFTP自動実行(Windowsタスク)- ぽんこつWEBサーバー構築
wifky は編集前の状態をバックアップしてくれないので、使うにあたっては別途バックアップの仕組みが必要らしい。ということで、Windows 関係でftpを使ったバックアップ方法について検索。
◎ _バッチ・スクリプトとftpコマンド - Windows Server Insider :
_@IT:Windows TIPS -- Tips:バッチ・ファイル中で日付をファイル名に使用する
_@IT:Windows TIPS -- Tips:スクリプトで使うftpコマンド
_@IT:Windows TIPS -- Tips:WSHで簡単なバックアップツールを作成する
_BASP21 FTPオブジェクト
_Net::FTPの練習 - PerlでFTP転送
_旧・いずみのにっき(1999-04-08)
_@IT:Windows TIPS -- Tips:スクリプトで使うftpコマンド
_@IT:Windows TIPS -- Tips:WSHで簡単なバックアップツールを作成する
_BASP21 FTPオブジェクト
_Net::FTPの練習 - PerlでFTP転送
_旧・いずみのにっき(1999-04-08)
実は、ルータの制御を、DBから読んだデータを ftpすることで行うサブシステムなのですが、工期の関係から、perlで Net::FTPモジュールを使ってさくさく実装してあったんですよ。で、テスト用の実機がやっと使えるよーになったのでテストしてみたところ…なんと、ルータに送信したファイルが、必ず途中までで切れちゃうのです…ふむ…。
さっそくデバッガで追ったのですが、その結果、このルータの ftpの実装がインチキで、どーやら「データ用ソケットから順次読み出して、read()が失敗したところで受信終了」ってやっちゃうっぽいのです!そして、Net::FTPモジュールは、転送ファイルを 1kバイト毎に syswrite()しているため、その 1kバイト分で転送が勝手に「正常終了」させられてしまうのですね…(怒) 当然のことながら、本来は EOFを読むかタイムアウトするまで読み続けなければいけないところ。
◎ 結局perlでちょこちょこと :
#!/usr/bin/perl
use strict;
use Net::FTP;
use POSIX 'strftime';
my $host = "my.host.name";
my $username = "myloginname";
my $userpass = "mypassword";
my $remote_dir = "mydirectoryname";
my $local_dir = "mylocaldirectoryname";
my $now = strftime "%Y%m%d_%H%M%S", localtime;
$local_dir .= "/" . $now;
mkdir $local_dir, 0777 or die $!;
chdir $local_dir or die $!;
my $ftp = Net::FTP->new($host, Debug => 0) || die "Cannot connect to $host : $@";
$ftp->login($username, $userpass) || die "Cannot login ", $ftp->message;
$ftp->cwd($remote_dir) || die "Cannot change working directory ", $ftp->message;
$ftp->binary;
my @flist = $ftp->ls;
foreach my $f (@flist) {
next if $f =~ /^\.{1,2}$/;
$ftp->get($f) || die "get failed ", $ftp->message;
};
$ftp->quit;
print "success. ", (strftime "%Y/%m/%d %H:%M:%S", localtime), "\n";
exit;
各所からコピペして作成。
[ ツッコむ ]
以上です。