此Perl脚本在Windows上运行,我正在尝试将文件从本地计算机scp到Linux计算机,它不会打印任何错误但不会复制该文件。
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);
答案 0 :(得分:0)
$scp = Net::SCP->new( "$ip", "$user" ) or die "cannot scp $!";
$scp = new Net::SCP;
两次调用Net::SCP
构造函数。第二次,它调用它没有主机名或用户ID,不检查返回值,并覆盖您以前看起来正确的调用。删除这些行中的第二行。
答案 1 :(得分:0)
您正在测试是否已成功调用scp
对象的构造函数,但您未对实际执行scp
操作的成功进行测试。
这条线可以改进:
$scp->scp($source, $destination);
该模块的文档指出scp
在失败时返回false,并设置errstr
属性。所以您可以按如下方式更改该行:
$scp->scp($source, $destination) or die 'scp failed: ', $scp->{errstr};
通过这样做,您应该获得有用的诊断信息,这是真正了解解决问题的唯一方法。
此外,与您的问题无关,但值得一提:use Net::SCP qw(scp);
错误,因为它将scp
函数导入您的调用命名空间。这是错误的原因是你正在使用面向对象的"方法调用"调用scp
(换句话说,$scp->scp(...)
。调用scp
的方法调用方法并不需要将任何内容导入到调用命名空间中。
答案 2 :(得分:0)
Net::SCP documentation有两个如何调用scp()
的示例:
use Net::SCP qw(scp iscp);
scp($source, $destination);
$scp = new Net::SCP;
$scp->scp($source, $destination);
您会注意到,两个版本都没有显示如何指定主机名,用户名或密码,或者复制操作是本地到远程还是远程到本地。
事实上,Net :: SCP文档在描述如何使用scp()方面做得不是很好。查看source code for the module表明:
scp()
子例程不使用传递给Net :: SCP构造函数的任何值。scp
命令行实用程序,将源和目标参数传递给该程序 verbatim 。因此,指定主机名,用户名,密码和复制方向的正确方法与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);
这将生成一个格式为“user@1.2.3.4:/ tmp”的目的地,这是scp
程序接受的格式。
如果您尝试执行远程到本地副本,那么“$ {user} \ @ $ {ip}:”字符串应该预先添加到$ source而不是$ destination。请注意,“@”前面有一个反斜杠,因为它在双引号字符串中很特殊。
顺便说一句,如果您使用两个本地路径名调用scp
程序,它会调用系统的文件复制实用程序来执行本地复制操作。因此,您可能已将源文件名复制到C:\ tmp或本地系统上的类似位置。