the-bastion/bin/plugin/open/selfForgetHostKey
Stéphane Lesimple fde20136ef
Initial commit
2020-10-20 14:30:27 +00:00

94 lines
2.8 KiB
Perl
Executable file

#! /usr/bin/env perl
# vim: set filetype=perl ts=4 sw=4 sts=4 et:
use common::sense;
use File::Basename;
use lib dirname(__FILE__) . '/../../../lib/perl';
use OVH::Result;
use OVH::Bastion;
use OVH::Bastion::Plugin qw( :DEFAULT help );
my $remainingOptions = OVH::Bastion::Plugin::begin(
argv => \@ARGV,
header => "remove a known hostkey",
options => {},
helptext => <<'EOF',
Forget a known host key from your bastion account
Usage: --osh SCRIPT_NAME [--host HOST] [--port PORT]
--host HOST Host to remove from the known_hosts file
--port PORT Port to look for in the known_hosts file (default: 22)
This command is useful to remove the man-in-the-middle warning when a key has changed,
however please verify that the host key change is legit before using this command.
The warning SSH gives is there for a reason.
EOF
);
#
# code
#
my $fnret;
if (not $host and not $ip) {
help();
osh_exit 'ERR_MISSING_PARAMETER', "Missing argument 'host'";
}
my @toCheck;
if ($port && $port ne '22') {
if ($host) {
push @toCheck, "[$host]:$port";
}
if ($ip and $host ne $ip) {
push @toCheck, "[$ip]:$port";
}
}
else {
if ($host) {
push @toCheck, $host;
}
if ($ip and $host ne $ip) {
push @toCheck, $ip;
}
}
my $result_hash = {};
foreach my $item (@toCheck) {
next unless $item;
osh_info "Looking for keys in your known_hosts for $item";
# if the user's known_hosts doesn't exist, it makes ssh-keygen -F very angry
if (!-e "$HOME/.ssh/known_hosts") {
osh_ok(R('OK_NO_CHANGE', msg => "Your account didn't have any known_hosts file, nothing to do"));
}
my @command = qw{ ssh-keygen -F };
push @command, $item;
$fnret = OVH::Bastion::execute(cmd => \@command, noisy_stderr => 1, noisy_stdout => 1);
if ($fnret->err eq 'OK' || $fnret->value->{'sysret'} == 1) {
if (not @{$fnret->value->{'stdout'} || []}) {
$result_hash->{$item} = {action => 'OK_NO_MATCH'};
osh_info "... none found (maybe you forgot to specify --port ?)";
next;
}
osh_info "At least one key was found, deleting it...";
@command = qw{ ssh-keygen -R };
push @command, $item;
$fnret = OVH::Bastion::execute(cmd => \@command, noisy_stderr => 1, noisy_stdout => 1);
if ($fnret->err eq 'OK') {
$result_hash->{$item} = {action => 'OK_DELETED'};
osh_info "Key for '$item' deleted successfully";
}
else {
$result_hash->{$item} = {action => 'ERR_DELETE_FAILED'};
osh_crit "An error occurred while trying to delete the key (" . $fnret->msg . ")";
}
}
else {
osh_exit 'ERR_SSH_KEYGEN_FIND', "An error occurred while trying to look for the key (" . $fnret->msg . ")";
}
}
osh_ok $result_hash;