Perl中FTP的使用

呆呆笨笨的魚發表於2014-04-17
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裡的說明: 

以下是Net::FTP模組中的一些常用方法及它們不同尋常的返回值的彙總。因為Perl有非常多的模組,這些模組又有非常多的方法,如果不是經常的使用它們,必須有一個快速的列表供日後要使用時不要再參考其他的技術文件,拿來即用是Perl的風格,要將它發揚光大。
Net::FTP API
如何新建一個FTP物件
$ftp=Net::FTP->new($host[,%options])%options
可以對這個新建的FTP物件指定特定的選項,比如連線的超時時間等。
選項列表:
Port
Timeout
Passive 為檔案傳輸使用被動模式
BlockSize 傳輸的塊長度,預設為10240
如何登入指定的FTP主機
$success=$ftp->login([$username][,$pwd][,$account])
login方法可以不加任何的引數,預設以anonymous為賬戶名登入,它會查詢.netrc 檔案來作為它的認證資訊。
如何設定檔案傳輸模式
$type=$ftp->ascii 或者 binary
ascii適用於傳輸文字檔案,這個方法返回前一個模式的值,比較的特殊。
如何得到遠端FTP伺服器上的當前目錄
$dir=$ftp->pwd()
返回完整的工作路徑
如何刪除伺服器上目錄,如果有許可權
$success=$ftp->rmdir($dir)
如何建立目錄
$success=$ftp->mkdir($dir,$parents)
如果$parents為真,則會像mkdir -p這樣
如何取得某目錄內的檔名和目錄名的短路徑格式列表
@items=$ftp->ls($dir)
在標量上下文中,它返回對陣列的引用。你可這樣使用它$ftp->(‘-lF’)
@items=$ftp->dir() 這個和上面的ls差不多。它返回長格式形式的列表,像是ls -lg的形式。
如何從伺服器上下載檔案
$success=$ftp->get($remote,$local,$offset)
$remote可以為完整路徑或者相對於當前目錄的相對路徑,$local可以指定下載的檔案要儲存的名字,即檔案重新命名。可以把$local設定為一個存在的檔案控制程式碼,這樣下載的檔案將傳送到那個控制程式碼中。比如$ftp->get(‘filename’,\*STDOUT)。$offset是為斷點續傳而準備的引數,也就是它在傳輸前會從這個位置來傳輸。
如何直接檢索遠端檔案不下載到指定的檔案
$file_handle=$ftp->retr($filename)
這樣我們可以讀取這個檔案控制程式碼。print while
如何上傳檔案到遠端伺服器上
$success=$ftp->put($local,$remote_dir)
如何初始化一個檔案的傳輸
$file_handle=$ftp->stor($filename)
如果你能夠把檔案從本地上傳到指定的遠端目錄內,這個方法返回一個檔案控制程式碼,之後我們就可以透過檔案控制程式碼來寫檔案到遠端目錄的指定檔案下。還有一個功能差不多的方法:appe(),從名字上看,它是追加的意思,而sotr則直接覆蓋已經存在的檔案。
如何返回遠端檔案的修改時間,如果FTP伺服器支援
$modtime=$ftp->mdtm($file)
它返回從紀元元年到現在的秒數;如果檔案不存或者不是普通的檔案,它返回undef。
如何得到遠端伺服器的檔案大小
$size=$ftp->size($file)
如果檔案不存在或者不是普通檔案,返回undef。它以位元組為單位返回指定檔案的長度。
如果取得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,具體可以參看,這是此軟體包開發者的專案主頁。在這裡隨便提下Net::Cmd模組。這個模組有兩個主要的方法:command() 和response()。
$success=$obj->command($cmd,@args)
此方法將$cmd指定的命令傳送給伺服器,可以為命令加一些引數,它自動的在各引數之間加入空格進行分隔並將一個CRLF控制字元附加到命令的末尾。
$status=$obj->response()
它獲取伺服器對最後一次命令的響應,返回一個數字作為狀態報告給我們,在失敗的情況下返回undef。

以上就是FTP模組需要了解的部分,作為日後備忘的快速查閱。
模板例子:
1 #!/usr/bin/perl -w
2 #使用模組Net::FTP
3 use Net::FTP;
4 #建立新的FTP連線
5 $ftp = Net::FTP->new
6 (
7 "ftp.cpan.org",
8 Timeout => 30
9 ) or die "Could not connect.\n";
10 #登入用的使用者名稱和密碼
11 $username = 'anonymous';
12 $password = 'lvdbing@163.com';
13 #登入到FTP伺服器
14 $ftp->login($username,$password) or die "Could not login.\n";
15 #切換目錄到/pub/CPAN
16 $ftp->cwd('/pub/CPAN');
17 #指定遠端的檔案和本地的檔案
18 $remotefile = "CPAN.html";
19 $localfile = "CPAN.html";
20 #使用get方法下載遠端檔案到本地來
21 $ftp->get($remotefile,$localfile) or die "Could not get remotefile:$remotefile\n";
22 #退出FTP伺服器
23 $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;
}

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28929558/viewspace-1143867/,如需轉載,請註明出處,否則將追究法律責任。

相關文章