2010-06-29 94 views
3

我有一個主機上的文件列表,例如在目錄/ src /中。 該目錄有更多的子目錄。現在該目錄在安裝後被複制到遠程機器上。現在這些文件被預置在目錄/ dst中的遠程機器上。perl - 文件處理

例子。如果我有/ src/a/f1,/ src/b/f2 我將在遠程計算機上運行/ dst/a/f1,/ dst/b/f2

現在我只有主機目錄,主機文件。使用這些信息,我如何在perl中使用ssh訪問遠程機器上的文件。我將不得不cd/dst並從那裏讀取文件。我如何做這個CD,並在一個單一的ssh命令中讀取。

謝謝。

回答

2

如果你想要做的這一切,而不委派到/usr/bin/ssh,退房Net::SSH2,並且File::Spec

你需要scp_get (remote [, local ])

它會是這個樣子。

use File::Spec(); 
use Net::SSH2(); 
my ($vol, $dir, $file) = File::Spec::splitpath($path); 
my @dirs = File::Spec::splitdir($dir); 

## Change the root dir 
$dirs[0] = 'dst'; # new_root_dir 

my $new_remote_path = File::Spec::catfile(@dirs, $file); 

    ## Almost right from Net::SSH2 SYNOPSIS 
    my $ssh2 = Net::SSH2->new(); 
    $ssh2->connect('example.com') or die $!; 
    if ($ssh2->auth_keyboard('fizban')) { 

     my $sftp = $ssh2->sftp(); 

     my $fh = $sftp->open('/etc/passwd') or die; 
     print $_ while <$fh>; 

     ## or $ssh2->scp_get($new_remote_path); 
    } 
0

谷歌搜索'man ssh'出現了SSH手冊頁。我跟着第一個鏈接(http://unixhelp.ed.ac.uk/CGI/man-cgi?ssh+1),我們從中看到以下內容。有趣的部分被指定。

SSH [-1246AaCfgkMNnqsTtVvXxY] [-b bind_address] [-c cipher_spec] [-D 端口] [-e的escape_char] [-F CONFIGFILE] [-i identity_file] [-L [bind_address:] port:host:hostport] [-l login_name] [-m mac_spec] [-O ctl_cmd] [-o option] [-p port] [-R [bind_address:] port:host:hostport ] [-S ctl_path] [用戶@]主機名[命令]

...

SSH(SSH客戶端)可以 程序登錄遠程機器和用於 執行命令的遠程 機器上。它旨在替代 rlogin和rsh,並通過不安全的 網絡提供兩臺不可信主機之間的加密通信。 X11連接和任意 TCP/IP端口也可以通過安全通道轉發 。

ssh連接並登錄到 指定的主機名(使用可選用戶 名稱)。用戶必須使用 以下幾種方法之一向遠程計算機證明其身份,這取決於所使用的協議版本 。

如果指定了命令,則在遠程主機上執行命令,而不是在登錄shell中執行命令 。

因此,請嘗試ssh [email protected] ls -lR /src/,用您實際需要的任何命令替換'ls -lR'。

EDIT 呵呵,並查看身份文件的手冊頁 - 如果您設置了密鑰,則可以使用它來避免在命令行上爲SSH提供密碼。並確保您的身份文件的整個路徑具有強大的權限,以便其他人無法讀取/替換/編輯它。

+0

謝謝..幫助了很多:) – Anu 2010-07-06 20:23:11