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-xterm
RET 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-term
acepta 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-hf
term-mode
RET
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
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
¿Qué es lo que realmente quiere hacer a través de ssh que no está editando archivos remotos o abriendo un terminal remoto? – Tyler