Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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 smile


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