134 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			134 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| 
								 | 
							
								#!/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;
							 |