2010-07-14 11 views
7

Sto usando GNU Emacs sul mio netbook di Ubuntu in modalità a schermo intero. Quando modifico i file che sono sotto controllo di versione e colpisco C-x v v per impegnare le ultime modifiche, si aprirà una finestra popup OpenSSH e mi chiederà la mia password per il server su cui risiede il mio repository.Emacs/CVS/OpenSSH: prevenzione password popup

Sfortunatamente, a causa della modalità a schermo intero, la finestra popup non verrà visualizzata e non posso inserire la mia password. Ma è ancora in qualche modo modale, quindi non posso nemmeno tornare a emacs e, diciamo, lasciare la modalità a schermo intero (o fare qualsiasi altra cosa, come C-g). Sono fondamentalmente intrappolato.

Come utente di emacs, trovo comunque l'idea di finestre popup disgustose ;-) idealmente, mi piacerebbe ricevere la password ssh nel minibuffer. Come posso modificare il mio setup per farlo accadere? (Preferisco inserire la mia password ogni volta invece di memorizzare una coppia di chiavi in ​​~/.ssh /).

+0

Hai aggiunto una taglia, ma non hai mai risposto a nessuno dei suggerimenti che le persone hanno fatto la prima volta. Non sappiamo se hai tentato anche quelle soluzioni. – phils

+0

@phils: buon punto (ho commentato su uno, però). La tua risposta era un buon suggerimento, ma non era esattamente una risposta alla mia domanda. Penso che la risposta di sanityinc, che tu hai fortemente commentato, (grazie per questo), stia andando nella giusta direzione. Non è una "soluzione" però. – Thomas

risposta

7

