Perché ssh-agent non salva la mia chiave non crittografata per un uso successivo?


12

Ogni volta che accedo a un altro server dal nostro server Ubuntu senza testa mi viene richiesta la password per il mio file chiave. Anche se in precedenza mi sono connesso al server.

Hai idea del perché questo forse? Potrebbe essere qualcosa di semplice come ssh-agentnon in esecuzione o qualcosa del genere.

La stessa chiave sul mio desktop Ubuntu Gnome funziona bene. Sia il server che il desktop eseguono Ubuntu 10.10.

ps -ef | grep '[s]sh-agent'
simon     3219     1  0 12:46 ?        00:00:00 ssh-agent

1
Innanzitutto, come hai detto, controlla se ssh-agentè in esecuzione:ps -ef | grep '[s]sh-agent'
Scott Severance

@mssever Sì, sembra essere. Vedi domanda aggiornata.
Treffynnon,

Risposte:


10

Anche se l'agente è attivo, se alcune variabili di ambiente non sono impostate, non si fa riferimento all'agente. Inoltre, anche se tutto va bene, agente e variabili, l'identità non viene inviata automaticamente all'agente: è un'attività per ssh-askpass, che funziona solo nelle sessioni X.

Se stai usando bash, crea il file ~/.bash_profilecon questo contenuto:

# File: ~/.bash_profile

# source ~/.profile, if available
if [[ -r ~/.profile ]]; then
  . ~/.profile
fi

# start agent and set environment variables, if needed
agent_started=0
if ! env | grep -q SSH_AGENT_PID >/dev/null; then
  echo "Starting ssh agent"
  eval $(ssh-agent -s)
  agent_started=1
fi

# ssh become a function, adding identity to agent when needed
ssh() {
  if ! ssh-add -l >/dev/null 2>&-; then
    ssh-add ~/.ssh/id_dsa
  fi
  /usr/bin/ssh "$@"
}
export -f ssh

# another example: git
git() {
  if ! ssh-add -l >/dev/null 2>&-; then
    ssh-add ~/.ssh/id_dsa
  fi
  /usr/bin/git "$@"
}
export -f git

modifica il nome del file in base alle ~/.ssh/id_dsatue esigenze e aggiungi questa riga a~/.bash_logout

# stuff to add at end of ~/.bash_logout
if ((agent_started)); then
  echo "Killing ssh agent"
  ssh-agent -k
fi

Un'ultima nota: questo non interferisce con una sessione di gnome, perché in quel caso ~/.profileè solo di provenienza, e puoi beneficiare ssh-askpassdell'interfaccia grafica che richiede una passphrase e la invia alla ssh-agent.


Grazie a @enzotib funziona alla grande per essere sshinserito in altre macchine. Ma non lo fa quando si utilizza gitper spingere o estrarre un repository pubblico. Hai qualche idea su come potrei risolverlo?
Treffynnon,

Aggiungi una funzione identica a ssh(), chiamala git()e cambia l'ultima riga da /usr/bin/ssha /usr/bin/git. Inoltre, aggiungi una riga finale con export -f git.
enzotib,

@enzotib L'ho provato, ma ora quando sshentro nella macchina con il bash_profilefile che hai creato sopra l'installazione mi chiede la password della chiave. Per qualche motivo ora ogni volta che ho scritto in ssh chiede anche prima di aver eseguito ssho git. Vedere gist.github.com/942082 per il prompt Ricevo quando eseguo l'accesso al computer incriminato.
Treffynnon,

@Treffynnon: non so esattamente come gitinteragire con ssh, e non lo uso in gitmodo da non poter provare. Ho modificato il ~/.bash_profileper includere la git()funzione che ho menzionato sopra, per essere sicuro che la mia spiegazione precedente fosse chiara. Inoltre, dall'output che mostra che hai modificato la macchina server sembra che tutti i miei consigli fossero diretti solo alla macchina client.
enzotib,

@enzotib È corretto. Il server a cui accedo diventa il mio client quando gitspingo in una fucina / repository centrale da esso in modo che il file sia nel posto giusto. Penso che tu mi abbia appena dato il suggerimento / fatto jogging i miei pensieri. Ho un prompt bash speciale che mostra il ramo git di pwd. Scommetto che è ciò che sta innescando la richiesta di password al login bash mentre tenta di accedere a stat prima di eseguire il rendering del prompt di bash!
Treffynnon,

2

Di recente ho iniziato a usare ssh-ident:

https://github.com/ccontavalli/ssh-ident

tutto quello che devi fare è aggiungere qualcosa come:

alias ssh="/path/to/ssh-ident"

nel tuo .bashrc. In alternativa, puoi ln -s /path/to/ssh-ident ~/bin/ssho qualche altra directory nel tuo PERCORSO prima /bine /usr/bin.


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.