2015-09-04 83 views
0

這個Perl腳本在Windows上運行,我試圖從本地機器到Linux機器上scp文件,它不打印任何錯誤,但不復制文件。Perl從Windows到Linux的scp文件

use Net::SCP qw(scp); 
$source = 'c:\temp\a.txt'; 
$destination = '/tmp'; 
$scp = Net::SCP->new("$ip", "$user") or die "cannot scp $!"; 
print "scp $source $destination"; 
$scp->scp($source, $destination); 
+1

'$ scp-> scp(...)'的返回值是什麼? '$ scp - > {errstr}'的價值是什麼? – mob

回答

0

Net::SCP documentation有如何調用scp()兩個例子:

use Net::SCP qw(scp iscp); 
scp($source, $destination); 

$scp = new Net::SCP; 
$scp->scp($source, $destination); 

你會注意到,無論是版本顯示如何指定主機名,用戶名或密碼,或複製操作是本地到遠程或remote-to-local。

事實是,Net :: SCP文檔不能很好地描述如何使用scp()。望着source code for the module表明:

  1. scp()子程序不使用任何傳送到的Net :: SCP的構造函數的值。
  2. scp()調用scp命令行實用工具,將源和目標參數傳遞給該程序逐字

因此,指定主機名,用戶名,密碼和複製方向的正確方法與the scp command line utility相同。您的$source$destination值必須遵循scp程序接受的一般形式。假設你正在試圖做一個本地到遠程傳輸,你應該嘗試這樣的事:

$source = 'c:\temp\a.txt'; 
$destination = "${user}\@${ip}:/tmp"; 
$scp = new Net::SCP; 
$scp->scp($source, $destination); 

這將產生一個目的與形式的「[email protected]:/ tmp目錄」,這是scp程序接受的表單。

如果您嘗試執行遠程到本地副本,則應將$ {user} \ @ $ {ip}:「字符串預置爲$ source而不是$ destination。請注意,「@」前面有一個反斜槓,因爲它在雙引號字符串中是特殊的。另外,如果用兩個本地路徑名調用scp程序,它會調用系統的文件複製實用程序來執行本地複製操作。所以你可能已經將源文件名複製到C:\ tmp或本地系統上的類似位置。

+0

謝謝Kenster,錯誤是'scp'不被識別爲內部或外部命令',我應該在本地PC上安裝scp程序嗎? – rodee

+0

是的,您需要在命令路徑中安裝並提供「scp」命令行實用程序的副本。 – Kenster

0
$scp = Net::SCP->new("$ip", "$user") or die "cannot scp $!"; 
$scp = new Net::SCP; 

調用Net::SCP構造的兩倍。第二次,它不使用主機名或用戶標識來調用它,不檢查返回值,並覆蓋以前正確的調用。刪除這些行中的第二行。

+0

它沒有幫助,無論如何。 – rodee

+0

確實如此,它只是沒有足夠的幫助,以顯而易見:-) – mob

+0

更新我的問題中的腳本,以刪除額外的構造函數。 – rodee

0

您正在測試成功調用scp對象的構造函數,但是您未在實際執行scp操作時測試成功。

這條線可以改進:

$scp->scp($source, $destination); 

該模塊的文檔指出scp失敗時返回假,並設置errstr屬性。所以,你可以改變該行如下:

$scp->scp($source, $destination) or die 'scp failed: ', $scp->{errstr}; 

通過這樣做,你應該得到有用的診斷信息,這是真的知道了發生在解決這個問題的唯一途徑。

此外,與您的問題無關,但值得一提:use Net::SCP qw(scp);是錯誤的,因爲它將scp函數導入到您的調用名稱空間中。這是錯誤的原因是您正在使用scp(也就是$scp->scp(...))的面向對象的「方法調用」調用。調用scp的方法調用方法不需要將任何內容導入到您的調用名稱空間中。

+0

是的,愚蠢的我,謝謝,這有助於識別問題,我現在打印錯誤信息'scp失敗:'scp'不被識別爲內部或外部命令',正如kenster提到的,它試圖調用本地scp命令,我認爲它會使用Perl的,我不需要在我的本地PC上安裝scp。 – rodee

+0

看到錯誤信息幾乎總是進步。 :) – DavidO