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

43

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

Apilado
fuente
Estoy muy interesado cuando tienes un retraso de tipeo que no puedes trabajar con él. Usé ssh en la era moderna y nunca enfrenté estos problemas.
mailq
44
Estoy accediendo a un SliceHost VPS (EE. UU.) De Bélgica. La demora es lo suficientemente notable como para confundirme. Sin embargo, me he dado cuenta de que otras personas parecen estar menos preocupados por esto que yo soy ..
StackedCrooked
55
mosh.mit.edu
alfC
@mailq ¿no usas 3G en 2019? sshing desde la casa de campo del pueblo o bajo tierra es más como hacerlo con acceso telefónico
POMATu

Respuestas:

32

No, porque SSH no tiene forma de saber si lo que está escribiendo requeriría una entrada o pestaña para la acción; si está tratando de revisar su historial de comandos, por ejemplo, las ^Rflechas hacia arriba o hacia arriba no serían enviadas por ellos mismos, y eso sería ... desagradable.

Sin embargo, no tiene que esperar entre cada personaje para que aparezca en la pantalla; si sabe lo que tiene que escribir, bátelo tan rápido como desee, y la terminal se pondrá al día en aproximadamente un tiempo de ida y vuelta desde que dejó de escribir, que es tan bueno como saldrá de una configuración de línea amortiguada de todos modos (la pérdida de paquetes es diferente, pero presenta sus propias peculiaridades interesantes).

womble
fuente
Estaría realmente interesado en encontrar una manera de comparar la velocidad de tipeo ssh en varias máquinas. Observé que la velocidad puede variar MUCHO entre máquinas ubicadas en el mismo lugar y que no tienen ninguna carga pesada sobre ellas. Mi teoría es que esto sucede especialmente con las instancias pequeñas de AWS (como las micro o mini).
sorin
1
Mira el papel de Mosh. El autor realizó algunos benchmarking mosh.org/#techinfo
user7610 el
Tuve que usar "ssh -t .... bash -i" -t significa 'forzar asignación de pty' (de lo contrario, SSH no cree que tenga que hacerlo y bash se queja) y -i ejecuta bash en modo interactivo ( de lo contrario, se salta alguna inicialización). Pasar ssh -C también (comprimir el tráfico) puede ayudar aún más. Gran consejo de todos modos, gracias.
zakmck
25

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

PuTTY también tiene algunas otras opciones para habilitar / deshabilitar ciertas cosas (algoritmo de Nagle) que pueden afectar la latencia de conexión percibida. A mi entender, el cliente OpenSSH no ofrece todas las características que PuTTY ofrece a este respecto, y no conozco una alternativa de Linux que se compare.

De lo contrario, womble tiene razón.

Jeff Ferland
fuente
Esta debería ser la respuesta aceptada
Freddie Fabregas
No pude instalar PuTTY en macOS, ¿hay algún reemplazo?
Aero Windwalker
La masilla en Linux es un poco dolorosa. No se puede volver a conectar automáticamente, muestra un cuadro de mensaje al desconectar y necesito abrir la ventana nuevamente. Desearía poder usar algo como kitty o plink.exe en linux o mejor para simplemente modificar autossh de alguna manera. Algunos dispositivos no son compatibles con mosh tho (si intento acceder al enrutador openwrt de mi casa)
POMATu
22

Mosh fue diseñado para abordar este problema exacto. Está diseñado para su uso en conexiones de alta latencia y poco confiables, y proporciona edición local de eco y línea.

Steven C. Howell
fuente
Puede instalarlo en un directorio local desde la fuente sin sudo. Además, ve a mosh.org. Dice: "No hay código privilegiado. No hay demonio. No es necesario ser el superusuario para instalar o ejecutar Mosh. El cliente y el servidor son ejecutables ejecutados por un usuario común y solo duran la vida de la conexión".
Steven C. Howell
1
Solo para tener en cuenta. Mosh no es SSH. Utiliza su propio protocolo propietario. (Sin embargo, no tengo ningún problema con eso)
User7610
Esto funcionó desde cero para mí en Android y en la red wifi mala del hogar. Sabe sobre readline
tinmarino
9

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

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

Actualizar:

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

