2015-05-04 137 views
0

我想从使用sftp实用程序的特定文件夹下载几个文件,并通过Expect.pm来完成它。下面是该代码:使用Expect.pm运行sftp命令

use strict; 

use Expect; 

my $userid = `whoami`; 

chomp($userid); 

my $Password = "<password>"; 

my $command = "sftp " . "$userid" . "\@<server-name>"; 

my $spawn_ok = 0; 

my $timeout = 10; 

print "$command \n"; 

my $exp = new Expect(); 
$exp->log_file("FTPLOGFILE.txt"); 
$exp->spawn("$command") or die "Cannot spawn $command: $!\n"; 

$exp->log_stdout(0); 
$exp->expect($timeout, 
      [ 'Password:', 
       sub { 
        $spawn_ok = 1; 
        my $fh = shift; 
        print "Sending password \n"; 
        $fh->send("$Password\r"); 
        exp_continue; 
        } 
      ], 
      [ 'sftp> ', 
       sub { 
         my $fh = shift; 
         $spawn_ok = 3; 
         print "Downloading cfg files \n"; 
         $fh->send("get /home/cfg/*.cfg /tmp/ACC_CCM_CFG","\n"); 
         $fh->send("bye","\n"); 
         exp_continue; 
        } 
      ] 

的问题是除了从网上下载文件到上面的目录:/ tmp目录/ ACC_CCM_CFG我也想运行相同的SFTP会话中下面的命令: GET /家/申请/*.pl/tmp/ACC_CCM_APPL 但是我不能这样做,因为expect函数的正则表达式是相同的(sftp>)。如果提示的正则表达式没有改变,我如何在预期的同一个sftp会话中运行一系列命令。

请在上面提一下,因为我找不到任何解决方案。

+0

使用Net :: SFTP :: Foreign – salva

回答

1

对此使用Expect和system sftp命令的任何理由?使用Net :: SFTP模块可以使工作变得更加简单和干净。