smeserver-dirty-tools/root/sbin/e-smith/dt-send-key

134 lines
2.7 KiB
Perl
Executable File

#!/usr/bin/perl -w
# Michael Weinberger, neddix 2007
# See http://wiki.contribs.org/Dirty_Tools for full documentation
use strict;
use Getopt::Long;
my %opts;
my $getRes = GetOptions(
"revoke"=>\$opts{'revoke'},
"port=s"=>\$opts{'keys-port'},
);
die "Usage: dt-send-key [--revoke] [--port=PORT] remotehost\n" if( not $ARGV[0] ) ;
my $ExecCmdOutout='';
my $remotehost=$ARGV[0];
my $port=$opts{'keys-port'} ? $opts{'keys-port'} : 22;
sub trim($)
{
my $s=shift;
$s=~s/^\s+//;
$s=~s/\s+$//;
return $s;
}
sub ExecCmd( \@$ )
{
(my $cmdRef, my $forcelog) = @_;
my @cmd = @$cmdRef;
my $pipestatus='';
die "Fork failed: $!\n" unless defined( my $pid=open(RCHILD, "-|"));
if( $pid )
{
$ExecCmdOutout='';
while(<RCHILD>)
{
chomp( $_ );
next if $_ eq '';
$ExecCmdOutout.="$_\n";
$pipestatus=$_;
}
close( RCHILD );
}
else
{
exec( "@cmd 2>&1; echo \${PIPESTATUS}" ) or die "exec failed: $!\n";
}
$ExecCmdOutout =~ s/$pipestatus\n$//;
$pipestatus = $? if not $pipestatus;
return $pipestatus;
}
sub sendKeys()
{
my $kf="/root/.ssh/id_dsa.pub";
my $s;
my @cmd;
$remotehost =~ /(.*)/; $remotehost=$1;
if( not -f $kf or not -f "/root/.ssh/id_dsa" )
{
$s="Generating DSA keys...";
print "$s\n";
@cmd=("/usr/bin/ssh-keygen","-q","-t","dsa","-N ''","-f", "/root/.ssh/id_dsa" );
not ExecCmd( @cmd, 0 ) or errorExit( 1, "Couldn't generate DSA keys" );
$s="Successfully created DSA key pair.";
print "$s\n";
}
open( PUBK, $kf ) or errorExit( 2, "Could not open $kf" );
my $pubk=trim(<PUBK>);
close( PUBK );
my $ak="/root/.ssh/authorized_keys2";
@cmd=("/bin/cat", $kf,
"|/usr/bin/ssh", '-o', "StrictHostKeyChecking=no", '-p', $port, $remotehost,"'/bin/cat - > $ak.\$\$ && /bin/touch $ak && /bin/grep -v \"$pubk\" < $ak >> $ak.\$\$ ; /bin/mv -f $ak.\$\$ $ak'");
ExecCmd( @cmd, 0 );
if( $ExecCmdOutout )
{
print "$ExecCmdOutout";
errorExit( 3, "$ExecCmdOutout" );
}
$s="Public DSA key sent to $remotehost";
print "$s\n";
}
sub revokeKeys()
{
my $kf="/root/.ssh/id_dsa.pub";
return if not -f $kf;
my $s;
my @cmd;
open( PUBK, $kf ) or errorExit( 4, "Could not open $kf" );
my $pubk=trim(<PUBK>);
close( PUBK );
$remotehost =~ /(.*)/; $remotehost=$1;
my $ak="/root/.ssh/authorized_keys2";
@cmd=("/usr/bin/ssh", '-o', "StrictHostKeyChecking=no", '-p', $port, $remotehost, "'/bin/touch $ak && /bin/grep -v \"$pubk\" < $ak > $ak.\$\$ ; /bin/mv -f $ak.\$\$ $ak'");
ExecCmd( @cmd, 0 );
if( $ExecCmdOutout )
{
print "$ExecCmdOutout";
errorExit( 5, "$ExecCmdOutout" );
}
$s="Public DSA key deleted on $remotehost";
print "$s\n";
}
sub errorExit( $$ )
{
(my $err, my $msg) = @_;
print( "Error $err: $msg\n" );
exit -1;
}
# main
if( $opts{'revoke'} )
{
revokeKeys();
}
else
{
sendKeys();
}
exit 0;