È possibile utilizzare ssh-agent prima di avviare emacs (o in un'altra shell).

+0

Il poster originale preferisce immettere le password per l'utilizzo dell'autenticazione basata su chiave. Tuttavia sono d'accordo che ssh-agent e le coppie di chiavi sono la soluzione migliore. – stsquad

1

Sto speculando qui, poiché non uso CVS o vc in Emacs, tuttavia presumo che Emacs stia eseguendo il bombardamento con il programma appropriato per eseguire il commit e la richiesta della password sia qualcosa di completamente esterno a Emacs. Quindi sospetto che ciò che si vuole fare sia scoprire quali sono le opzioni necessarie per eseguire un commit senza GUI dalla shell senza Emacs, e quindi modificare vc-checkin-switches (o definire vc-cvs-checkin-switches) in Emacs in modo che corrisponda (vedere defun vc-switches).

1

Probabilmente è il programma ssh-askpass a dare il via, e penso che consideri la variabile d'ambiente DISPLAY per decidere come richiedere la password. Se impostato, visualizza una finestra grafica e, in caso contrario, chiede al TTY.

Se il sottosistema VCS rileva quando le password vengono richiesti da parte dell'utente (che è probabile), allora è possibile che si può disinserire $ DISPLAY per sottoprocessi:

(setenv "DISPLAY" nil) 

Questo potrebbe avere altri effetti collaterali negativi, tuttavia, controlla anche "man ssh-askpass" nel caso in cui qualcosa possa aiutare.

:

+0

È possibile utilizzare consigli o ganci per applicarlo solo al codice necessario. Vedo che 'vc-before-checkin-hook' e' vc-checkin-hook' (after) sono definiti, ma immagino che avresti bisogno di farlo per più di un semplice commit? Per (solo) il caso di 'Cx vv', il seguente consiglio lo coprirà: ' (defadvice vc-next-action (attorno a my-ssh-prompt-fix-per-vc-azione successiva attiva) (let ((backup (getenv "DISPLAY"))) (setenv "DISPLAY" nil) ad-do-it (setenv "DISPLAY" backup))) ' – phils

+0

Se l'ambiente in cui cvs viene eseguito influisce su questo, quindi su un'altra opzione sarebbe quello di superare il comando cvs. 'vc-cvs-command' hard-codes" cvs "come comando e lo passa a' vc-do-command', quindi un'opzione sarebbe scrivere uno script wrapper per cvs (al di fuori di Emacs) per eseguire il comando reale in un ambiente modificato. Ciò potrebbe influenzare le chiamate non-Emacs verso cvs, quindi potresti nominare il wrapper qualcosa di diverso da "cvs" e creare qualche consiglio prima di 'vc-do-command' per cambiare il valore del suo comando' comando' per farlo corrispondere quando è "cvs". – phils

+0

o forse basta usare l'approccio di consulenza dal mio primo commento su 'vc-do-command' invece di' vc-next-action'? – phils

1

È possibile ottenere ssh di multiplex tutte le nuove connessioni a un server tramite connessioni esistenti (Diniego Io personalmente uso una soluzione basata su ssh-agent, che vi consiglio vivamente.). Ciò significa che fino a quando si è aperta una connessione SSH (ad esempio in una shell) i nuovi nello stesso host remoto non chiederanno una password. Io uso

Host * 
    ControlPath ~/.ssh/master-%[email protected]%h:%p 
    ControlMaster auto 
    ServerAliveInterval 30 

in ~/.ssh/config per impostare questo.

+0

Tecnica fantastica, ma non esattamente quello che sto cercando qui. Ma comunque buono a sapersi! – Thomas

1

Prova a impostare questo nel vostro ambiente in qualche modo:

export CVS_RSH='ssh -o PreferredAuthentications="password"' 

Questo dovrebbe farlo per fermare il tentativo di autenticazione publickey, che sarà anche sopprimere la visualizzazione del grafico di ssh-askpass. Funziona specificando il comando SSH che CVS utilizzerà per la connessione al server remoto. Si noti che questo si applica a tutti i comandi CVS eseguiti dal contesto in cui si imposta la variabile di ambiente.

Si potrebbe anche voler impostare l'impostazione nel vostro ~/.ssh/config. È possibile impostare le opzioni per ciascun host separatamente. Here's a page that roughly shows how, sebbene per forzare l'autenticazione publickey. Tieni presente che ciò influirà sull'utilizzo di SSH per il tuo account utente, non solo per CVS.Potrebbe essere proprio quello che stai cercando, dal momento che sembra preferisci evitare l'autenticazione publickey. Ecco un esempio del blocco che ci si aggiunge in ~/.ssh/config:

Host cvs 

    Hostname cvs.your.corp 
    User yourCVSusername 
    PreferredAuthentications password 

In alternativa, è possibile modificare Host cvs-Host cvs.your.corp se il metodo di accesso al questo utilizza un nome di dominio completo invece di un nome host esistente.

Infine, si potrebbe avere il file ~/.ssh/config da solo questa linea (o aggiungerlo alla parte superiore del vostro esistente):

PreferredAuthentications password 

che renderanno la preferenza si applicano a tutte le connessioni SSH a host remoti .

Buona fortuna. Spero che questo ti faccia uscire dalla trappola del dialogo modale.

+0

Grazie, ma non sto usando SVN. – Thomas

+0

La stessa soluzione funziona per CVS, semplicemente impostando la variabile di ambiente 'CVS_RSH' invece della variabile' SVN_SSH'. Ho aggiornato la risposta per riflettere questo. Si noti che la seconda soluzione, modificando '~/.ssh/config', funzionerà per tutti i programmi che usano SSH, anche se non supportano variabili di ambiente come' CVS_RSH' e 'SVN_RSH' – justis

+0

Ho anche aggiunto degli esempi per seconda soluzione. – justis

1

Durante la ricerca della mia risposta principale (sopra), mi sono imbattuto in psvn per emacs. Vedi questa domanda/risposta SO per ulteriori dettagli: SVN for Emacs: how do you set author name and save password?

Ho pensato che potresti anche apprezzare sapere di psvn, ma penso che quello sull'impostazione del valore PreferredAuthentications su SSH sia più direttamente applicabile alla domanda che hai originariamente chiesto.