¿Hay una manera de evitar el retraso de escritura de SSH?

¿Puedo decirle a SSH que envíe los datos sólo después de presionar enter o tab, y no después de cada pulsación individual?

No, porque SSH no tiene forma de saber si lo que está escribiendo requeriría una entrada o una pestaña a la acción – si está intentando pasar por su historia de comandos, por ejemplo, las flechas ^R o arriba no serían Enviados por ellos mismos, y eso sería … desagradable.

Usted no tiene que esperar entre cada carácter para que aparezca en la pantalla, sin embargo; Si sabes lo que tienes que escribir, bash lejos en lo más rápido como te gusta, y la terminal se pondrá al día en un tiempo de ida y vuelta de cuando se detuvo la escritura, que es tan bueno como usted saldrá de Una configuración de línea de búfer de todos modos (pérdida de paquetes es diferente, pero introduce sus peculiaridades interesantes).

PuTTY ofrece dos características que pueden ser de uso: "eco local" y "edición de línea local". La edición de línea local lo almacena todo y sólo lo envía al servidor después de una devolución de línea. Eso puede hacer que la línea de comandos sea mucho más fácil de manejar, pero también puede hacer que el uso de un editor de texto infierno.

PuTTY también tiene otras opciones para activar / desactivar ciertas cosas (el algoritmo de Nagle) que pueden afectar la latencia de la conexión percibida. Según lo veo, el cliente OpenSSH no ofrece todas las características que PuTTY hace a este respecto, y no sé de una alternativa de Linux que se compara.

De lo contrario, womble tiene razón.

Mosh fue diseñado para abordar esta cuestión exacta. Está diseñado para usarse en conexiones de alta latencia y no confiables, y proporciona edición local de eco y línea.

Abra la sesión ssh con ssh host.example.org bash (o cualquier shell que desee usar).

Obtendrá el modo de búfer de línea a la shell remota, lo que significa que no obtendrá un mensaje y la edición de línea, pero obtendrá eco local y "una línea a la vez". A veces es útil cuando se trabaja con una conexión muy mala. No todos los programas se ejecutarán correctamente porque no tendrá una pseudo-tty, pero la mayoría de las utilidades UNIX funcionan bien.

Actualizar:

Al utilizar el truco anterior puede obtener la edición de línea normal ( readline ) en el extremo local mediante el uso de un programa de contenedor conveniente llamado rlfe . Simplemente ejecute rlfe ssh host.example.org bash .

Habiendo tenido el mismo problema ( alta latencia y pérdida de paquetes debido a la terrible calidad de los datos móviles en algunas ubicaciones), y mosh no cortar para mí (necesita programas especiales en todos los hosts remotos, la fijación de UTF8 local y remotamente en todos los servidores sin romperlos , La modificación de todos los firewalls – y realmente no proporciona la línea de edición local de todos modos) He decidido escribir un pequeño envoltorio para proporcionar el modo de edición de línea local para ssh .

De forma predeterminada, sólo pasa todo a ssh en el modo char-by-char predeterminado, pero puede pulsar una tecla de acceso directo para entrar en modo de edición de línea local readline-powered en cualquier momento. Así que usted podría entrar (con la edición, el comando que recuerda etc) línea entera localmente, y entonces cuando usted presiona entra será enviado como paquete de un TCP al lado alejado.

Advantage es la edición de línea de comandos sin retrasos (como el antiguo telnet cocinado / canónico "line-by-line buffered mode", pero con comandos de edición superiores proporcionados por GNU readline ). Tampoco hay que cambiar nada en los servidores o firewalls. Y los editores y otros programas basados ​​en curses siguen funcionando normalmente (aunque con retraso) en el modo char-by-char predeterminado como en la conexión ssh normal.

La desventaja es que usted necesita presionar tecla de acceso directo para entrar en el modo de edición de línea local cada vez que lo desee, o necesita modificar la solicitud en el host remoto para permitir la detección automática. Además, la terminación del nombre de archivo de la pestaña remota sólo funciona actualmente al dejarlo de nuevo en el modo char-by-char (o usa un sistema de archivos local en lugar de uno remoto, dependiendo de sus preferencias). Es un trabajo en progreso, sin embargo, por lo que las solicitudes de tracción o ideas viables para la mejora son bienvenidos!


En el lado no convencional, también se puede usar SSHFS para montar el sistema de archivos remoto localmente.

La ventaja no es sólo que su shell (y su edición de línea) es local y libre de retrasos, sino también que puede navegar por el sistema de archivos remoto y usar la completación de nombre de archivo de shell ( tecla de pestaña ) para archivos remotos. Además, (la mejor característica IMHO) puede utilizar su editor local de elección para la edición sin retraso de archivos remotos.

Las desventajas son (especialmente si el enlace es también de bajo ancho de banda, y no sólo de alta latencia) que para cada archivo a editar, debe ser totalmente transferido a localhost, y luego después de editar, totalmente transferido al control remoto de nuevo. SSHFS proporciona una cierta caché (vea caché de las opciones de sshfs (1), cache_timeout , cache_x_timeout ) para aliviar ligeramente esos problemas. Además, si quieres ejecutar algo en el control remoto necesitas usar otra pantalla o prefijar todos los comandos con " ssh remotehost " (por ejemplo ssh remotehost sudo service apache restart ). Consulte la opción ControlMaster en ssh_config (5) para que sea más rápido de ejecutar (y sin solicitud de contraseña).

Puede emular ese comportamiento si sólo está ejecutando comandos haciendo,

Ssh user @ targetmachine 'mis comandos en una cadena'

pero,

  1. Esto agrega un retraso adicional en la creación de la conexión (se puede mitigar utilizando conexiones maestro / ssh compartido )
  2. Si no tienes una clave privada sin contraseña, vas a tener que usar ssh-agent o escribir la contraseña en
  3. Claramente no funciona si está interactuando con menús o editando archivos, etc.

Esto hace lo que quieres. Es necesario instalar el cliente y el servidor, sin embargo, y el OpenSSH aguas arriba nunca adoptó los cambios. https://github.com/hyc/OpenSSH-LINEMODE