Magit, come usare l'agente ssh di sistema e non chiedere la password


19

Ho cercato su Google e letto le FAQ e Wiki per Magit, ma non riesco ancora a capirlo, tutto quello che trovo sono le risposte su Windows ...

Come posso configurare Magit per usare la mia sessione ssh-agent in esecuzione e non chiedere la mia password quando faccio un push.

Sto eseguendo Linux e ho l'avvio ssh-agent con il mio terminale e quindi sblocco la mia chiave, il che mi permette di fare git push, ecc. Senza farmi inserire la password ogni volta.

Env:
Arch Linux
Emacs 24.4

ssh-agent con le chiavi aggiunte, per sbloccare il primo terminale aperto.

EDIT: intendevo usare passphrase, sai per il tasto ssh, et al.
E sto spingendo su Bitbucket, ma credo che il problema chiave sia che Magit non stia parlando / riconoscendo il mio agente ssh.
Forse c'è qualche configurazione da impostare, per dirlo che lo sto eseguendo ??


In realtà è arrivata la stessa domanda.
— emacsomancer

Qual è l'URL remoto? http: // o git: //?
— Nsukami _

git@bitbucket.org in questo caso, impostare in questo modo: url = git@bitbucket.org:
— Andres

Puoi dirci cosa restituisce Emacs quando lo fai M-x getenv SSH_AGENT_PID? M-x getenv SSH_AUTH_SOCK
— Nsukami _

SSH_AGENT_PID = 602 SSH_AUTH_SOCK = /tmp/ssh-13kI6AaYvgji/agent.601
— Andres

Risposte:


13

Bene, questo si è rivelato più una tana del coniglio di quanto pensassi ... E per quello che posso raccogliere non c'è una soluzione migliore per questo problema specifico, con questa combinazione di desktop, ssh-agent, emacs.

Problema 1
XFCE stava avviando il proprio agente ssh con la sessione, senza dirlo da nessuna parte, il che ha causato al sistema 1 agente ssh globale inutilizzato e il mio agente sbloccato specifico della shell.
Su un DE diverso potresti eseguire lo stesso problema e dovrai trovare i dettagli per disabilitare l'avvio automatico dell'agente.

Soluzione 1
Eseguire questo comando per disabilitare l'esecuzione dell'agente ssh-agent

xfconf-query -c xfce4-session -p /startup/ssh-agent/enabled -n -t bool -s false

Problema 2
Ora Emacs non ha alcuna variabile SSH_AGENT_PID e SSH_AUTH_SOCK impostata, quindi nulla sull'ambiente caricato. Ovviamente Magit richiede ancora la chiave in quanto non è a conoscenza del nuovo agente ssh che abbiamo avviato.

Soluzione 2
Dobbiamo fare in modo che Emacs recuperi queste nuove variabili dall'ambiente, ma ovviamente non c'è modo semplice.
Immettere: exec-path-from-shell che consente di recuperare variabili di ambiente dalla shell. Così.

  1. Installa il pacchetto exec-path-from-shell nel modo che preferisci.
  2. Aggiungi il seguente codice a init.el in modo che si carichi all'avvio di Emacs.

(require 'exec-path-from-shell) (exec-path-from-shell-copy-env "SSH_AGENT_PID") (exec-path-from-shell-copy-env "SSH_AUTH_SOCK")

Grazie ragazzi per il suggerimento di guardare le variabili SSH _ **, che mi hanno indicato la giusta direzione.


Qualche motivo particolare per cui non sei soddisfatto dell'agente di XFCE e vuoi gestirlo da solo? L'abbandono sembrerebbe la soluzione più semplice.
— Tripleee

Non eseguo sempre XFCE, né mi interessa come lo gestisce il desktop, preferisco il plugin che lo gestisce da oh-my-zsh. Quindi è più facile per me saltare il caso d'uso predefinito. (scontato, non so quasi abbastanza sull'agente ... ma non è qualcosa a cui voglio davvero passare del tempo a pensare comunque)
— Andres

Forse Zsh dovrebbe riconoscere il caso in cui un agente è già in esecuzione e rimandare invece a quello; ma ovviamente, questo sta diventando fuori tema qui.
— Tripleee

1
Forse ssh-agency dovrebbe essere estesa per funzionare anche su sistemi unix-like.
— npostavs,

7

Un'altra soluzione per i pigri è semplicemente usare un pacchetto che gestisca esattamente questo caso (impostando le variabili d'ambiente relative al portachiavi di Emacs):

  1. Installa e aggiungi al pacchetto init.el keychain-environment .
  2. Esegui M-x keychain-refresh-environmente ora dovrebbe funzionare.
  3. Inserisci (keychain-refresh-environment)in init.el, in modo che la soluzione funzioni dopo il riavvio di Emacs

E questo è tutto, supponendo che il tuo ssh-agent sia configurato e funzionante.

Descrizione davvero buona, dal commento del pacchetto:

Keychain è uno script che gestisce ssh-agent e gpg-agent. In genere viene eseguito dal file di inizializzazione della shell. Permette alle tue shell e ai lavori cron di condividere un singolo agente ssh e / o agente gpg.

Quando il portachiavi viene eseguito, verifica l'esecuzione dell'agente, altrimenti li avvia. Salva le variabili di ambiente degli agenti in file all'interno di ~ / .keychain /, in modo che le shell successive possano generare questi file.

Quando Emacs viene avviato in X11 e non direttamente da un terminale, queste variabili non vengono impostate. Questa libreria cerca questi file creati dal portachiavi e quindi imposta le variabili di ambiente di Emacs di conseguenza. In realtà non esegue il portachiavi, quindi devi prima eseguirlo da una shell di accesso.

Per usare esegui la funzione `keychain-refresh-environment 'nel tuo file init. Se il portachiavi non è stato ancora eseguito all'avvio di Emacs, puoi anche chiamare in modo interattivo quella funzione.

Vedi anche: http://www.funtoo.org/wiki/Keychain


1
Questo è esattamente ciò di cui avevo bisogno poiché lo uso già keychain.
— xji,

1

FWIW, keychainora ha un --systemdinterruttore, che inietterà le variabili nell'ambiente utente systemd.

La soluzione più semplice che ho trovato è stata quella di aggiungere eval "$(keychain --eval --quiet --noask --systemd keys...)"uno script eseguito dall'unità systemd per avviare il server Emacs.

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.