Come aggiungere in modo permanente una chiave privata con ssh-add su Ubuntu? [chiuso]


474

Ho una chiave privata protetta con una password per accedere a un server tramite SSH.

Ho 2 macchine linux (ubuntu 10.04) e il comportamento del comando ssh-add è diverso in entrambi.

In una macchina, una volta che utilizzo "ssh-add .ssh / identity" e ho inserito la mia password, la chiave è stata aggiunta in modo permanente, cioè ogni volta che spengo il computer e accedo di nuovo, la chiave è già aggiunta.

Nell'altro, devo aggiungere la chiave ogni volta che eseguo l'accesso.

Per quanto mi ricordo, ho fatto la stessa cosa su entrambi. L'unica differenza è che la chiave è stata creata su quella che viene aggiunta in modo permanente.

Qualcuno sa come aggiungerlo permanentemente anche all'altro computer?


1
l'agente deve essere solo temporaneo; ma è possibile che tu abbia il comando ssh-add da qualche parte in ~ / .bashrc o giù di lì su una di entrambe le macchine
mirek,

Risposte:


632

Una soluzione sarebbe quella di forzare la conservazione permanente dei file chiave, aggiungendoli nel ~/.ssh/configfile:

IdentityFile ~/.ssh/gitHubKey
IdentityFile ~/.ssh/id_rsa_buhlServer

Se non si dispone di un file 'config' nella directory ~ / .ssh, è necessario crearne uno. Non ha bisogno dei diritti di root, quindi semplicemente:

nano ~/.ssh/config

... e inserisci le righe sopra secondo le tue esigenze.

Affinché ciò funzioni, il file deve avere chmod 600. È possibile utilizzare il comando chmod 600 ~/.ssh/config.

Se si desidera che tutti gli utenti del computer utilizzino la chiave, inserire queste righe /etc/ssh/ssh_confige la chiave in una cartella accessibile a tutti.

Inoltre, se si desidera impostare la chiave specifica per un host, è possibile effettuare le seguenti operazioni in ~ / .ssh / config:

Host github.com
    User git
    IdentityFile ~/.ssh/githubKey

Questo ha il vantaggio quando hai molte identità che un server non ti rifiuta perché hai provato prima le identità sbagliate. Verrà provata solo l'identità specifica.


82
Le autorizzazioni per il file di configurazione dovrebbero essere 600.chmod 600 config
generalopinion

6
Devo inserire la mia password per ogni push, recupero o clone con questo, come posso evitarlo?
Asaf,

9
Usa invece ssh-add ~/.ssh/gitHubKey, ricorderà la tua frase chiave. La soluzione che ho proposto era di impostarlo in modo permanente su tutti i riavvii.
daminetreg,

28
Questa risposta è così buona che non dovrebbe esistere ssh-add. Chi vuole avere un comando che "temporaneamente" risolve un problema e si interrompe inaspettatamente quando puoi semplicemente modificare un file di configurazione in modo permanente.
RussellStewart,

2
Il problema è con questo tipo di configurazione, se non lo fai in .ssh / config per un host specifico, avrai tutte le chiavi provate su tutti i server ogni volta.
daminetreg,

118

Questo non ha risposto allo stesso problema per me su Mac OS X Lion. Ho finito per aggiungere:

ssh-add ~/.ssh/id_rsa &>/dev/null

Per il mio .zshrc (ma anche .profile andrebbe bene), che sembra averlo corretto.

