http://www.perlmonks.org?node_id=712535
Category: Utility scripts
Author/Contact Info jacques
Description: I wrote this cvs wrapper because we were using cvs over ssh and I didn't want to keep logging in each time I invoked cvs. If you are doing the same thing, you might find it useful. One thing to note is that if someone has root, it is possible for them to get your password, since ssh-agent keeps it unencrypted in memory.
# Add the next 2 lines to bash_profile/bashrc file: 
#
#  eval `ssh-agent` > /dev/null
#  alias cvs='/path/to/cvs_wrapper.pl'
#
#!/usr/bin/perl

use strict;
use warnings;
use Expect;
#$Expect::Exp_Internal = 1;
#$Expect::Debug = 3;

my $testcommand = Expect->spawn("ssh-add -l");
$testcommand->log_stdout(0);

if ($testcommand->expect(1, '-re' => 'agent has')) {

    $testcommand->soft_close();

    print "CVS Wrapper\n===========\n\n";

    GET_PASSWD: {

        use Term::ReadKey;

        ReadMode 2;

        print "Enter cvs passwd:";

        my $passwd = <STDIN>;
        chomp $passwd;

        ReadMode 0;
        unless (length $passwd > 4) {
              print "\nBad password\n";
             redo GET_PASSWD;
        }

        my $user = $ENV{'USER'};
        my $home = $ENV{'HOME'};
        my $remoteserv = 'server.name.here';
        my $login = "$user" . '@' . "$remoteserv";

        unless (-e "$home/.ssh/id_dsa.pub") {
        # Set up private keys
        my $command = Expect->spawn("ssh-keygen -t dsa");
        $command->log_stdout(0);
        if ($command->expect(2, '-re' => 'Enter')) {
            print $command "\r"; 
        }
        if ($command->expect(2, '-re' => 'passphrase')) {
            print $command "$passwd\r"; 
        }

        if ($command->expect(2, '-re' => 'same')) {
            print $command "$passwd\r"; 
        }
        $command->soft_close();

        my $copy_command = Expect->spawn("scp ~/.ssh/id_dsa.pub $remot
+eserv:.ssh/authorized_keys2");
        $copy_command->log_stdout(0);
        if ($copy_command->expect(2, "password")) {
            print $copy_command "$passwd\r";
        }
        if ($copy_command->expect(3, '-re' => 'denied')) {
            $copy_command->hard_close();
            print "\nBad password\n";
            unlink "$home/.ssh/id_dsa.pub", "$home/.ssh/id_dsa";
            redo GET_PASSWD;
        }
        $copy_command->soft_close();

        }

        my $ssha_command = Expect->spawn("ssh-add");
        $ssha_command->log_stdout(0);
        if ($ssha_command->expect(2, "passphrase")) {
            print $ssha_command "$passwd\r";
        }
        if ($ssha_command->expect(1,'-re' =>'Bad')) {
            $ssha_command->hard_close();
            print "\nBad password\n";
            redo GET_PASSWD;
        }
        $ssha_command->soft_close();

        print "\nLogin successful\n";
    } #end GET_PASSWD
} else { $testcommand->soft_close(); }

open DATA, "/usr/bin/cvs @ARGV |" or die "Couldn't execute program: $!
+";
    while ( defined( my $line = <DATA> ) ) {
        chomp($line);
        print "$line\n";
    }
close DATA;