ssh-copy-id e duplicati di authorized_keys


3

Voglio digitare la password solo una volta quando mi collego a SSH, quindi uso ssh-copy-id e installo il mio pubkey in chiavi autorizzate.

Ma non tengo traccia di quali server dispongono già della mia chiave e quali no, quindi a volte emetto di nuovo ssh-copy-id che aggiunge una chiave duplicata a authorized_keys?

  1. Come impedire a ssh-copy-id di installare la chiave quando è già installata?
  2. / * Come rendere l'installazione della chiave automatica e trasparente quando ci si collega a SSH (senza esplicito ssh-copy-id? * /

Risposte:


2

Come impedire a ssh-copy-id di installare la chiave quando è già installata?

Scrivi la tua sceneggiatura. Tutto ciò che ssh-copy-idfa è aggiungere una riga a un file. Quanto segue verificherebbe l'esistenza della chiave:

#!/bin/bash
cat ~/.ssh/id_* | ssh "$@" 'mkdir -pm 0700 ~/.ssh &&
    while read -r ktype key comment; do
        if ! (grep -Fw "$ktype $key" ~/.ssh/authorized_keys | grep -qsvF "^#"); then
            echo "$ktype $key $comment" >> ~/.ssh/authorized_keys
        fi
    done'

Come rendere l'installazione della chiave automatica e trasparente quando ci si connette a SSH (senza esplicito ssh-copy-id?

Non puoi, perché se il server non ha già la tua chiave pubblica, non saprà nemmeno da dove ottenerla.


"Non puoi" -> Posso, è come provare a eseguire "ssh-copy-id" ogni volta prima di connetterti o eseguire automaticamente alcuni comandi dopo la connessione.
Vi.

Bene, puoi correre ssh-copy-idogni volta prima di connetterti, ma IMHO è pigro e inefficace. (Nel mio $ LOCATION, una stretta di mano SSH può richiedere fino a 5 secondi in occasione, ecco perché non mi piace. Copiare la chiave una volta sarebbe sufficiente - ricordati di farlo la prima volta che ti connetti a un nuovo server . (Se gestisci decine o centinaia di server, stai utilizzando il metodo di autenticazione sbagliato.)
gravità

"ricorda solo di farlo la prima volta che ti colleghi a un nuovo server" -> tali cose dovrebbero essere "ricordate" dal computer, non dall'utente.
Vi.

@Vi: Ma solo l'utente sa se la chiave deve essere copiata sul sistema remoto (e se sì, quale chiave: ne ho quattro). Inoltre, dove si deve inserire esattamente la chiave e in quale formato - OpenSSH ne ha una, ma non l'unica (purtroppo RFC 4819 non è molto comune).
Grawity

@Vi: questo hack può funzionare come una ProxyCommandconfigurazione del client SSH.
Grawity

1

Per evitare duplicati, è possibile modificare ssh-copy-id.

L'ho fatto su ssh-copy-id distribuito con il client openssh di Debian, che per me era la versione 1: 6.0p1-4. In breve, ho modificato

cat >> ~/.ssh/authorized_keys

a

t=$(tempfile); cat ~/.ssh/authorized_keys - | sort -u > $t && mv $t ~/.ssh/authorized_keys

Ecco una patch ( diff -c /usr/bin/ssh-copy-id.orig /usr/bin/ssh-copy-id)

*** /usr/bin/ssh-copy-id.orig   2013-02-08 23:18:09.000000000 +0100
--- /usr/bin/ssh-copy-id    2013-12-12 23:14:48.705964476 +0100
***************
*** 41,47 ****
  # strip any trailing colon
  host=`echo $1 | sed 's/:$//'`

! { eval "$GET_ID" ; } | ssh $host "umask 077; test -d ~/.ssh || mkdir ~/.ssh ; cat >> ~/.ssh/authorized_keys && (test -x /sbin/restorecon && /sbin/restorecon ~/.ssh ~/.ssh/authorized_keys >/dev/null 2>&1 || true)" || exit 1

  cat <<EOF
  Now try logging into the machine, with "ssh '$host'", and check in:
--- 41,47 ----
  # strip any trailing colon
  host=`echo $1 | sed 's/:$//'`

! { eval "$GET_ID" ; } | ssh $host 'sh -c "umask 077; mkdir -p ~/.ssh ; t=$(tempfile); cat ~/.ssh/authorized_keys - | sort -u > \$t && mv \$t ~/.ssh/authorized_keys && (test -x /sbin/restorecon && /sbin/restorecon ~/.ssh ~/.ssh/authorized_keys >/dev/null 2>&1 || true)"' || exit 1

  cat <<EOF
  Now try logging into the machine, with "ssh '$host'", and check in:

Per quanto riguarda 2 (rendilo automatico), non puoi, ma se correggi ssh-copy-id per evitare duplicati, non importa se corri ssh-copy-idtroppo.


-1

Sarà http://thinkinginsoftware.blogspot.com/2012/07/avoid-duplicates-in-authorizedkeys.html lavoro per voi? Fondamentalmente il trucco è che prima aggiungi la chiave e dopo elimini tutte le occorrenze della chiave ad eccezione dell'ultima (Dollar + Exclamation Mark):

#! / bin / bash -ex
# ssh-copy-id-uniq.sh

user = $ 1
host = $ 2
publicKey = $ 3
PrivateKey = $ 4

LOCAL_HOST_NAME = `hostname`

USAGE = "Utilizzo:` basename $ 0` "

if [$ # -ne "4"] 
poi
 echo $ USAGE
  uscita 1 
fi

su $ user -c "ssh-copy-id -i $ publicKey $ user @ $ host"
ssh -i $ privateKey $ user @ $ host "sed -i \" \\\ $! {/ $ user @ $ LOCAL_HOST_NAME / d;} \ "~ / .ssh / authorized_keys"

2
Sarebbe più utile se rimuovesse le chiavi in ​​base alla chiave stessa, ma non al commento: il commento potrebbe differire per la stessa chiave. OTOH potrebbero esserci più chiavi con lo stesso commento, che dovrebbero essere conservate.
blueyed

@blueyed: Non sono sicuro di cosa volevi dire, ma ho aggiunto alcuni chiarimenti nel caso in cui il comando sed non sia chiaro. La riga non viene rimossa in base a un commento ma alla combinazione di nome utente e host. Non dovrebbero esserci altre chiavi per quell'utente e quel nome host che concorderemmo.
Nestor Urquiza,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.