прекратяване на подканата за парола по време на 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=да -o StrictHostKeyChecking=няма 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