this has probably been done before and it's not that clever. but i find it useful - it saves me adding aliases to .bashrc for machines i commonly ssh to:
This goes in a directory which is added to my path, and then gets symlinked to. the name of the symlink being the target machine, or an abbreviation of it.

# ls ssh-targets: box1 -> box2 ->
so now typing box1 will ssh me to that machine (i then also obv get tab completion on machine names)
#!/usr/bin/perl my $file=$0; # what machine are we looking at? $file=~s#^(?:.*/)?([^/]+)$#$1#; my $dest; # a config hash for expanding the name, and choosing the user. my $places={ box=>{full=>"boxwithlongname"}, home=>{full=>"blahblah",user=>"alexk"} }; # if i have many machines with the same long name - abbreviate to box # (as in hash above), so box1 goes to boxwithlongname1 etc my ($short,$number)=$file=~/^(\D+)(\d?)$/; my $hash=$places->{$short}; $dest=$hash->{full}?$hash->{full}.$number:$file; $user=$hash->{user}||"alex"; # and ssh to it. exec("ssh $user\@$dest @ARGV") if $dest;

Replies are listed 'Best First'.
Re: ssh wrapper
by tirwhan (Abbot) on Mar 28, 2006 at 10:29 UTC

    IMO a better way to do this (because it will continue to work with scp/sftp, does not require starting up a perl process and you can add other options with little effort) is to use the ~/.ssh/config file. For example, put this into the file:

    box1: User alexk Hostname boxwithlongname
    and on the commandline:
    ssh box1

    and it will do exactly the same thing. You can also add options such as compression, private key to use, X11 forwarding etc. in the same file, see man ssh_config for the details.

    All dogma is stupid.
      yep, that works.
      although i don't think it would do:
      box[\d] -> boxwithlongname[\d].
      (it ain't no big thing :) ) a
Re: ssh wrapper
by radiantmatrix (Parson) on Mar 28, 2006 at 18:33 UTC

    I did something similar to this, but with a shell script. I created a directory 'ssh' in my home dir, with a script, which I symlink to the short names of the servers I wish to attach to. I didn't care about shortname->longname expansion because tab completion was fast enough (for boxes that didn't end in one of the local domains anyhow).

    #!/bin/bash if [ "$1" == "" ]; then ssh $1@$0 else ssh $0 fi

    So, when I want to connect to with the username 'radmat', I can just:

    $ ~/ssh/ radmat

    When I can't remember usernames, I make an entry in ~/.ssh/config to remember it for me. Hostnames are expanded by tab completion, and this saves me a ton of time.

    Perl equivalent, if you want:

    #!/usr/bin/perl if (!defined $ARGV[0] || $ARGV[0] eq '') { exec('ssh',$0) } else { exec('ssh',"$ARGV[0]\@$0") }
    A collection of thoughts and links from the minds of geeks
    The Code that can be seen is not the true Code
    I haven't found a problem yet that can't be solved by a well-placed trebuchet