#!/usr/local/bin/perl5 # ↑このパスはサーバーによって違うので調べて設定します。#★必要時変更 # # ipftp.pl by A.Sato 1999.4.10- ver1.1 update 1999.4.28 # これを実行したマシンのIPアドレスを取得して、指定したファイル # の指定された文字列をIPアドレスの文字列に変換しFTPする # # 実行するときは、#perl5 ipftp.pl で実行します。 # # ftp用モジュール(下に書いてあるようにgetしてインストールする) #ftp://www.perl.com/pub/perl/CPAN/modules/by-module/Net/ #から libnet-1.0606.tar.gzをダウンロードする # #tar -zxvf libnet-1.0606.tar.gz (tar -xvf libnet-1.0606.tar) # 解凍したディレクトリーに入って(cd libnet-1.0606) # perl5 Makefile.PL (質問に答える ほぼデフォルトでOK) # make # make test # make install # use Net::FTP; ############################################################################ #初期設定 # 内容が書き込まれる記録ファイルを設定 $tmp1_file = 'ipftp.ifc'; #ifconfigで今回取り出したファイル ←自動作成 $tmp2_file = 'ipftp.ipa'; #前回のIPアドレスのファイル ←自動作成 #その他 #★の行を必要時変更すること ############################################################################ #これを実行したマシンのアドレスを取得する #シェルコマンドifconfigでマシンのアドレスの行を取り出す(FreeBSD用) system("ifconfig -a | grep 210. >$tmp1_file"); #★必要時変更 #現在のIPアドレスを変数に入れる($tmp1_fileから) open(IN,$tmp1_file) || die "Cannot open $tmp1_file for reading\n"; while () { # INファイルから1行$_に読み込む $st = index($_,"210.") ; #取り出し開始文字位置(012345...) #★必要時変更 $en = index($_,"netmask") - 1; #取り出し終了文字位置 #★必要時変更 $ipaddr_new = substr($_, $st,($en - $st));#IPアドレスを取得 } close(IN); print "done... ifconfig\n"; ############################################################################ #過去のIPアドレスを読み込む($tmp2_fileから) if (-e $tmp2_file){ #$tmp2_fileが存在しないときは、新規作成する ;#存在する }else{ open(OUT,">$tmp2_file") || die "Cannot create $tmp2_file\n"; print OUT " "; # OUTファイルにダミーを書き込む close(OUT); } open(IN,$tmp2_file) || die "Cannot open $tmp2_file for reading\n"; while () { # INファイルから1行$_に読み込む $st = index($_,"210.") ; #取り出し開始文字位置(012345...) #★必要時変更 $ipaddr_old = substr($_, $st,20);#IPアドレスを取得 } close(IN); print "done... IP address get\n"; ############################################################################ #過去と現在の比較のため「.」を「_」に変換し比較する $_=$ipaddr_old; tr/./_/; $ipaddr_old2=$_; $_=$ipaddr_new; tr/./_/; $ipaddr_new2=$_; print "old address is $ipaddr_old ($ipaddr_old2)\n"; print "new address is $ipaddr_new ($ipaddr_new2)\n"; $st = index($ipaddr_new2,$ipaddr_old2) ; if ($st > -1){ #IPアドレスが変更されなかったとき print "IP Address is not changed.\n"; exit; }else{ #IPアドレスが変更されたとき print "IP Address is changed.\n"; open(OUT,">$tmp2_file") || die "Cannot create $tmp2_file\n"; print OUT $ipaddr_new; # OUTファイルにIPアドレスを書き込む close(OUT); #ローカルのファイルの書き換え(/etc/natrulesなど) # &local_conv; #ローカルファイルを書き換えるときの参考にしてください #外部(ftp先)のファイルの書き換え &ftpconv; #変換作業ルーチンへ } ############################################################################ #ローカルのファイルの書き換え sub local_conv{ # $infile = 'ipftp.old';#変換前の入力ファイル #★必要時変更 # $outfile = 'ipftp.new'; #変換後の出力ファイル #★必要時変更 # # system("cd /root"); #★必要時変更 # system("cp /etc/natrules ipftp.old"); #★必要時変更 # &conv; # system("cp ipftp.new /etc/natrules"); #★必要時変更 # # print "local file is changed.\n"; } ############################################################################ #変換したいファイルをftpして変換後ftpしてもどす sub ftpconv{ $outfile = 'temp.html'; #変換後の出力ファイル $Host = 'www.catv123.ne.jp'; # ftp先 ホストを指定 ★必要時変更 $User = 'my_id'; # ftp先 のアカウントを指定 ★必要時変更 $Password = 'my_pass'; # ftp先 のパスワードを指定 ★必要時変更 $TopDir = 'public_html/temp'; # ftp先 のディレクトリー ★必要時変更 &ftp_con; #ftpの接続 ###########ファイルが複数の時は処理をこのように追加する########### $infile = 'index2.html';#変換前の入力ファイル ★必要時変更 &ftp_getput; #ftpからgetとして変換してputする(1つ目のファイル) # ###########ファイルが複数の時は処理をこのように追加する########### # $TopDir = '../'; # public_html/index.htmlの場合 ★必要時変更 # $infile = 'index.html';#変換前の入力ファイル ★必要時変更 # &ftp_getput; # ################################################################## &ftp_discon; #ftpの接続をやめる } ############################################################################ #ftpサブルーチン sub ftp_con{ #ftpの接続をする print "Connecting... to $Host Please wait!\n"; $ftp = Net::FTP->new($Host) or die "can not Net::FTP \"$Host\": $!"; print "login...\n"; $ftp->login($User, $Password) or die "can not Net::FTP login \"$User\": $!"; print "binary mode\n"; $ftp->binary or die "can not Net::FTP binary: $!"; } sub ftp_getput{ print "cd $TopDir\n"; $ftp->cwd($TopDir) or die "can not Net::FTP cwd \"$TopDir\": $!"; #ftpで変換元のファイルをgetしてくる print "getting $TopDir/$infile\n"; $ftp->get("$infile"); &conv;#変換ルーチンへ unlink($infile);#変換前のファイルを削除 rename($outfile,$infile);#変換後のファイルを変換前のファイル名にする #ftpで変換後のファイルをputする print "putting $TopDir/$infile\n"; $ftp->put($infile) or die "can not Net::FTP put \"$t\": $!"; unlink($infile);#変換後のファイルを削除 } sub ftp_discon{ #ftpの接続を切る $ftp->quit; } ############################################################################ #$infileファイルを読み込んで置換し$outfileをつくる sub conv { open(IN,$infile) || die "Cannot open $infile for reading\n"; open(OUT,">$outfile") || die "Cannot create $outfile\n"; while () { # INファイルから1行$_に読み込む $st = index($_,"210.") ; #取り出し開始文字位置(012345...) #★必要時変更 if ($st > -1){ $en = index($_,"/~my_id"); #取り出し終了文字位置 #★必要時変更 if ($en < 0) {$en = index($_,"/~");} #★必要時変更 # if ($en < 0) {$en = index($_,"/32 portmap");} #★必要時変更 $temp = substr($_,0,$st); print OUT $temp; print OUT $ipaddr_new; # OUTファイルにIPアドレスを書き込む $temp = substr($_,$en,254); print OUT $temp; }else{#検索文字がない行はそのまま書き込む print OUT $_; } } close(IN); close(OUT); }