用 Telnet 對 兩台 FTP Server 進行 PASV Mode 傳檔案



贊助商連結


bx2aa
2004-03-10, 04:40 PM
去年也寫了一個沒有續傳,有給 purk,
但是我自己去年寫的不見了, 這個是昨天寫的我還加了續傳.
一個檔傳輸如果超過十分鐘下面的 Timeout 改大一點就可以了.

#! c:\perl\bin\perl.exe -w
print "Content-type: text/html \n\n";

use Net::Telnet ();
$username="bx2aa";
$passwd="test";
$username2="bx2aa";
$passwd2="test";
$port=21;
$port2=21;
$secs=10;
$host="192.168.1.2";
$host2="192.168.1.2";
$|=1;
$srcpath="user";
$destpath="./";
$filename="USER.rar";

#CLIENT FTP 1
$t = new Net::Telnet (Host => $host,Port => $port,Timeout => $secs);
$lines = $t->getline;
print $lines."\n";
$lines = $t->print("USER $username");
print $lines."\n";
$lines = $t->getline;
print $lines."\n";
$lines = $t->print("PASS $passwd");
print $lines."\n";
$lines = $t->getline;
print $lines."\n";
$lines = $t->print("syst");
print $lines."\n";
$lines = $t->getline;
print $lines."\n";
$lines = $t->print("type a");
print $lines."\n";
$lines = $t->getline;
print $lines."\n";
$lines = $t->print("pwd");
print $lines."\n";
$lines = $t->getline;
print $lines."\n";
$lines = $t->print("type i");
print $lines."\n";
$lines = $t->getline;
print $lines."\n";
$lines = $t->print("pasv");
print $lines."\n";
$lines = $t->getline;
print $pasv = $lines;
$lines = $t->print("cwd $srcpath");
print $lines."\n";
$lines = $t->getline;
print $lines."\n";

#CLIENT FTP 2
$t2 = new Net::Telnet (Host => $host2,Port => $port2,Timeout => $secs);
print $lines."\n";
$lines = $t2->getline;
$lines = $t2->print("USER $username2");
print $lines."\n";
$lines = $t2->getline;
print $lines."\n";
$lines = $t2->print("PASS $passwd2");
print $lines."\n";
$lines = $t2->getline;
print $lines."\n";
$lines = $t2->print("syst");
print $lines."\n";
$lines = $t2->getline;
print $lines."\n";
$lines = $t2->print("type a");
print $lines."\n";
$lines = $t2->getline;
print $lines."\n";
$lines = $t2->print("pwd");
print $lines."\n";
$lines = $t2->getline;
print $lines."\n";
$lines = $t2->print("pasv");
print $lines."\n";
$lines = $t2->getline;
print $lines."\n";
$lines = $t2->print("cwd $destpath");
$lines = $t2->getline;
print $lines."\n";
$lines = $t2->print("SIZE $filename");
print $lines."\n";
$lines = $t2->getline;
$lines =~ s/.* (.*)$/\1/g;
print $rest=$lines."\n";
$lines = $t2->print("type i");
print $lines."\n";
$pasv = $1 if $pasv=~ m/.*\((.*?)\).*/s;
print $size=$lines."\n";
$lines = $t2->print("port $pasv");
print $lines."\n";
$lines = $t2->getline;
print $lines."\n";
if ($rest ne "0") {
$lines = $t2->print("rest $rest");
print $lines."\n";
$lines = $t2->getline;
print $lines."\n";
}
$lines = $t2->print("stor $filename");
print $lines."\n";

#CLIENT FTP 1
if ($rest ne "0") {
$lines = $t->print("rest $rest");
print $lines."\n";
$lines = $t->getline;
print $lines."\n";
}
$lines = $t->print("retr $filename");
print $lines."\n";

#CLIENT FTP 2
$lines = $t2->getline(Timeout => "600");
print $lines."\n";

#CLIENT FTP 1
$lines = $t->getline(Timeout => "600");
print $lines."\n";

#CLIENT FTP 2
$lines = $t2->waitfor(Match => '/226/', Timeout => "600");
print $lines."\n";

#CLIENT FTP 1
$lines = $t->waitfor(Match => '/226/', Timeout => "600");
print $lines."\n";
$t->close;

#CLIENT FTP 2
$t2->close;

也可以放到 Apache Web Server 上 Run
使用方法
放到 Apache 的 CGI 目錄內
http://192.168.1.2/cgi-bin/Telnet.cgi
或是
C:\>perl Telnet.cgi