我在 /src/ 目录中有主机上的文件列表。该目录有更多的子目录。现在这个目录在挂载后被复制到远程机器上。现在这些文件已预设在远程机器的 /dst 目录中。
例子。如果我有 /src/a/f1, /src/b/f2 我将在远程机器上拥有 /dst/a/f1 ,/dst/b/f2
现在我只有主机目录、主机文件的信息。使用此信息,我如何在 perl 中使用 ssh 访问远程计算机上的文件。我将不得不 cd 到 /dst 并从那里读取文件。如何执行此 cd 并读取一个 ssh 命令。
谢谢。
我在 /src/ 目录中有主机上的文件列表。该目录有更多的子目录。现在这个目录在挂载后被复制到远程机器上。现在这些文件已预设在远程机器的 /dst 目录中。
例子。如果我有 /src/a/f1, /src/b/f2 我将在远程机器上拥有 /dst/a/f1 ,/dst/b/f2
现在我只有主机目录、主机文件的信息。使用此信息,我如何在 perl 中使用 ssh 访问远程计算机上的文件。我将不得不 cd 到 /dst 并从那里读取文件。如何执行此 cd 并读取一个 ssh 命令。
谢谢。
如果您想在不委托的情况下完成所有操作/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 );
}
谷歌搜索“man ssh”会出现 SSH 手册页。我点击了第一个链接(http://unixhelp.ed.ac.uk/CGI/man-cgi?ssh+1),从中我们可以看到以下内容。指定了有趣的部分。
ssh [-1246AaCfgkMNnqsTtVvXxY] [-b bind_address] [-c cipher_spec] [-D port] [-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] [user@]hostname [ command ]
...
ssh(SSH 客户端)是一个用于登录远程机器并在远程机器上执行命令的程序。它旨在取代 rlogin 和 rsh,并通过不安全的网络在两个不受信任的主机之间提供安全的加密通信。X11 连接和任意 TCP/IP 端口也可以通过安全通道转发。
ssh 连接并登录到指定的主机名(使用可选的用户名)。用户必须根据所使用的协议版本,使用几种方法之一向远程机器证明他/她的身份。
如果指定了 command,则在远程主机上执行 command 而不是登录 shell。
所以,试着ssh user@hostname ls -lR /src/
用你真正想要的任何命令替换“ls -lR”。
编辑哦,查看身份文件的手册页 - 如果您设置了密钥,则可以使用它来避免在命令行上向 SSH 提供密码。并确保您的身份文件的整个路径具有强大的权限,因此没有其他人可以读取/替换/编辑它。