Perl - 在 windows 上建立 SFTP 连接的最佳方式
Perl - Best way to establish an SFTP connection on windows
我需要在 Windows 机器上使用 SFTP 将文件放在远程目录中。我试过 Net::SFTP::Foreign
,但我不能使用它,因为它需要 IO::Pty
,而 Windows 机器上没有。 best/simplest 的方法是什么?
更新请求信息:
以下是我使用的版本:
Net::SFTP::Foreign
: v 1.89
Net::SSH2
: v 0.69
Net::SFTP::Foreign::Backend::Net_SSH2
: v 0.09
这是我的代码的要点:
$ssh2 = Net::SSH2->new();
$ssh2->connect($host) || die "connect failed";
$ssh2->auth_password($user, $pass) || die "password auth failed";
$sftp = Net::SFTP::Foreign->new(ssh2 => $ssh2,
backend => 'Net_SSH2');
$sftp->error and
die "Unable to stablish SFTP connection: ". $sftp->error;
现在我正在尝试建立连接。我需要将文件放在服务器上。我收到的错误如下:
Net::SSH2::timeout(ss, timeout) at C:/Strawberry/perl/site/lib/Net/SSH2.pm line 111, <STDIN> line 1.
SFTP 实际上是带有包装器的 SSH 来模拟类似 FTP 的命令,所以 mdir
实际上是 ssh 'ls /path/to/dir'
。
虽然可能有一个避免 IO::Pty
的 Perl SFTP 包,但您只需将 "FTP" 命令翻译成它们的 ssh / scp 等价物,就可以更快地找到您的解决方案并查看 Net::SSH
--- 根据要求添加示例 ---
#!/bin/env perl
use Net::OpenSSH ();
my $connection = Net::OpenSSH->new('somehost.com', user => 'myuser', password => 'mypassword' );
my @ls = $connection->capture("ls");
printf "remote listing is %s\n", join(', ', @ls);
这应该将文件列出到您的控制台。
您提到没有 IO::Pty,因为它不适用于 windows 机器。也许您应该尝试安装 IO::Pty::Easy。请注意,Net::OpenSSH
也使用 IO::Pty
,但这应该可以在 windows 上执行,前提是您还按照 post [=18] 中的指示安装 Glib
=]
祝你好运!
在引擎盖下使用 Net::SFTP::Foreign in Windows is probably to use the Net::SFTP::Foreign::Backend::Net_SSH2 backend (update: a Perl module available from CPAN) which uses Net::SSH2 的首选方式(Strawberry Perl 已包含,更新:否则,您将需要自己构建和安装 libssh2这有时并不像它应该的那样容易。
另一种选择是 tell Net::SFTP::Foreign
使用 plink
命令来 运行 SSH 连接(在模块文档中搜索 plink
) . 更新:plink
是 PuTTY
应用程序分发的一部分,它是一个非常流行的 SSH 客户端,可能已经安装在该机器上。
最后,您还可以尝试使用 Net::SSH::Any,它为 Net::SFTP::Foreign
提供了自己的后端,并且可以 运行 在多个 SSH 客户端和模块之上......但它仍然在测试版!
我有几个使用 Net::SFTP::Foreign 的跨平台脚本,在 windows 上使用 plink,在 linux 上使用 openssh,效果很好。 Windows 正在使用最新的 strawberry perl 版本。
my $sftp = Net::SFTP::Foreign->new(
host=> $server,
ssh_cmd => $plink, #Contains full path to plink or path to ssh
user=> $user,
more => ['-i', $keyfile],
stderr_discard => 1,
);
使用 plink 后端的唯一问题是您必须首先使用 psftp 或 Putty gui 手动建立连接,以便将信任确认存储在注册表中。之后就可以从脚本开始了。
好处是您可以在系统级配置文件中定义 ssh 或 plink 的实际路径,脚本只读取该特定平台所需的内容。即 (...\bin\Putty\plink.exe 或 /usr/bin/ssh )
不是纯 Perl 解决方案,但非常可靠。我在我的任何 windows 框上都没有看到 IO::Pty,因此 plink 没有依赖性。
我需要在 Windows 机器上使用 SFTP 将文件放在远程目录中。我试过 Net::SFTP::Foreign
,但我不能使用它,因为它需要 IO::Pty
,而 Windows 机器上没有。 best/simplest 的方法是什么?
更新请求信息:
以下是我使用的版本:
Net::SFTP::Foreign
: v 1.89
Net::SSH2
: v 0.69
Net::SFTP::Foreign::Backend::Net_SSH2
: v 0.09
这是我的代码的要点:
$ssh2 = Net::SSH2->new();
$ssh2->connect($host) || die "connect failed";
$ssh2->auth_password($user, $pass) || die "password auth failed";
$sftp = Net::SFTP::Foreign->new(ssh2 => $ssh2,
backend => 'Net_SSH2');
$sftp->error and
die "Unable to stablish SFTP connection: ". $sftp->error;
现在我正在尝试建立连接。我需要将文件放在服务器上。我收到的错误如下:
Net::SSH2::timeout(ss, timeout) at C:/Strawberry/perl/site/lib/Net/SSH2.pm line 111, <STDIN> line 1.
SFTP 实际上是带有包装器的 SSH 来模拟类似 FTP 的命令,所以 mdir
实际上是 ssh 'ls /path/to/dir'
。
虽然可能有一个避免 IO::Pty
的 Perl SFTP 包,但您只需将 "FTP" 命令翻译成它们的 ssh / scp 等价物,就可以更快地找到您的解决方案并查看 Net::SSH
--- 根据要求添加示例 ---
#!/bin/env perl
use Net::OpenSSH ();
my $connection = Net::OpenSSH->new('somehost.com', user => 'myuser', password => 'mypassword' );
my @ls = $connection->capture("ls");
printf "remote listing is %s\n", join(', ', @ls);
这应该将文件列出到您的控制台。
您提到没有 IO::Pty,因为它不适用于 windows 机器。也许您应该尝试安装 IO::Pty::Easy。请注意,Net::OpenSSH
也使用 IO::Pty
,但这应该可以在 windows 上执行,前提是您还按照 post [=18] 中的指示安装 Glib
=]
祝你好运!
在引擎盖下使用 Net::SFTP::Foreign in Windows is probably to use the Net::SFTP::Foreign::Backend::Net_SSH2 backend (update: a Perl module available from CPAN) which uses Net::SSH2 的首选方式(Strawberry Perl 已包含,更新:否则,您将需要自己构建和安装 libssh2这有时并不像它应该的那样容易。
另一种选择是 tell Net::SFTP::Foreign
使用 plink
命令来 运行 SSH 连接(在模块文档中搜索 plink
) . 更新:plink
是 PuTTY
应用程序分发的一部分,它是一个非常流行的 SSH 客户端,可能已经安装在该机器上。
最后,您还可以尝试使用 Net::SSH::Any,它为 Net::SFTP::Foreign
提供了自己的后端,并且可以 运行 在多个 SSH 客户端和模块之上......但它仍然在测试版!
我有几个使用 Net::SFTP::Foreign 的跨平台脚本,在 windows 上使用 plink,在 linux 上使用 openssh,效果很好。 Windows 正在使用最新的 strawberry perl 版本。
my $sftp = Net::SFTP::Foreign->new(
host=> $server,
ssh_cmd => $plink, #Contains full path to plink or path to ssh
user=> $user,
more => ['-i', $keyfile],
stderr_discard => 1,
);
使用 plink 后端的唯一问题是您必须首先使用 psftp 或 Putty gui 手动建立连接,以便将信任确认存储在注册表中。之后就可以从脚本开始了。
好处是您可以在系统级配置文件中定义 ssh 或 plink 的实际路径,脚本只读取该特定平台所需的内容。即 (...\bin\Putty\plink.exe 或 /usr/bin/ssh )
不是纯 Perl 解决方案,但非常可靠。我在我的任何 windows 框上都没有看到 IO::Pty,因此 plink 没有依赖性。