rsh som i gamle dage

Mit første møde med UNIX var i 1983 på CERN, på en VAX 780, UNIX-en var helt ny Berkeley Software Distribution 4.2, med Netværk.  Ikke nok med det, CERN havde flere end een computer.

BSD 4.2 var systemet der udbredte internettet som vi kender idag. Med kommandoerne telnet, ftp, rlogin, og rsh kunne man forbinde sig til andre computere på nettet.  Og for at gøre det endnu nemmere kunne man tilføje /usr/hosts til sin PATH og man kunne så køre programmer direkte på andre computer (givet .rhost var sat op). hvis f.ex. man vil vide hvem der kørte på vaxc, så skrev man blot

$ vaxc who

og så blev kommandoen who udført på vaxc, men outputtet kom på min terminal – FANTASTISK.

Siden blev .rhost filer ildeset, og tilsidst forsvandt rlogin og rsh kommandoerne helt, istedet fik vi ssh, men vi fik mistede /usr/hosts/* og den simple måde at starte remote programmer på.

Så jeg lavede min egen som jeg har haft megen glæde af. I alt sin simpelhed, er det blot et shell-script newssh som generer et shell-script der bruger ssh til at udføre kommandoer på en remote maskine. og i samme omgang udveksler de nøgler så det kan gøres password frit for eftertiden. Man skal altså kun bruge sit password første gang for at overføre nøgler. Det der er lidt smart er at man så let som ingenting kan køre som en anden bruger og måske også via en anden port (for at snyde en firewall) et par eksempler

$ newssh -P 2222 root@openwrt.sommmerhus.dk
$ openwrt uptime    # uptime executed on the above host
$ openwrt
#        jeg er nu logget ind som root via port 2222
$ newssh pi@raspa
$ raspa
#        jeg er logged in som pi paa en af mine Raspberry Pi
$ newssh www-data@www.lorenzen.us
$ raspa create_plot.sh | www dd of=/var/www/www.lorenzen.us/heating_system/plog.jpg
# Generer en jpg fil på min raspberry pi og gemmer den på web-serveren.

Shell-scriptet er i ~/bin/newssh og de nye kommanoder bliver installeret lige ved siden af

#!/bin/sh
# Create a shell-script for remote access for a given host
#
# $ remote_host uptime
# will execute the command uptime on the the host called "remote_host" with requiring passwd
# 
# $newssh -P 222 fantom@somehost.somedomain.dk
# will create a new shell-script called somehost which does: ssh -P 222 fantom@somehost.somedomain.dk
# copies pub-key to the remote host, hence password free after that
#
usage()
{
        echo "newssh  user@host.domain"
        echo "creates ~/bin/host for password-less connection to user@host.domain"
        [ $# = 0 ] || echo "$*"
        exit
}

HOME=`eval echo ~$USER`

PUB_ID="${HOME}/.ssh/id_dsa.pub"
[ -f ${PUB_ID} ] || PUB_ID="${HOME}/.ssh/id_rsa.pub"
[ -f ${PUB_ID} ] || usage "please create public_key: cure ssh-keygen"

if [ `basename $0` = "newssh" ]; then
        USER_HOST=`eval echo \\$$#`
        SHOST=`echo $USER_HOST | cut -f2 -d@`
        CMD=~/bin/$SHOST
        if [ -f ~/bin/$SHOST ]; then
                usage "~/bin/$SHOST exists, cure: rm -f ~/bin/$SHOST"
        else
                # copy public key over
                ssh $* 'D=/etc/dropbear;if [ ! -d $D ];then D=~/.ssh;mkdir -p $D;fi;cat>>$D/authorized_keys;chmod go-rw $D $D/authorized_keys' <$PUB_ID [ $? = 0 ] || usage "ssh failed" if [ $# = 1 -a $SHOST = $USER_HOST ]; then ln -s newssh $CMD else echo "#/bin/sh\nssh $* \$*" > $CMD
                        chmod a+x $CMD
                fi
        fi
        CMD=ssh
else
        CMD="ssh `basename $0`"
fi
exec $CMD $*
This entry was posted in internet, Linux. Bookmark the permalink.