Come posso far funzionare ssh-agent su ssh e in tmux (su OS X)?


17

Ho una chiave privata impostata per il mio account github, la passphrase a cui, credo, è memorizzata nel portachiavi di OS X. Non devo certo digitarlo quando apro una finestra del terminale ed entro ssh git@github.com.

Tuttavia, quando eseguo bash su una sessione ssh o localmente all'interno di una sessione tmux, devo digitare la passphrase ogni volta che provo a ssh su github.

Questa domanda suggerisce che esiste un problema simile con lo schermo, ma non capisco davvero il problema abbastanza bene da risolverlo in tmux. C'è anche questa pagina che include una soluzione abbastanza complicata, ma per zsh.

MODIFICA :

In risposta alla risposta di @ Mikel , da un terminale locale ottengo il seguente output:

[~]
$ echo $SSH_AUTH_SOCK
/tmp/launch-S4HBD6/Listeners
[~] 
$ ssh-add -l
2048 [my key fingerprint] /Users/richie/.ssh/id_rsa (RSA)
[~]
$ typeset -p SSH_AUTH_SOCK
declare -x SSH_AUTH_SOCK="/tmp/launch-S4HBD6/Listeners"

Mentre su ssh o in tmux ottengo:

[~]
$ echo $SSH_AUTH_SOCK

[~]
$ ssh-add -l
Could not open a connection to your authentication agent.
[~]
$ typeset -p SSH_AUTH_SOCK
bash: typeset: SSH_AUTH_SOCK: not found

echo $SSH_AGENT_PID non restituisce nulla dalla shell da cui lo eseguo.


Che dire typeset -p SSH_AUTH_SOCK?
Mikel,

@Mikel bash: typeset: SSH_AUTH_SOCK: not founddall'interno di ssh / tmux. Lo proverò localmente stasera, se necessario.
Rich

@Mikel Ho aggiunto l'output di quel comando alla domanda.
Rich

AFAIK, domande e risposte non sono specifiche per OS X. Questo è importante per evitare alcuni duplicati non specifici di X OS, vale a dire superuser.com/q/334975/46794 e superuser.com/q/479796/46794 .
Blaisorblade,

@Blaisorblade Avevo l'impressione che la mia passphrase fosse memorizzata nel portachiavi di OS X (anche se non ricordo ora perché credevo che fosse il caso). È sbagliato?
Rich

Risposte:


4

Il mio collega ha creato alcune funzioni bash per aiutare a trovare un agente dal vivo: https://github.com/wwalker/ssh-find-agent

Lo usa principalmente per la connessione tra sistemi (laptop a desktop, ecc.), Ma lo uso più spesso per sessioni tmux locali in cui ti disconnetti / esegui il login dal tuo gestore di finestre (OS X per me stesso).

