使用ssh sftpg3进行文件传输

时间:2015-07-06 18:11:20

标签: perl ssh ftp sftp mod-perl

我正在编写一个Perl脚本,使用SSH sftpg3.exe进行安全的文件传输

但我遇到访问源文件的问题。 该脚本能够从目录

运行时从C:\ xx \ t.txt中选择文件

未显示错误C:\ Program不是有效命令。

my $sftpPath="C:\\Program Files\\client";
my $srcPath="C:\\xx\\test.txt";
my $trgCommand=$sftpPath." -D $srcPath user@host:/tmp/";
my $result=system("$trgCommand");

从C:\目录运行此脚本时,它运行时没有错误,但我无法在目标服务器中看到该文件。

你能帮我解决一下这个文件路径问题吗? 我想从O:\运行它,它将从C:\驱动器中选择目标文件和sftpg3.exe并成功执行文件传输(在ASCII模式下)。

1 个答案:

答案 0 :(得分:1)

您可能在第三行插入了@host,因为您使用的是双引号("")。您是否已启用use strictuse warnings?路径中的空格()可能也存在问题。

use strict;
use warnings;
use feature 'say';

my $sftp_path = q{"C:\Program Files\Client\sftpg3.exe"};
my $src_path = 'C:\xx\test.txt';
my $result = system( $sftp_path, '-D', $src_path, 'user@host:/tmp/' );
say $result;

让我们来看看我做了什么。

  • 当您 tab - 在Windows cmd中完成类似C:\Program Files\foo的路径时,如果路径中有空格,它通常会用双引号将它们包装起来。所以我们使用q operator,它相当于单引号,并在里面加上双引号。这也为我们带来了好处,我们没有必要逃避反斜杠\。另请参阅quote-like operators in perlop
  • 源路径也一样。
  • system允许您将所有参数传递给您想要作为自身参数运行的程序,并将处理引用
  • "user@host:"中的双引号会尝试将@host扩展为数组。这不起作用,因为它没有定义。所以有一个警告,你可能没有看到,因为你没有use strictuse warnings。而不是双引号,请使用单引号。
  • 我使用$sftp_path而不是$sftpPath,因为Perl中有一个约定使用下划线而不使用大写字母。我们喜欢骆驼,但不是我们的变量名。 :)