Echange key

De wiki.nexiat.fr
Aller à la navigation Aller à la recherche
Fiche express
Domaine Automatisation SSH (échange de clés)
Langage Perl (module Expect)
Voir aussi Echange key script · Creer une clef ssh

Script Perl (via le module Expect) qui génère au besoin un couple de clés RSA locales, puis copie la clé publique sur une machine distante et l'ajoute à son fichier authorized_keys.

#!/usr/bin/perl
use Expect;
# USAGE : ssh-key-exchange.pl <IP> <USERNAME> <PASSWORD>

my $ip       = $ARGV[0];
my $login    = $ARGV[1];
my $password = $ARGV[2];
my $private_key       = '/root/.ssh/id_rsa';
my $public_key        = '/root/.ssh/id_rsa.pub';
my $authorisedkeyfile = '/root/.ssh/authorized_keys';
my $timeout = 10;
my $aft = new Expect;

# Générer le couple de clés sur la machine locale A
if (!((-e $public_key) && (-e $private_key))) {
    print "Génération des clés publique et privée :\n";
    @result = `ssh-keygen -t rsa -f /root/.ssh/id_rsa -P ""`;
}

# Copier la clé publique de A vers B
print "Copie de la clé publique de A vers B.\n";
$aft->spawn("scp $public_key $login\@$ip:/tmp/");
$aft->expect($timeout,
    [ qr'\? $',      sub { my $fh = shift; $fh->send("yes\n"); exp_continue; } ],
    [ 'Password: $', sub { my $fh = shift; $fh->send("$password\n"); exp_continue; } ],
);
$aft->do_soft_close();

# Ajouter la clé aux authorized_keys de B
print "Ajout de la clé dans authorized_keys sur $ip [$login].\n";
$aft = new Expect;
$aft->log_file("/tmp/expect_log", "w");
$aft->spawn("ssh $login\@$ip") or die "Impossible de se connecter en ssh\n";
$aft->expect($timeout,
    [ qr'\? $',      sub { my $fh = shift; $fh->send("yes\n"); exp_continue; } ],
    [ 'Password: $', sub { my $fh = shift; $fh->send("$password\n"); exp_continue; } ],
    '-re', '\# $',
);
$aft->send("touch $authorisedkeyfile\n");
$aft->expect($timeout, '-re', '\# $');
$aft->send("cat /tmp/id_rsa.pub >> $authorisedkeyfile\n");
$aft->expect($timeout, '-re', '\# $');
$aft->send("exit\n");
$aft->do_soft_close();

Voir aussi