прекращение запроса пароля во время scp в perl через определенное время

Я пытаюсь выйти из подсказки ввода пароля во время команды scp в сценарии perl через определенное время для сервера, у которого нет открытого ключа ssh. В этом скрипте я использую обратную галочку для копирования файла с одного сервера на другой, но скрипт зависает на запросе пароля и не завершается даже после назначенного времени ожидания.

my $test       = '';
my $exit_value = '';
eval {
          my $timeout = 2;
          local $SIG{ALRM} = sub { die "timeout\n" };
          alarm($timeout);
          $test       = `scp foo.txt bar@baz:/`;
          $exit_value = $? >> 8;
          alarm(0);
     }

if ($@) {
    print "Time out";
}

Есть ли способ справиться с описанным выше сценарием?


person made_in_india    schedule 22.07.2015    source источник


Ответы (3)


Вы должны установить BatchMode при вызове из неинтерактивного сеанса, чтобы полностью отключить запрос пароля.

$test = `scp -o BatchMode=yes foo.txt bar@baz:/`;

Увидеть ниже

 BatchMode
         If set to ``yes'', passphrase/password querying will be disabled.
         This option is useful in scripts and other batch jobs where no
         user is present to supply the password.  The argument must be
         ``yes'' or ``no''.  The default is ``no''.
person sabertiger    schedule 22.07.2015

Также вы можете использовать следующий параметр, чтобы отключить проверку host_key, используя:

$test = scp -o BatchMode=yes -o StrictHostKeyChecking=no foo.txt bar@baz:/;

person Yuvraj Gupta    schedule 22.07.2015

Я использовал IPC::Run модуль для достичь вышеуказанной цели, чтобы прекратить запрос пароля через определенное время.

Итак, мой текущий код выглядит так

my $in  = '';
my $out = '';
my $err = '';
my @cmd = ('scp' , 'foo.txt' , 'bar@baz:/');

eval {
        run \@cmd, \$in, \$out, \$err,IPC::Run::timeout(5)
            or die "SSH Error: $? $err\n";
    };
if ($@) {
   print "TimeOut";
}
person made_in_india    schedule 22.07.2015