2012-05-08 20 views
6

Varias preguntas, incluida this, discuten aspectos relacionados con las conexiones ssh desde dentro de Emacs. No he encontrado una respuesta a mi pregunta: ¿Cómo puedo enviar ssh a una máquina remota desde Emacs?Conexión ssh remota desde Emacs

No deseo editar un archivo en la máquina remota desde Emacs. Soy consciente de M-xshell que abre un shell en mi máquina local y estoy al tanto de usar TRAMP para editar un archivo a través de ssh en la máquina remota. Sin embargo, ninguno de estos se relaciona con esta pregunta.

(En lugar de votación para cerrar, tal vez la cuestión migran a otro sitio.)

Editar: here discusión relacionados.

+0

Ambos 'M-x shell' y Tramp * do * se relacionan con su pregunta como se indica. Entonces explique concretamente qué es lo que no hacen. Entiendo que quieres hacer más de lo que Tramp te permite hacer, pero ¿qué quieres hacer que 'M-x shell' no te permita hacer? – Stefan

+0

Quiero escribir 'M-x ssh' o algo similar para crear una conexión ssh, como puedo escribir' M-x sql-postgresql' para crear una conexión directamente a una base de datos. 'M-x shell' acaba de abrir un shell, desde el cual I * can * ssh, o lo que sea. Estaba preguntando si hay una forma de ssh * directamente * desde dentro de Emacs. – SabreWolfy

+0

¿Qué es lo que realmente quiere hacer a través de ssh que no está editando archivos remotos o abriendo un terminal remoto? – Tyler

Respuesta

9

En primer lugar, no conozco un cliente elisp ssh nativo (y no creo que haya una gran motivación para escribir uno), por lo que seguramente tendrá que interactuar con un proceso externo de cliente ssh.

Como desee utilizar ssh interactivamente, el proceso ssh requiere un terminal en el lado local de la conexión.

Por lo tanto, la pregunta es: ¿Emacs implementa un terminal al que se puede conectar un proceso ssh?

La respuesta es: yes - term.el proporciona una implementación de terminal robusta, a través de la cual ssh se puede ejecutar directamente, sin la necesidad de un shell.

Si ejecuta M-xtermRET se le pedirá para un programa. (Por defecto es una concha, pero que ciertamente no es el único tipo de proceso puede ejecutar.)

Por razones desconocidas, el interactivo term (y ansi-term) funciones no son compatibles con el paso de argumentos al programa especificado, lo que hace son menos útiles si desea ejecutar algo como ssh [email protected]. En su lugar podría especificar una secuencia de comandos que se encargaba de los argumentos, pero que puede manejar en elisp así:

La función term es en realidad un contenedor simple que requiere make-term para iniciar el programa y luego establece los modos apropiados. Como make-termacepta los argumentos del programa, es bastante sencillo copiar y modificar la definición de term para que se ajuste a sus propios fines.

Aquí es una aplicación muy simple:

(defun my-ssh (user host port) 
    "Connect to a remote host by SSH." 
    (interactive "sUser: \nsHost: \nsPort (default 22): ") 
    (let* ((port (if (equal port "") "22" port)) 
     (switches (list host "-l" user "-p" port))) 
    (set-buffer (apply 'make-term "ssh" "ssh" nil switches)) 
    (term-mode) 
    (term-char-mode) 
    (switch-to-buffer "*ssh*"))) 

o tal vez esto es preferible:

(defun my-ssh (args) 
    "Connect to a remote host by SSH." 
    (interactive "sssh ") 
    (let ((switches (split-string-and-unquote args))) 
    (set-buffer (apply 'make-term "ssh" "ssh" nil switches)) 
    (term-mode) 
    (term-char-mode) 
    (switch-to-buffer "*ssh*"))) 

Es obvio que hay margen de mejora, pero yo creo que es bastante útil como está.

Debe asegurarse de estar familiarizado con las peculiaridades de term-mode.Ver:

  • M-:(info "(emacs) Terminal emulator")RET
  • M-:(info "(emacs) Terminal Mode")RET
  • C-hfterm-modeRET
+0

¿Cómo especifico el puerto? Hice algunas modificaciones a su ejemplo, pero no puedo encontrar dónde especificar el "-p PORT". No tengo las páginas de información, así que tendré que buscarlas en otro lugar. – SabreWolfy

+0

He agregado un argumento de puerto.¿Cómo instalaste Emacs? No tener los manuales de información disponibles es una deficiencia significativa. – phils

+0

Gracias. Ambos ejemplos funcionan para mí ahora. – SabreWolfy

1

No estoy seguro de entender. Abra M-x ansi-term y ejecute ssh [email protected] allí?

+0

¿Entonces Emacs no tiene un programa shell que deberíamos usar? La solución es simplemente hacer un caparazón (incluso con "M-x shell") y luego simplemente ssh desde allí? Lo estoy comparando con el modo Emacs SQL, donde Emacs mismo hace la conexión remota. – SabreWolfy

+0

Hay un shell, escrito en Elisp, llamado eshell, si eso es lo que quieres decir. –

+1

Correcto, hay muchas implementaciones de shell, pero AFAIK no hay implementación de cliente ssh. – Mario

2

Resulta, no es lo que quiere:

(setq rlogin-program "ssh") 
(setq rlogin-process-connection-type t) 

y luego M-x rlogin RET <myhost> RET va a hacer eso.

+0

¿Cómo especifico el nombre de usuario, la contraseña y el puerto? Ni 'M-x rlogin RET RET' ni' M-x rlogin RET RET' funcionó. http://emacswiki.org/emacs/RloginMode no fue útil. – SabreWolfy

+0

Esos no funcionan porque ni 'ssh host username' ni' ssh username @ host: port' son invocaciones válidas. Puede usar 'username @ host -p port' o' host -l username -p port'. O use '(setq rlogin-explicit-args '(" -l "" username "" -p "" port "))'. Por lo general, no necesitarás especificar ningún puerto, por supuesto. Marque 'C-h f rlogin'. Como 'rlogin' usa' comint-mode', también puede querer 'ansi-color-for-comint-mode-on' también puede ser útil. – phils

+0

Estoy encontrando el enfoque 'término' con' term-char-mode' un poco más sólido que esto. En particular, funciona la finalización de TAB en el shell remoto. Cuando se trata de shells, 'comint' parece estar más orientado a los locales que a los remotos, mientras que' term' no hace tales suposiciones. – phils

1

Tal vez ssh.el es lo que estás buscando. El comando ssh proporciona una forma de un solo paso para crear shells remotos en Emacs a través de ssh, incluyendo la especificación del nombre de usuario de una manera natural y habilitando el seguimiento del directorio de tramp si así lo desea.

Cuestiones relacionadas