Existe-t-il un moyen d’éviter les retards de frappe SSH?


43

Puis-je dire à SSH d’envoyer les données uniquement après avoir appuyé sur Entrée ou sur la touche de tabulation, et non après chaque pression sur une touche?


Je suis très intéressé par le retard de frappe que vous ne pouvez pas utiliser. J'ai utilisé ssh à l'ère moderne et je n'ai jamais fait face à ces problèmes.
mailq

4
Je suis en train d'accéder à un VPS SliceHost (USA) depuis la Belgique. Le retard est suffisamment perceptible pour me rendre confus. Cependant, j'ai remarqué que cela semble moins
déranger les autres


@mailq n'utilisez-vous pas la 3G en 2019? Sshing de la maison de campagne du village ou du métro est plus comme le faire avec dialup
POMATu

Réponses:


32

Non, car SSH n'a aucun moyen de savoir si ce que vous tapez nécessiterait une action ou une tabulation - si vous essayez de consulter l'historique de vos commandes, par exemple, les ^Rflèches vers le haut ou vers le haut ne seront pas envoyées par eux-mêmes, et ce serait ... désagréable.

Vous n'avez pas besoin d'attendre entre chaque caractère pour qu'il apparaisse à l'écran, cependant; si vous savez ce que vous devez taper, écrivez-le aussi vite que vous le souhaitez, et le terminal vous rattrapera dans environ un aller-retour à partir du moment où vous avez arrêté de taper, ce qui est à peu près aussi efficace que vous en sortirez. de toute façon, une configuration avec tampon de ligne (la perte de paquet est différente, mais elle introduit ses propres bizarreries intéressantes).


Je serais vraiment intéressé à trouver un moyen de mesurer la vitesse de frappe en ssh sur plusieurs machines. J'ai observé que la vitesse peut varier BEAUCOUP entre des machines situées au même endroit et qui ne sont pas lourdement chargées. Ma théorie est que cela se produit surtout avec les petites instances d'AWS (telles que les micro ou mini).
sorin

1
Regardez le papier de Mosh. L’auteur a effectué des analyses comparatives mosh.org/#techinfo
user7610 le

J'ai dû utiliser "ssh -t .... bash -i" -t signifie "allocation forcée de pty" (sinon, SSH ne croit pas qu'il soit obligé et bash se plaint) et -i tourne bash en mode interactif ( sinon, il saute une initialisation). Passer ssh -C aussi (compresser le trafic) peut aider davantage. Excellent conseil quand même, merci.
Zakmck

25

PuTTY offre deux fonctionnalités qui peuvent être utiles: "écho local" et "édition de ligne locale". L'édition de ligne locale met tout en mémoire tampon et l'envoie uniquement au serveur après un retour de ligne. Cela peut rendre la ligne de commande beaucoup plus facile à gérer, mais cela peut également rendre l’utilisation d’un éditeur de texte très difficile.

PuTTY propose également d'autres options pour activer / désactiver certains éléments (algorithme de Nagle) susceptibles d'affecter la latence perçue des connexions. À mes yeux, le client OpenSSH n'offre pas toutes les fonctionnalités proposées par PuTTY à cet égard, et je ne connais pas d'alternative Linux comparable.

Sinon, Womble a raison.


Cela devrait être la réponse acceptée
Freddie Fabregas

J'ai échoué à installer PuTTY sur macOS, existe-t-il un produit de remplacement?
Aero Windwalker

Putty sur Linux est un peu pénible. Il ne peut pas se reconnecter automatiquement, affiche une boîte de message lors de la déconnexion et je dois rouvrir la fenêtre. J'aimerais pouvoir utiliser quelque chose comme Kitty ou plink.exe sur linux ou mieux pour modifier quelque peu autossh. Certains appareils ne supportent pas mosh tho (si j'essaie d'accéder à mon routeur openwrt domestique)
POMATu

22

Mosh a été conçu pour résoudre ce problème. Il est conçu pour une utilisation sur des connexions à latence élevée et peu fiables, et fournit un montage d'écho et de ligne local.


Vous pouvez l'installer sur un répertoire local à partir de la source sans sudo. Allez aussi sur mosh.org. Il dit: "Pas de code privilégié. Pas de démon. Vous n'avez pas besoin d'être le super-utilisateur pour installer ou exécuter Mosh. Le client et le serveur sont des exécutables exécutés par un utilisateur ordinaire et ne durent que pendant la durée de la connexion."
Steven C. Howell

1
Juste pour noter. Mosh n'est pas SSH. Il utilise son propre protocole propriétaire. (Je n'ai pas de problème avec ça, cependant.)
user7610

Cela a fonctionné à partir de zéro pour moi sur android et le mauvais réseau wifi de la maison. Il sait à propos de readline
tinmarino

9

Ouvrez la session ssh avec ssh host.example.org bash(ou le shell que vous voulez utiliser).

Vous obtiendrez le mode ligne tamponné sur le shell distant, ce qui signifie que vous ne recevrez pas d'invite ni de modification de ligne, mais que vous obtiendrez un écho local et le mode "une ligne à la fois". C'est parfois utile lorsque vous travaillez avec une très mauvaise connexion. Tous les programmes ne fonctionneront pas correctement car vous n’aurez pas de pseudo-tty, mais la plupart des utilitaires UNIX fonctionnent parfaitement.

