SSH uten passord

Fra GNUskole
Hopp til: navigasjon, søk

Det rent tekniske

La oss si du har to maskiner der du ønsker å kunne logge inn fra maskin-A til maskin-B via ssh uten å måtte oppgi passord. Vi antar også at vi har ulike brukernavn på de to maskinene; bruker-A på maskin-A og bruker-B på maskin-B. På maskin-A (som vi skal logge inn fra) genererer vi et nøkkelpar (publick key pair) med kommandoen ssh-keygen. Dette lager et nøkkelpar med en RSA-algoritme for oss. Vi svarer bare med å trykke Enter når vi blir bedt om plassering og "passphrase":

[bruker-A@maskin-A ~]$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/bruker-A/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/bruker-A/.ssh/id_rsa.
Your public key has been saved in /home/bruker-A/.ssh/id_rsa.pub.
The key fingerprint is:
c0:0c:cg:89:17:e9:10:7d:57:38:07:cd:r9:c1:e6:dd bruker-A@maskin-A

Vi har nå to filer i /home/bruker-A/.ssh, id_rsa og id_rsa.pub:

[bruker-A@maskin-A ~]$ ls -l .ssh/id*
-rw-------  1 bruker-A users 1192 nov  9 13:03 .ssh/id_rsa
-rw-r--r--  1 bruker-A users 1115 nov  9 13:03 .ssh/id_rsa.pub

Dette er et såkalt nøkkelpar, der den ene nøkkelen er den private nøkkelen (id_dsa) og den andre er den offentlige nøkkelen (id_dsa.pub). Sistnevnte kopieres så til maskin-B (helst på en sikker måte!) og gis navnet authorized_keys på maskin-B. Hvis det allerede finnes en slik fil fra før, kan innholdet legges til på slutten av filen. Dette kan enten gjøres med klipp og lim, eller med en kommando:

[bruker-A@maskin-A ~]$ scp /home/bruker-A/.ssh/id_rsa.pub bruker-B@maskin-B:/home/bruker-B/.ssh/authorized_keys

Innlogging fra bruker-A på maskin-A til bruker-B på maskin-B skal nå fungere uten passord.

Hva kan man bruke dette til?

Man kan f.eks. lage et lite skript som kjører en kommando på mange maskiner samtidig. Dette skriptet kan du kalle all-do.sh

#/bin/bash
tser="server1 server2 server3 server4"     # IP eller hostnavn på maskiner du skal utføre kommanden på
for ts in $tser
do
    echo $ts                               # Bare for å vite hvilken maskin som svarer hva...
    ssh $ts "$1"
done

Gjør skriptet kjørbart...

$ chmod o+x all-do.sh

...enten kopier det over i /usr/bin eller lag en symbolsk lenke til skriptet i /usr/bin...

$ ln -s /root/all-do.sh /usr/bin/all-do.sh

...så kan du skrive kommandoen hvor som helst.

Nå kan du f.eks. oppgradere alle maskinene ved å skrive...

$ all-do.sh "apt-get update && apt-get dist-upgrade"

Eller du kan få vite lasten på alle maskinene ved å skrive...

$ all-do.sh uptime

Dette kan du gjøre enda mer elegant i et skript som ser slik ut (all-uptime.sh):

#/bin/bash
tser="server1 server2 server3"
for ts in $tser
do
     echo -n $ts                     #-n er med for å ikke lage et nytt linjeskift
     ssh $ts uptime
done

Husk chmod o+x all-uptime.sh

Du kan lage en symbolsk lenke til dette skriptet på alle maskiner ved å skrive....

$ all-do.sh "ln -s /her/ligger/skriptet/all-uptime.sh /usr/bin/all-uptime.sh"

Så er det bare å tenke ut nye og lure ting :-)