Como posso transferir um arquivo usando SCP sem uma senha de um script Perl?
Pergunta
Estou escrevendo um script Perl que precisa transferir arquivos entre computadores usando o SCP. Conheço a autenticação de chave pública, mas preciso que o script seja totalmente automatizado, por isso não posso visitar as máquinas para configurar as chaves antes que o script seja executado.
Existe alguma maneira de passar a senha para o SCP a partir do script Perl ou configurar as teclas de dentro do script Perl?
Esse script será executado como parte de um script de compilação que também reima o disco rígido que eu preciso para executar o script. Portanto, não posso estar lá para configurar as teclas toda vez que o projeto for construído.
Solução
Você poderia usar o perl Espero Módulo, veja Um exemplo no Fórum dos Consultores da Well House.
Sua documentação tem um Exemplo de telnet que é facilmente alterado para SSH.
Net :: ssh :: espera é outro módulo Perl para fazer exatamente o que você deseja. Eu não usei este anteriormente, no entanto.
Outras dicas
Você pode usar Net :: ssh :: perl. Abaixo está o código de amostra que você pode usar.
#!/usr/bin/perl -w
use strict;
use Net::SSH::Perl
my $cmd = 'command';
my $ssh = Net::SSH::Perl->new("hostname", debug=>0);
$ssh->login("username","password");
my ($stdout,$stderr,$exit) = $ssh->cmd("$cmd");
print $stdout;
Esse código simplesmente executará o 'comando' fornecido na máquina remota e fornecerá a saída no sistema local. Portanto, para, em vez de SCP, você pode usar esse script com o comando 'CAT' para capturar a saída do 'nome do arquivo de gato' no sistema local e redirecionar a saída no arquivo no sistema local.
Espero que isto ajude.
Faça uso de ssh-agent. E se você usa o GNOME, o agente SSH do Gnome Keyring é maravilhoso.
Basta criar teclas que não possuem senhas.
Você pode usar um Key ssh (sem senha).
#!/usr/bin/perl -w
######################################################
# #
# #
# Script to send files to server #
# Author: Jurison Murati #
# #
######################################################
use strict;
use Net::SCP::Expect;
use File::Copy;
use IO::Compress::Gzip qw(gzip $GzipError);
my $host = "192.168.0.1";
my $user = "user";
my $pwd = "password";
my $RemoteDir = </nodes>;
my $file;
my $displaydate= `date +'%Y%m%d%H%M%S'`;
print "Filloi dergimi date $displaydate\n";
my $scp = Net::SCP::Expect->new(host=>$host,user=>$user,password=>$pwd,recursive=>1);
my $dir = '/arch';
opendir(DIR, $dir) or die $!;
while (my $file = readdir(DIR)) {
next if ($file =~ m/^\./);
$scp->scp("$dir/$file","$RemoteDir") or die $scp->{errstr};
print "file $dir/$file moved on date $displaydate\n";
}
exit 0;