Mise à jour:

Lorsque vous utilisez l'astuce ci-dessus, vous pouvez obtenir une édition de ligne normale ( readline ) au niveau local en utilisant un programme d'encapsulation très pratique appelé rlfe . Il suffit de courir rlfe ssh host.example.org bash.


1
J'ai essayé et je ne l'ai pas trouvé très pratique. Mais c'est cool de savoir, merci.
StackedCrooked

cela fonctionne à merveille pour moi.
lakesare

6

Ayant eu le même problème ( latence élevée et la perte de paquets en raison de la qualité terrible de données mobiles à certains endroits), et Mosh ne coupe pas pour moi (il a besoin de programmes spéciaux sur tous les hôtes distants, fixer UTF8 localement et à distance sans les briser sur tous les serveurs , en modifiant tous les pare-feu - et il ne fournit pas vraiment l'édition de ligne locale) J'ai décidé d'écrire un petit wrapper pour fournir le mode d'édition de ligne locale pour ssh .

Par défaut, il transmet simplement tout à ssh en mode caractère par caractère, mais vous pouvez appuyer sur un raccourci clavier pour passer à tout moment en mode de modification de ligne locale alimenté par readline. Ainsi, vous pouvez entrer (avec édition, rappel de commande, etc.) en ligne entière, puis lorsque vous appuyez sur Entrée, elle sera envoyée sous la forme d'un paquet TCP au côté distant.

Advantage est une édition de ligne de commande sans décalage (comme l’ancien "mode de mise en tampon ligne à ligne", telle que cuite / canonique de telnet, mais avec des commandes d’édition supérieures fournies par GNU readline ). De plus, rien ne doit être changé sur les serveurs ou les pare-feu. Et les éditeurs et autres programmes basés sur curses continuent de fonctionner normalement (avec retard cependant) en mode caractère par caractère comme dans la connexion ssh normale.

L’inconvénient est que vous devez soit appuyer sur la touche de raccourci pour passer en mode d’édition de ligne locale chaque fois que vous le souhaitez, soit modifier l’invite sur un hôte distant pour permettre la détection automatique. De plus, l' achèvement de nom de fichier par onglet distant ne fonctionne actuellement qu'en vous ramenant au mode caractère par caractère (ou en utilisant un système de fichiers local au lieu d'un système distant, selon vos préférences). C'est un travail en cours, cependant, les demandes de propositions ou les idées réalisables d'amélioration sont les bienvenues!


Du côté non conventionnel, vous pouvez également utiliser SSHFS pour monter le système de fichiers distant localement.

L’avantage, c’est non seulement que votre shell (et son édition de ligne) est local et sans décalage, mais vous pouvez également naviguer dans le système de fichiers distant et utiliser la complétion du nom de fichier du shell ( touche de tabulation ) pour les fichiers distants. En outre, (la meilleure fonctionnalité à mon humble avis), vous pouvez utiliser l’éditeur local de votre choix pour une édition sans décalage des fichiers distants.

Les inconvénients sont (surtout si votre lien est également à faible bande passante et pas seulement à latence élevée) que pour chaque fichier à modifier, il doit être intégralement transféré sur localhost, puis intégralement transféré à distance sur un fichier distant. SSHFS ne prévoit une mise en cache (voir SSHFS (1) Options cache , cache_timeout , cache_x_timeout pour atténuer les problèmes que peu). De plus, si vous voulez exécuter quelque chose sur remote, vous devez utiliser un autre écran ou préfixer toutes les commandes avec " ssh remotehost " (par exemple ssh remotehost sudo service apache restart). Voir l'option ControlMaster dans ssh_config (5) pour accélérer l'exécution (sans invite de mot de passe).


3

Vous pouvez émuler ce comportement si vous n'exécutez que des commandes en faisant,

utilisateur ssh @ targetmachine 'mes commandes dans une chaîne'

mais,

  1. cela ajoute un délai supplémentaire dans la création de la connexion (peut être atténué en utilisant des connexions ssh maître / partagées )
  2. si vous n'avez pas de clé privée sans mot de passe, vous devrez utiliser ssh-agentou taper le mot de passe
  3. il est évident que cela ne fonctionne pas si vous interagissez avec des menus, modifiez des fichiers, etc.

1

Vous pouvez utiliser tmux pour obtenir un écho fluide de votre frappe. Exécutez tmux localement. Si vous avez le shell ssh dans un volet et un shell local dans un volet situé en dessous, vous pouvez envoyer des clés dans le volet distant à partir du volet local.

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

Commandes interactives et petites commandes que je tape directement dans le shell ssh en retard. Dès que le décalage commence à gêner ma saisie, je bascule vers le volet local et utilise les touches d'envoi. Cela fonctionne même lorsque vous tapez une commande.

Pour le raccourcir j'ai ajouté ceci à mon .bashrc

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

Merci à Christian Pelczarski pour avoir expliqué les clés d'envoi: https://minimul.com/increased-developer-productivity-with-tmux-part-5.html

Vous devrez vous échapper lorsque vous utilisez des guillemets, par exemple

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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.