使用Expect.pm运行sftp命令

时间:2015-05-04 13:10:18

标签: perl

我正在尝试使用sftp实用程序从特定文件夹下载少量文件,并通过Expect.pm进行。以下是代码:

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会话中运行以下命令: 获取/home/appl/*.pl / tmp / ACC_CCM_APPL 但我不能这样做,因为期望函数的正则表达式是相同的(sftp&gt;)。如果提示的正则表达式没有改变,我如何使用expect在同一个sftp会话中运行一系列命令。

请注意以上内容,因为我找不到任何解决方案。

1 个答案:

答案 0 :(得分:1)

使用Expect和system sftp命令的原因是什么?使用Net :: SFTP模块可以使工作更轻松,更干净。