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;各所からコピペして作成。
[ ツッコむ ]
以上です。