Pages : 1
#1 Le 07/05/2013, à 22:14
- ruf
Script PERL ...
J' aurais besoin d'aide sur un script Perl qui fonctionne à moitié ...
Je souhaite crée un script Perl qui, sur les IP's qu'on lui a précisés dans un fichier, génère des clefs ssh et les renvoie au serveur distant, j'ai presque fini le script, mais je bloque à l'envoi de l' authorized_keys, voilà ce que ça donne pour le moment, ce qui est commenté sont des tests semi concluant de ce que j'ai pu tester pour l'envoi, je bloque au fingerprint ...
Et j'ai aussi un souci à la connection au deuxième serveur qui pourrait être dans la liste des hosts, il me dit que le socket 1023 est déjà utilisé, le port reste bloquer pendant une minute au moins, bizarre, j'ai remarqué ça avec Netstat.
Voilà le script en question :
#!/usr/bin/perl -w
use Net::OpenSSH; #<C' est un peu le bordel ici, il faut que je fasse le trie mais apres test
use warnings;
use strict;
use Net::SSH::Perl;
use Net::SSH::Perl::SSH2;
use Net::Ping;
use IO::Prompt;
use Term::ReadKey;
use Data::Dumper;
use Term::ANSIColor;
use Net::SCP;
use Net::SCP::Expect;
use Expect;
use Socket;
$|=1; #flushes IO Writehandle
my $user = "root";
my $pass = $ARGV[0]; #<mot de passe en argument, tout les serveur , doive avoir le meme mot de passe, je bloc encore a ce niveau
############################ LECTURE DU FICHIER LOG D' IP
open (HOSTS, "hosts_list") or die "Liste HOSTS non-presente... $!\n";
my @lines =<HOSTS>;
foreach my $line(@lines){
chomp($line);
my $p = Net::Ping->new("icmp");
unless($p->ping($line)){
print color ("red"),"$line <-- N' est pas joigniable ... \n", color ("reset");
}else {
&log_in($line);
}
$p->close();
}
########################### FIN DE LETURE DU FICHIER LOG D' IP
########################### CONNECTION SSH ET CREATION DES CLEES
sub log_in{
my ($line) = @_;
my $ssh = Net::SSH::Perl->new(@_, protocol => '2,1', async => 1);
$ssh->login($user,$pass);
$ssh->cmd('ssh-keygen -b 4048 -N "" -t rsa -f /root/.ssh/id_rsa') ;
$ssh->cmd('touch /root/.ssh/authorized_keys') ;
$ssh->cmd('cat /root/.ssh/id_rsa.pub > /root/.ssh/authorized_keys') ;
}
###########################PREMIER TEST, BLOQUE AU FINGERPRINT
#my @hosts = qw/ XXX.XX.XX.XXX /;
#my $file = "/root/.ssh/authorized_keys";
#foreach my $host (@hosts) {
# my $dest = "$user\@$host:$file";
# my $scp = Net::SCP->new(auto_quote=>'0', preserve=>'1', verbose=>'1', auto_yes=>'1', $host, $user);
# unless ($scp->scp($file => $dest)) {
# my $scpe = Net::SCP::Expect->new;
# $scpe->login($user, $pass);
# eval { $scpe->scp($file => $dest) };
# warn "$0: scp $file $dest failed:\n" .
# "Public key auth:\n" .
# " $scp->{errstr}\n" .
# "Password auth:\n" .
# " $@\n";
# }
# }
#}
##########################DEUXIEME TEST, BLOQUE AU FINGERPRINT
########################## CELUI CI LIS LE FICHIER host_test AVEC L'IP DU SERVEUR
#open(my $fh, '<', 'host_test') or die $!;
#while (my $host = <$fh>){
#my $scpe = Net::SCP::Expect->new( timeout=>'25', auto_quote=>'0', preserve=>'1', verbose=>'1', auto_yes=>'1', host=>"$host", user=>"$user", password=>"$pass");
#$scpe->scp('/root/.ssh/id_rsa.pub', '/root/.ssh/authorized_keys');
#close($fh) or die $!;
#}
La personne qui me trouve la solution à gagner un pack de bières et des bonbons!
PS : Je débute seulement en Perl, désolé si le code est un peu degeu ...
Dernière modification par ruf (Le 07/05/2013, à 22:22)
HOSTLAB Coming soon
Hors ligne
#2 Le 07/05/2013, à 23:00
- Haleth
Re : Script PERL ...
Tu peux bypass cette demande (equivalent à taper yes à chaque fois ..):
ssh -oStrictHostKeyChecking=no user@host
PS : Je débute seulement en Perl, désolé si le code est un peu degeu ...
Ben, c'est du Perl quoi :troll:
Ubuntu is an ancien African word which means "I can't configure Debian"
Because accessor & mutator are against encapsulation (one of OOP principles), good OOP-programmers do not use them. Obviously, procedural-devs do not. In fact, only ugly-devs are still using them.
Hors ligne
#3 Le 08/05/2013, à 02:18
- ruf
Re : Script PERL ...
Merci de te pencher sur mon probléme.
J' ai mis ce que tu m' a préciser à l' apel de Net::SSH::Perf:
my $ssh = Net::SSH::Perl->new(@_, protocol => '2,1', async => 1, options => [ "StrictHostKeyChecking no"] );
Ont a contourné le fingerprint, et maintenant, quand je tente une connection a la mano, j' ai le droit a :
root@XXX.XX.X.XXX's password:
La commande pour l' envoie est la suivante :
$ssh->cmd('scp /root/.ssh/authorized_keys root@XXX.XX.X.XXX:/home/test/');
Et le know_hosts ce crée...
Une idée ?
Dernière modification par ruf (Le 08/05/2013, à 02:53)
HOSTLAB Coming soon
Hors ligne
#4 Le 08/05/2013, à 13:00
- Haleth
Re : Script PERL ...
Bawé, c'est la suite logique
C'est pour ca que "personne" n'utilise ssh dans un script sans clefs
Y'a deux alternatives génériques:
- utilisation de popen & co (avec read & write sur stdin pour envoyer le pass au bon moment)
- utilisation de expect, plus simple pour gérer les IO sur stdin/stdout
Un module expect est dispo pour Perl, il semble
Dans les deux cas, je ne pense pas que tu puisses utiliser le module SSH de Perl
Bref, personnellement j'utiliserais Bash pour ce genre de problème, mais tu dois pouvoir le faire en Perl
Ubuntu is an ancien African word which means "I can't configure Debian"
Because accessor & mutator are against encapsulation (one of OOP principles), good OOP-programmers do not use them. Obviously, procedural-devs do not. In fact, only ugly-devs are still using them.
Hors ligne
Pages : 1