uso

  1. Scarica ssh-find-agent.bash ( git clone git://github.com/wwalker/ssh-find-agent.gitfunziona).

  2. Aggiungi quanto segue a ~ / .bashrc:

    . /path/to/ssh-find-agent.bash
    
  3. Quindi è possibile digitare quanto segue per impostare SSH_AUTH_SOCK nella shell corrente:

    set_ssh_agent_socket
    

Ho accettato questa risposta piuttosto che una qualsiasi delle altre che potrebbero funzionare perché non richiede l'inoltro dell'agente SSH, il che è migliore per i miei scopi. Grazie!
Ricco

8

Una soluzione elegante, presa da dagit.o :

Creare ~/.ssh/rc

#!/bin/bash
if [ -S "$SSH_AUTH_SOCK" ]; then
    ln -sf $SSH_AUTH_SOCK ~/.ssh/ssh_auth_sock
fi

Aggiungere a ~/.tmux.conf

set -g update-environment "DISPLAY SSH_ASKPASS SSH_AGENT_PID SSH_CONNECTION WINDOWID XAUTHORITY"
set-environment -g 'SSH_AUTH_SOCK' ~/.ssh/ssh_auth_sock

7

Nel tuo .tmux.conffile di configurazione, aggiungi questa riga:

set -g update-environment "SSH_ASKPASS SSH_AUTH_SOCK SSH_AGENT_PID SSH_CONNECTION"

Questo fa sì che queste variabili d'ambiente vengano copiate dalla shell principale a qualsiasi shell aperta all'interno di tmux, il che consente a ssh-agent di funzionare correttamente all'interno di quelle shell tmux.


2
Questo è il metodo appropriato per ottenere quei valori in una sessione tmux , ma tutte quelle variabili d'ambiente dovrebbero essere già incluse nel valore predefinito di update-environment. L'OP dovrebbe verificarne il update-environmentvalore ed eventualmente aggiornarlo ovunque sia già stato modificato.
Chris Johnsen,

1
Hm .. dopo aver scavato ulteriormente, sono d'accordo - le impostazioni che ho elencato sono già nelle impostazioni predefinite, e se eseguo tmux senza un file .tmux.conf, tutto funziona correttamente. E se rimuovo la riga che ho citato dal mio file .tmux.conf, funziona anche per me, anche se prima. C'è chiaramente qualcos'altro che non va di tanto in tanto. Forse a che fare con la sospensione / il ripristino o il collegamento / il distacco o l'estrazione in una sessione di tmux in remoto. Terrò gli occhi aperti e mi aggiorno se trovo il fattore che lo rende riproducibile.
Trevor Powell,

update-environmentè impostato correttamente. Tuttavia, il problema si verifica ancora.
Rich

2
Il problema è che la configurazione verrà rieseguita solo quando non tmuxè presente alcun server, sfidando lo scopo del ricollegamento ... Forse esiste un parametro della riga di comando per aggiornare nuovamente quelle variabili?
Tobias Kienzler,

3

Mi è successo che i pannelli creati durante la connessione tramite ssh da OS X hanno iniziato a chiedere la mia passphrase dopo un po 'di lavoro ok. Ho trovato un modo per risolvere il problema rubando questa linea da http://santini.di.unimi.it/extras/ph/my-tmux-setup.html

eval $(tmux show-environment -t [YOUR-SESSION] | grep '^SSH_AUTH_SOCK')

Basta eseguirlo dal riquadro che si lamenta.


2

Non sono sicuro se stai usando bash o un'altra shell, ma l'installazione tmux di questo ragazzo sembra che funzionerebbe per bash. Personalmente, sto usando zsh con oh-my-zsh e ho scoperto che ssh-agent ha iniziato a lavorare in tmux dopo aver aggiunto

zstyle :omz:plugins:ssh-agent agent-forwarding on

nel mio file .zshrc e ricaricato la configurazione nelle mie sessioni zsh in esecuzione. Ho anche trovato la soluzione per questo ragazzo orientata allo zsh , ma si è rivelata superflua per me.


1

Cosa fa:

echo $SSH_AUTH_SOCK
echo $SSH_AGENT_PID
ssh-add -l

Stampa?

Eseguilo nel tuo normale terminale, quindi eseguilo all'interno della tua tmuxsessione. Dovrebbero stampare la stessa cosa.


Ho aggiunto la risposta a questi comandi alla domanda. Mi sono anche reso conto che il problema si verifica anche quando eseguo l'accesso tramite ssh (senza usare tmux) e ho modificato la domanda di conseguenza.
Rich

4
sshè facile. Attiva l'inoltro agente. Viene eseguito ssh -Ainvece il modo più semplice per farlo ssh. Usa un alias in modo da non doverlo digitare ogni volta o inserirlo nel tuo .SSH/config.
Mikel,

Figo, grazie. Ha funzionato per ssh. Qualche idea su come risolverlo in tmux?
Ricco

0

Esistono molte soluzioni, ma la più semplice si trova nella risposta di Hans Ginzel, datata 8 gennaio 2016, a una domanda StackOverflow correlata del 27 gennaio 2014 . Aggiungi semplicemente quanto segue alla tua shell ~/.profileo simili:

alias ssh='eval $(tmux show-env -s | grep "^SSH_") && ssh'

Non è necessario definire funzioni multilinea o creare nuovi file temporanei. Se non si desidera alias ssh, è sufficiente modificarlo fixsshe rimuoverlo && sshalla fine ed eseguirlo fixsshogni volta che si tenta di eseguire sshda una sessione tmux ricollegata.

La risposta di Hans Ginzel suggerisce che per funzionare è necessaria una "versione più recente" di tmux show-env -s. Questo funziona per me in tmux 2.7, e sulla mia lettura del changelog , -sè stato aggiunto del 3 giugno 2008 poco prima del rilascio di tmux 0.3. tmux 2.3 (29 settembre 2016) è nella stalla Debian.

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.