2010-06-29 97 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