(Come suggerito qui: http://geek.michaelgrace.org/2011/09/permanently-add-ssh-key-ssh-add/ )


6
Penso che sia meglio della soluzione che ho proposto, perché ssh-add utilizza un agente di autenticazione in grado di ricordare la passphrase di una chiave privata protetta, quindi non è necessario digitarla ogni volta che si tenta di autenticarsi. Un altro vantaggio della soluzione che proponi è che se hai molte chiavi, il client ssh non proporrà chiavi irrilevanti per il server a cui provi a connetterti, anzi fornirà solo le chiavi che sono per questo server, e vincerà ' t porta al server a rifiutare la connessione a causa del raggiungimento di MaxAuthTries, mentre prova tutte le chiavi elencate in ssh / config.
daminetreg,

1
Grazie @daminetreg. Il mio problema particolare era la necessità di accedere alla gitosi su una macchina di sviluppo senza trasferire ad essa la mia chiave privata. Questa soluzione (insieme all'aggiunta ForwardAgent yesalla mia .ssh/config) ha risolto il problema in modo fantastico. A quanto pare, potrebbe essere proprio ssh-add &>/dev/nullcome il comportamento predefinito di ssh-addsembra essere quello di aggiungere le chiavi che trova nella tua .sshcartella.
Aaron,

1
La mia comprensione è che esiste un interruttore -K in Mac OS: stackoverflow.com/questions/1909651/…
Nicu Tofan,

3
@TNick -Kaggiunge le chiavi al portachiavi di OS X, che le GUI di OS X usano per autenticarsi su server stranieri. Il poster in quella Q si sta connettendo attraverso un tunnel SSH, ma si sta ancora connettendo a un server remoto. A - [SSH Tunnel] -> B Il caso in cui mi trovo è che sono su un server remoto ma voglio che l'autenticazione sia contro le credenziali sul mio sistema di casa. A <- [Auth] - B - [Connect] -> C Quindi in -Krealtà non aiuta, ma è un'ottima soluzione per l'altro Q.
Aaron

112

Ho risolto quel problema su Mac OSX (10.10) usando l'opzione -K per ssh-add:

ssh-add -K ~/.ssh/your_private_key

Per macOS 10.12 e versioni successive è necessario modificare ulteriormente la configurazione di ssh come descritto qui: https://github.com/jirsbek/SSH-keys-in-macOS-Sierra-keychain


3
questa è una risposta migliore per le persone che vogliono impostarla in modo permanente
punkrockpolly

12
Quindi questo bit: "su Mac OSX (10.10)" ...
Andrew K.

1
Questo è buono e funziona su Mac OSX, ma non funziona su Ubuntu (14.04 sui miei test).
haxpor,

5
Questo non ha funzionato per me (su OSX 10.12.4)
guptron,

2
Secondo man ssh-addmacOS High Sierra, ssh-add -Ksalverà la passphrase nel portachiavi e, dopo il riavvio, basta usare ssh-add -A, che non ha bisogno di inserire la passphrase.
DawnSong

36

Basta aggiungere il portachiavi, come indicato in Suggerimenti rapidi per Ubuntu https://help.ubuntu.com/community/QuickTips

Che cosa

Invece di avviare costantemente ssh-agent e ssh-add, è possibile utilizzare il portachiavi per gestire le chiavi ssh. Per installare il portachiavi, puoi semplicemente fare clic qui o utilizzare Synaptic per fare il lavoro o apt-get dalla riga di comando.

Riga di comando

Un altro modo per installare il file è aprire il terminale (Applicazione-> Accessori-> Terminale) e digitare:

sudo apt-get install keychain

Modifica file

Dovresti quindi aggiungere le seguenti righe al tuo $ {HOME} /. Bashrc o /etc/bash.bashrc:

keychain id_rsa id_dsa
. ~/.keychain/`uname -n`-sh

Cosa fa esattamente il secondo comando, per curiosità? questo apre solo le autorizzazioni per l'utente corrente?
Vincent Buscarello,

1
Questo .è un alias persource
Brad Solomon, il

18

Ho provato la soluzione di @ Aaron e per me non ha funzionato, perché aggiungerebbe nuovamente le mie chiavi ogni volta che aprissi una nuova scheda nel mio terminale. Quindi l'ho modificato un po '(nota che la maggior parte delle mie chiavi sono anche protette da password, quindi non posso semplicemente inviare l'output a / dev / null):

added_keys=`ssh-add -l`

if [ ! $(echo $added_keys | grep -o -e my_key) ]; then
    ssh-add "$HOME/.ssh/my_key"
fi

Ciò che fa è che controlla l'output di ssh-add -l(che elenca tutte le chiavi che sono state aggiunte) per una chiave specifica e se non la trova, la aggiunge con ssh-add.

Ora la prima volta che apro il mio terminale mi vengono chieste le password per le mie chiavi private e non mi viene più chiesto fino al riavvio (o al logout - non ho controllato) il mio computer.

Dato che ho un sacco di chiavi, memorizzo l'output di ssh-add -luna variabile per migliorare le prestazioni (almeno credo che migliori le prestazioni :))

PS: sono su Linux e questo codice è andato al mio ~/.bashrcfile - se sei su Mac OS X, suppongo che dovresti aggiungerlo a .zshrco.profile

EDIT: Come sottolineato da @Aaron nei commenti, il .zshrcfile viene utilizzato dalla zshshell - quindi se non lo stai usando (se non sei sicuro, molto probabilmente, stai usando bashinvece), questo codice dovrebbe vai al tuo .bashrcfile.


3
.zshrcè per la zshshell, che uso al posto di bash. Se stai usando bashsu Mac OS X (impostazione predefinita), sarebbe .bashrcpresente anche lì.
Aaron,

1
Dopo il ssh-add -lcodice di ritorno echo $?può essere utilizzato per decidere se aggiungere la chiave o meno. Sono la mia macchina linux con bash, ssh-add -lnon emetterà il nome del file chiave. Il codice di ritorno funziona sempre.
Bharat G,

12

Nel mio caso la soluzione era:

Le autorizzazioni per il file di configurazione dovrebbero essere 600. chmod 600 config

Come menzionato nei commenti sopra da Generalopinion

Non è necessario toccare il contenuto del file di configurazione.


Non era abbastanza per me su Linux Mint 17.1.
Benares,

Non credo che 600 abbia senso. man ssh ci dice che il ~/.ssh/configfile è in lettura / scrittura per l'utente e non è scrivibile da altri.
DawnSong

600 viene letto e scritto solo per l'utente
Enthusiasmus

6

Ho avuto lo stesso problema su Ubuntu 16.04: alcune chiavi sono state aggiunte in modo permanente, per altre ho dovuto eseguire ssh-addogni sessione. Ho scoperto che le chiavi aggiunte in modo permanente avevano sia la chiave privata che pubblica ~/.sshe le chiavi che erano state dimenticate in ogni sessione avevano solo le chiavi private in ~/.sshdir. Quindi la soluzione è semplice: è necessario copiare sia la chiave privata che pubblica ~/.sshprima di eseguire ssh-add.

PS: Per quanto ne so dal wiki di Gnome, il mio metodo funziona grazie allo strumento gnome-keyring che fa parte di Gnome Desktop Environment. Pertanto, il mio metodo dovrebbe probabilmente funzionare solo se usi DE basato su Gnome o Gnome.


1
Risposta sottovalutata. Ciò ha risolto il mio problema senza la necessità di ulteriori script o pacchetti dopo aver cercato per due ore.
Etagenklo,

Flarkin favoloso! Ottimo lavoro investigativo. Non penso che l'avrei capito.
Nicorellius,

4

L'aggiunta delle seguenti righe in "~ / .bashrc" ha risolto il problema per me. Sto usando Ubuntu 14.04 desktop.

eval `gnome-keyring-daemon --start`
USERNAME="reynold"
export SSH_AUTH_SOCK="$(ls /run/user/$(id -u $USERNAME)/keyring*/ssh|head -1)"
export SSH_AGENT_PID="$(pgrep gnome-keyring)"

3

Su Ubuntu 14.04 (forse prima, forse ancora) non hai nemmeno bisogno della console:

  • avvia seahorseo avvia quella cosa che trovi cercando "chiave"
  • crea lì una chiave SSH (o importane una)
    • non è necessario lasciare vuota la passphrase
    • ti viene offerto anche di inviare la chiave pubblica a un server (o più)
  • finirai con un agente ssh in esecuzione e questa chiave caricata, ma bloccata
  • usando sshraccoglierà l'identità (cioè la chiave) attraverso l'agente
  • al primo utilizzo durante la sessione, la passphrase verrà controllata
    • e hai la possibilità di sbloccare automaticamente la chiave all'accesso
    • ciò significa che l'autenticazione di accesso verrà utilizzata per racchiudere la passphrase della chiave
  • Nota: se si desidera inoltrare la propria identità (vale a dire l'agente-forwarding) invoke tuo sshcon -Ao fare che il default
    • in caso contrario non è possibile eseguire l'autenticazione con quella chiave su una macchina alla quale si accede successivamente a una terza macchina

3

Eseguo Ubuntu usando due chiavi id_rsa. (uno personale per lavoro). ssh-add ricorderebbe una chiave (una personale) e ne dimenticherebbe una ogni volta.

Controllando la differenza tra i due ho visto che la mia chiave personale aveva 400 diritti mentre quella dell'azienda aveva 600 diritti. (aveva u + w). Rimuovendo la scrittura dell'utente direttamente dalla chiave aziendale (uw o impostata su 400) il problema è stato risolto. ssh-add ora ricorda entrambe le chiavi.


2

Questo ha funzionato per me.

ssh-agent /bin/sh
ssh-add /path/to/your/key

1

molto semplici ^ _ ^ due passaggi

1.yum installa portachiavi

2. aggiungere il codice seguente in .bash_profile

/usr/bin/keychain $HOME/.ssh/id_dsa
source $HOME/.keychain/$HOSTNAME-sh

12
Ubuntu non ha yum sciocco;)
Adam F,

1

Per quelli che usano Fish shell è possibile utilizzare la seguente funzione, quindi chiamarla in ~/.config/fish/config.fisho in un file di configurazione separato in ~/.config/fish/conf.d/loadsshkeys.fish. Caricherà tutte le chiavi che iniziano con id_rsa in ssh-agent.

# Load all ssh keys that start with "id_rsa"
function loadsshkeys
  set added_keys (ssh-add -l)
   for key in (find ~/.ssh/ -not -name "*.pub" -a -iname "id_rsa*")
    if test ! (echo $added_keys | grep -o -e $key)
      ssh-add "$key"
    end
  end
end

# Call the function to run it.
loadsshkeys

Se vuoi che l' ssh-agentauto venga avviata quando apri un terminale puoi usare tuvistavie / fish-ssh-agent per farlo.

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.