2010-07-14 19 views
7

Estoy usando GNU Emacs en mi netbook Ubuntu en modo pantalla completa. Cuando edito archivos que están bajo control de versión y presiono C-x v v para confirmar los cambios más recientes, se abre una ventana emergente de OpenSSH y me pide mi contraseña para el servidor en el que vive mi repositorio.Emacs/CVS/OpenSSH: prevención de contraseña emergente

Desafortunadamente, debido al modo de pantalla completa, la ventana emergente no aparecerá en primer plano y no puedo ingresar mi contraseña. Pero sigue siendo modal, por lo que tampoco puedo volver a emacs y, por ejemplo, abandonar el modo de pantalla completa (o hacer cualquier otra cosa, como C-g). Estoy básicamente atrapado.

Como usuario de emacs, me parece asquerosa la idea de tener ventanas emergentes ;-) así que, idealmente, me gustaría que me pidieran la contraseña de ssh en el minibúfer. ¿Cómo puedo modificar mi configuración para que eso suceda? (Prefiero escribir mi contraseña cada vez en lugar de almacenar un par de claves en ~/.ssh /).

+0

Agregaste una recompensa, pero nunca respondiste a ninguna de las sugerencias que la gente hizo la primera vez. No sabemos si incluso intentó esas soluciones. – phils

+0

@phils: Buen punto (sí comenté en uno). Tu propia respuesta fue una buena pista, pero no fue exactamente una respuesta a mi pregunta. Creo que la respuesta de sanityinc, que usted también comentó en gran medida (gracias por eso), va en la dirección correcta. Sin embargo, no es una "solución". – Thomas

Respuesta

7

Puede usar ssh-agent antes de iniciar emacs (o en otro shell).

+0

El póster original prefiere ingresar contraseñas para usar la autenticación basada en clave. Sin embargo, estoy de acuerdo con que ssh-agent y los pares de claves son la mejor solución. – stsquad

1

Estoy especulando aquí, ya que no uso CVS o vc dentro de Emacs, sin embargo, supongo que Emacs está desgravando al programa apropiado para realizar la confirmación, y la solicitud de contraseña es algo totalmente externo a Emacs. Así que sospecho que lo que quieres hacer es, en primer lugar, descubrir qué opciones se necesitan para hacer una confirmación sin GUI desde tu shell sin Emacs, y luego modificar vc-checkin-switches (o definir vc-cvs-checkin-switches) en Emacs para que coincida (ver defun vc-switches).

1

Probablemente sea el programa ssh-askpass el que se active, el cual creo que mira la variable de entorno DISPLAY para decidir cómo solicitar la contraseña. Si está configurado, aparece una ventana gráfica, y si no, pregunta al TTY.

Si el subsistema de VCS detecta cuando se solicitan contraseñas del usuario (que es probable), entonces es posible que usted puede $ DISPLAY desarmado para subprocesos:

(setenv "DISPLAY" nil) 

Esto podría tener otros efectos secundarios negativos, sin embargo, también echa un vistazo a "man ssh-askpass" en caso de que algo pueda ayudar.

:

+0

Puede usar consejos o ganchos para aplicar eso solo al código necesario. Veo que 'vc-before-checkin-hook' y' vc-checkin-hook' (after) están definidos, pero supongo que tendrías que hacer esto para algo más que commits. Para (únicamente) el caso de 'Cx vv', el siguiente consejo lo cubriría: ' (defadvice vc-next-action (alrededor de my-ssh-prompt-fix-for-vc-next-action activate) (let ((backup (getenv "DISPLAY"))) (setenv "DISPLAY" nil) ad-do-it (setenv "DISPLAY" backup))) ' – phils

+0

Si el entorno en el que se ejecuta cvs afecta esto, entonces otra opción sería anular el comando cvs. 'vc-cvs-command' codifica los códigos" cvs "como el comando y lo pasa a' vc-do-command', por lo que una opción sería escribir un script contenedor para cvs (fuera de Emacs) para ejecutar el comando real en un ambiente modificado. Sin embargo, eso podría afectar las llamadas que no son de Emacs a cvs, por lo que podría nombrar el envoltorio algo distinto de "cvs" y crear algunos consejos antes de 'vc-do-command' para cambiar el valor de su' comando' arg para que coincida cuando es "cvs". – phils

+0

o tal vez simplemente utilice el enfoque de asesoramiento de mi primer comentario sobre 'vc-do-command' en lugar de' vc-next-action'? – phils

1

Puede obtener ssh para multiplexar todas las nuevas conexiones a un servidor a través de las conexiones existentes (Renuncia I personalmente uso una solución basada en ssh-agent, que recomiendo encarecidamente.). Esto significa que, mientras haya abierto una conexión ssh (por ejemplo, en un shell), las nuevas en el mismo host remoto no solicitarán una contraseña. Yo uso

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

en ~/.ssh/config para configurar esto.

+0

técnica genial, pero no es exactamente lo que estoy buscando aquí. ¡Pero aún es bueno saber! – Thomas

1

Prueba a poner esto en su entorno de alguna manera:

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

Eso debe conseguir que deje de intentar la autenticación de clave pública, que también suprimir la presentación de la gráfica ssh-askpass. Esto funciona especificando el comando SSH que CVS usará para conectarse al servidor remoto. Tenga en cuenta que esto se aplicará a todos los comandos de CVS que se ejecutan desde el contexto en el que establece la variable de entorno.

Es posible que también desee considerar configurarlo en su ~/.ssh/config. Puede establecer opciones para cada host por separado. Here's a page that roughly shows how, aunque para forzar la autenticación de la clave pública. Tenga en cuenta que esto afectará todo el uso de SSH para su cuenta de usuario, no solo para CVS.Eso bien puede ser lo que estás buscando, ya que parece que prefieres evitar la autenticación de la clave pública. He aquí un ejemplo del bloque deberá añadir en ~/.ssh/config:

Host cvs 

    Hostname cvs.your.corp 
    User yourCVSusername 
    PreferredAuthentications password 

Alternativamente, podría cambiar Host cvs-Host cvs.your.corp si su medio de acceso a este utiliza un nombre de dominio completo en lugar de sólo un nombre de host existente.

Por último, usted podría tener su archivo ~/.ssh/config por esta única línea (o añadirlo a la parte superior de uno ya existente):

PreferredAuthentications password 

que hará que la preferencia se aplican a todas las conexiones SSH a servidores remotos .

Lo mejor de la suerte. Espero que esto te saque de la trampa del diálogo modal.

+0

Gracias, pero no estoy usando SVN. – Thomas

+0

La misma solución funciona para CVS, simplemente estableciendo la variable de entorno 'CVS_RSH' en lugar de la variable' SVN_SSH'. Actualicé la respuesta para reflejar eso. Tenga en cuenta que la segunda solución, que modifica '~/.ssh/config', funcionará para todos los programas que usan SSH, incluso si no admiten variables de entorno como' CVS_RSH' y 'SVN_RSH' – justis

+0

También agregué ejemplos para el segunda solución – justis

1

Mientras investigaba mi respuesta principal (arriba), me encontré con psvn para emacs. Vea esta pregunta/respuesta para obtener más detalles: SVN for Emacs: how do you set author name and save password?

Pensé que también podría agradecer saber acerca de psvn, pero creo que la de establecer el valor de PreferredAuthentications en SSH es más directamente aplicable a la pregunta que hizo originalmente.

Cuestiones relacionadas