chasquido
fuente
1
Lo intenté y no lo encontré muy viable. Pero es genial saberlo, gracias.
StackedCrooked
Esto funciona maravillosamente para mí.
lakesare
6

Después de haber tenido el mismo problema ( alta latencia y pérdida de paquetes debido a la pésima calidad de datos móviles en algunos lugares), y Mosh no cortarlo para mí (que necesita programas especiales en todos los hosts remotos, fijando UTF8 local o remota en todos los servidores sin romperlos , modificando todos los cortafuegos, y en realidad no proporciona edición de línea local de todos modos) He decidido escribir un pequeño contenedor para proporcionar el modo de edición de línea local para ssh .

De manera predeterminada, simplemente pasa todo a ssh en el modo char-by-char predeterminado, pero puede presionar una tecla de acceso rápido para ingresar al modo de edición de línea local con tecnología readline en cualquier momento. Por lo tanto, puede ingresar (con edición, recuperación de comandos, etc.) toda la línea localmente, y luego, cuando presione enter , se enviará como un paquete TCP al lado remoto.

La ventaja es la edición de la línea de comandos sin demoras (como el antiguo "modo tamponado línea por línea" de telnet cocinado / canónico, pero con comandos de edición superiores proporcionados por la línea de lectura GNU ). Además, no es necesario cambiar nada en servidores o firewalls. Y los editores y otros programas basados ​​en maldiciones continúan funcionando normalmente (aunque con retraso) en el modo char-by-char predeterminado como en la conexión ssh normal.

La desventaja es que debe presionar la tecla de acceso rápido para ingresar al modo de edición de línea local cada vez que lo desee, o debe modificar la solicitud en el host remoto para permitir la detección automática. Además, la finalización del nombre de la pestaña remota actualmente solo funciona si lo regresa al modo char-by-char (o usa el sistema de archivos local en lugar del remoto, según sus preferencias). Sin embargo, es un trabajo en progreso, por lo que las solicitudes de extracción o las ideas viables para mejorar son bienvenidas.


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

La ventaja no solo es que su shell (y su edición de línea) es local y sin retrasos, sino que también puede navegar por el sistema de archivos remoto y usar la finalización del nombre de shell ( tecla de tabulación ) para los archivos remotos. Además, (la mejor característica en mi humilde opinión) puede utilizar su editor local de elección para la edición sin demora de archivos remotos.

Las desventajas son (especialmente si el enlace también tiene un ancho de banda bajo y no solo una latencia alta) que para cada archivo que se debe editar, debe transferirse completamente a localhost y luego, después de la edición, transferirse nuevamente a remoto. SSHFS proporciona algo de almacenamiento en caché (vea las opciones sshfs (1) cache , cache_timeout , cache_x_timeout ) para aliviar un poco esos problemas. Además, si desea ejecutar algo en remoto, debe 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).

Matija Nalis
fuente
3

Puede emular ese comportamiento si solo 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 (puede mitigarse usando conexiones ssh maestras / compartidas )
  2. si no tiene una clave privada sin contraseña, tendrá que usarla ssh-agento escribirla
  3. claramente no funciona si estás interactuando con menús o editando archivos, etc.
OchoBitTony
fuente
1

Puede usar tmux para lograr un eco fluido de su escritura. Ejecute tmux localmente. Si tiene el shell ssh en un panel, y un shell local en un panel debajo de él, entonces desde el panel local puede enviar claves al panel remoto.

tmux send-keys -t top 'ls' C-m

Comandos interactivos y pequeños comandos que escribo directamente en el shell ssh rezagado. Tan pronto como el retraso comienza a dificultar mi escritura, cambio al panel local y uso las teclas de envío. Esto funciona incluso en el medio de escribir un comando.

Para atajarlo, agregué esto a mi .bashrc

function ts {
    args=$@
    tmux send-keys -t right "$args" C-m
}

Gracias a Christian Pelczarski por explicar las claves de envío: https://minimul.com/increased-developer-productivity-with-tmux-part-5.html

Tendrá que escapar cuando use comillas, por ejemplo

ts git config --global alias.lola \'log --graph --decorate --pretty=oneline --abbrev-commit --all\'
Kjell
fuente