Perl中FTP的使用


perl中要使用ftp操作需要使用模塊 Net::FTP,“Net::FTP”必須注意大小寫,否則執行會報錯。

 
Net::FTP模塊需要在ppm中下載libnet包。
 
在Perl中,使用模塊Net::FTP來使用FTP服務,一般的使用步驟如下: 
1. 使用Net::FTP的new方法來創建一個新的FTP對象。
2. 使用login方法登錄到FTP服務器。
3. 使用cwd方法來切換目錄。
4. 使用get方法來獲取文件。
5. 使用put方法來上傳文件。
6. 使用quit方法退出。
更多有關標准的Net::FTP模塊的應用,可以參考PerlDoc里的說明:http://perldoc.perl.org/Net/FTP.html 
 
以下是Net::FTP模塊中的一些常用方法及它們不同尋常的返回值的匯總。因為Perl有非常多的模塊,這些模塊又有非常多的方法,如果不是經常的使用它們,
必須有一個快速的列表供日后要使用時不要再參考其他的技術文檔,拿來即用是Perl的風格,要將它發揚光大。
Net::FTP API
1.如何新建一個FTP對象
$ftp=Net::FTP->new($host[,%options])%options
可以對這個新建的FTP對象指定特定的選項,比如連接的超時時間等。
選項列表:
Port
Timeout
Passive 為文件傳輸使用被動模式
BlockSize 傳輸的塊長度,默認為10240
2.如何登錄指定的FTP主機
$success=$ftp->login([$username][,$pwd][,$account])
login方法可以不加任何的參數,默認以anonymous為賬戶名登錄,它會查找.netrc 文件來作為它的認證信息。
3.如何設置文件傳輸模式
$type=$ftp->ascii 或者 binary
ascii適用於傳輸文本文件,這個方法返回前一個模式的值,比較的特殊。
4.如何得到遠程FTP服務器上的當前目錄
$dir=$ftp->pwd()
返回完整的工作路徑
5.如何刪除服務器上目錄,如果有權限
$success=$ftp->rmdir($dir)
6.如何創建目錄
$success=$ftp->mkdir($dir,$parents)
如果$parents為真,則會像mkdir -p這樣
7.如何取得某目錄內的文件名和目錄名的短路徑格式列表
@items=$ftp->ls($dir)
在標量上下文中,它返回對數組的引用。你可這樣使用它$ftp->(‘-lF’)
@items=$ftp->dir() 這個和上面的ls差不多。它返回長格式形式的列表,像是ls -lg的形式。
8.如何從服務器上下載文件
$success=$ftp->get($remote,$local,$offset)
$remote可以為完整路徑或者相對於當前目錄的相對路徑,
$local可以指定下載的文件要存儲的名字,即文件重命名。可以把$local設定為一個存在的文件句柄,
        這樣下載的文件將發送到那個句柄中。
        比如$ftp->get(‘filename’,\*STDOUT)。
$offset是為斷點續傳而准備的參數,也就是它在傳輸前會從這個位置來傳輸。
9.如何直接檢索遠程文件不下載到指定的文件
$file_handle=$ftp->retr($filename)
這樣我們可以讀取這個文件句柄。print while<$file_handle>
10.如何上傳文件到遠程服務器上
$success=$ftp->put($local,$remote_dir)
11.如何初始化一個文件的傳輸
$file_handle=$ftp->stor($filename)
如果你能夠把文件從本地上傳到指定的遠程目錄內,這個方法返回一個文件句柄,之后我們就可以通過文件句柄來寫文件到遠程目錄的指定文件下。
還有一個功能差不多的方法:appe(),從名字上看,它是追加的意思,而sotr則直接覆蓋已經存在的文件。
12.如何返回遠程文件的修改時間,如果FTP服務器支持
$modtime=$ftp->mdtm($file)
它返回從紀元元年到現在的秒數;如果文件不存或者不是普通的文件,它返回undef。
13.如何得到遠程服務器的文件大小
$size=$ftp->size($file)
如果文件不存在或者不是普通文件,返回undef。它以字節為單位返回指定文件的長度。
14.如果取得FTP服務器反饋的消息
$mesage=$ftp->message()
FTP以交互的形式工作,我們給FTP服務器發送一個指令,它進行解析並返回特定的消息,
如 220 Serv-U FTP Server v6.4 for WinSock ready…,前面那個220指示命令完成的狀態,
大於500的表示FTP服務器內部的錯誤,400~499表示客戶端的錯誤,200~299表示命令成功完成。
通常來說我們沒有成功登錄到指定的FTP時,message()方法可以報告發生了什么錯誤。
 
其他要點:
Net::FTP是libnet實用程序的一部分,這個軟件包還包含其他的有用模塊,比如Net::Time、Net::SMTP,
具體可以參看http://search.cpan.org/~gbarr/,這是此軟件包開發者的項目主頁。
1.在這里隨便提下Net::Cmd模塊。這個模塊有兩個主要的方法:command() 和response()。
$success=$obj->command($cmd,@args)
此方法將$cmd指定的命令發送給服務器,可以為命令加一些參數,它自動的在各參數之間加入空格進行分隔並將一個CRLF控制字符附加到命令的末尾。
$status=$obj->response()
它獲取服務器對最后一次命令的響應,返回一個數字作為狀態報告給我們,在失敗的情況下返回undef。

以上就是FTP模塊需要了解的部分,作為日后備忘的快速查閱。
模板例子:
#!/usr/bin/perl -w
#使用模塊Net::FTP
use Net::FTP;
 #創建新的FTP連接
 $ftp = Net::FTP->new ( "ftp.cpan.org", Timeout => 30 ) or die "Could not connect.\n";
 #登錄用的用戶名和密碼
 $username = 'anonymous';
 $password = 'lvdbing@163.com';
 #登錄到FTP服務器
 $ftp->login($username,$password) or die "Could not login.\n";
 #切換目錄到/pub/CPAN
 $ftp->cwd('/pub/CPAN');
 #指定遠程的文件和本地的文件
 $remotefile = "CPAN.html";
 $localfile = "CPAN.html";
 #使用get方法下載遠程文件到本地來
 $ftp->get($remotefile,$localfile) or die "Could not get remotefile:$remotefile\n";
 #退出FTP服務器
 $ftp->quit;
 
一個我自己的例子:
#!/usr/bin/perl-w
use strict;
use warnings;
#使用Net::FTP模塊
use Net::FTP;
our $ftp_host = "-";
our $ftp_user = "-";
our $ftp_pw = "-";
&main();
exit(0);
sub main
{
  &login_ftp();
}
 
sub login_ftp
{
  my $ftp;
  $ftp = Net::FTP->new($ftp_host,Passive=>1,Debug=>1,Timeout=>30) or die "Can not connect to ftp server $ftp_host : $@" , $ftp->message;
  $ftp->login($ftp_user,$ftp_pw) or die "Can not login ", $ftp->message;;
  $ftp->cwd("/test") or die "Can not change working directory !\n" , $ftp->message;
  #$ftp->get("aaa.txt") or die "get failed ", $ftp->message;
$ftp->put("config.txt");
$ftp->quit;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM