C'è un modo per evitare il ritardo nella digitazione SSH?


43

Posso dire a SSH di inviare i dati solo dopo aver premuto Invio o Tab e non dopo ogni singola pressione del tasto?


Sono molto interessato a dove hai un ritardo di digitazione tale che non riesci a lavorarci. Ho usato ssh nell'era moderna e non ho mai affrontato questi problemi.
mailq,

4
Accedo a un SliceHost VPS (USA) dal Belgio. Il ritardo è abbastanza evidente da farmi confondere. Tuttavia, ho notato che altre persone sembrano essere meno infastidite da questo di quanto io sia ..
StackedCrooked


@mailq non usi 3G nel 2019? scappare dalla casa di campagna del villaggio o dalla metropolitana è più come farlo con il dialup
POMATu

Risposte:


32

No, perché SSH non ha modo di sapere se ciò che stai digitando richiederebbe un invio o una scheda per agire - se stai provando a scorrere la cronologia dei comandi, ad esempio, le ^Rfrecce su o non verranno inviate da se stessi, e sarebbe ... spiacevole.

Non devi aspettare tra ogni personaggio perché appaia sullo schermo, comunque; se sai cosa devi scrivere, colpiscilo il più velocemente possibile e il terminale ti raggiungerà in circa un tempo di andata e ritorno da quando hai smesso di digitare, il che è buono quasi quanto uscirai da una configurazione con buffer di linea (la perdita di pacchetti è diversa, ma introduce le sue stranezze interessanti).


Sarei davvero interessato a trovare un modo per confrontare la velocità di battitura ssh su più macchine. Ho osservato che la velocità può variare molto tra le macchine situate nello stesso posto e che non hanno alcun carico pesante su di esse. La mia teoria è che ciò accade soprattutto con le piccole istanze di AWS (come quelle micro o mini).
sorin,

1
Guarda il giornale Mosh. L'autore ha fatto alcuni benchmarking mosh.org/#techinfo
user7610

Ho dovuto usare "ssh -t .... bash -i" -t significa "forzare l'allocazione pty" (altrimenti SSH non crede che debba farlo e bash si lamenta) e -i esegue bash in modalità interattiva ( altrimenti, salta un po 'di inizializzazione). Passare anche ssh -C (comprimere il traffico) può aiutare ulteriormente. Ottimo consiglio comunque, grazie.
zakmck

25

PuTTY offre due funzionalità che potrebbero essere utili: "eco locale" e "modifica della linea locale". La modifica della linea locale esegue il buffering di tutto e lo invia al server solo dopo un ritorno di linea. Ciò può rendere la riga di comando molto più semplice da gestire, ma può anche rendere l'inferno un editor di testo.

PuTTY ha anche alcune altre opzioni per abilitare / disabilitare determinate cose (algoritmo di Nagle) che possono influire sulla latenza della connessione percepita. A mio modo di vedere, il client OpenSSH non offre tutte le funzionalità di PuTTY in questo senso, e non conosco un'alternativa Linux a confronto.

Altrimenti, womble ha ragione.


Questa dovrebbe essere la risposta accettata
Freddie Fabregas,

Non riesco a installare PuTTY su macOS, c'è una sostituzione?
Aero Windwalker,

Putty su Linux è un po 'doloroso. Non può riconnettersi automaticamente, mostra una finestra di messaggio al momento della disconnessione e devo aprire nuovamente la finestra. Vorrei poter usare qualcosa come kitty o plink.exe su Linux o meglio per modificare in qualche modo l'autossh. Alcuni dispositivi non supportano mosh tho (se provo ad accedere al mio router openwrt di casa)
POMATu

22

Mosh è stato progettato per risolvere questo problema esatto. È progettato per l'uso su connessioni ad alta latenza e inaffidabili e fornisce eco locale e modifica delle linee.


Puoi installarlo su una directory locale dal sorgente senza sudo. Inoltre, vai a mosh.org. Dice "Nessun codice privilegiato. Nessun demone. Non è necessario essere il superutente per installare o eseguire Mosh. Il client e il server sono eseguibili gestiti da un utente normale e durano solo per la durata della connessione."
Steven C. Howell,

1
Solo per notare. Mosh non è SSH. Utilizza il proprio protocollo proprietario. (Non ho problemi con quello, comunque.)
user7610

Questo ha funzionato da zero per me su Android e rete domestica cattiva Wi-Fi. Conosce readline
Tinmarino il

9

Apri la sessione ssh con ssh host.example.org bash(o qualunque shell tu voglia usare).

Otterrai la modalità buffer di linea nella shell remota, il che significa che non riceverai un prompt e la modifica della linea ma otterrai l'eco locale e la modalità "una riga alla volta". A volte è utile quando si lavora con una connessione molto cattiva. Non tutti i programmi funzioneranno correttamente perché non avrai una pseudo-tty, ma la maggior parte delle utility UNIX funzionano bene.

Aggiornare:

Quando si utilizza il trucco di cui sopra, è possibile ottenere la normale modifica della riga ( readline ) all'estremità locale utilizzando un comodo programma wrapper chiamato rlfe . Corri e basta rlfe ssh host.example.org bash.


1
Ho provato e non l'ho trovato molto praticabile. Ma è bello saperlo, grazie.
StackedCrooked

questo funziona meravigliosamente per me.
Lakesare il

6

Avendo avuto lo stesso problema ( latenza elevata e perdita di pacchetti a causa della terribile qualità dei dati mobili in alcune posizioni), e mosh non tagliarlo per me (ha bisogno di programmi speciali su tutti gli host remoti, riparando UTF8 localmente e da remoto su tutti i server senza romperli , modificando tutti i firewall - e in realtà non fornisce comunque la modifica della linea locale) Ho deciso di scrivere un piccolo wrapper per fornire la modalità di modifica della linea locale per ssh .

Per impostazione predefinita, passa tutto a ssh nella modalità char-by-char predefinita, ma è possibile premere un tasto di scelta rapida per accedere alla modalità di modifica della linea locale basata su readline in qualsiasi momento. Così si potrebbe entrare (con la modifica, il comando ricordando ecc) tutta la linea a livello locale, e poi quando si preme entrare sarà inviato come un pacchetto TCP al lato remoto.

Il vantaggio è la modifica della riga di comando senza ritardi (come la vecchia "modalità bufferizzata riga per riga" di Telnet, ma con comandi di modifica superiori forniti da GNU readline ). Inoltre, non è necessario modificare nulla su server o firewall. E gli editor e altri programmi basati su maledizioni continuano a funzionare normalmente (anche se con ritardo) in modalità char-by-char predefinita come nella normale connessione ssh.

Lo svantaggio è che è necessario premere il tasto di scelta rapida per accedere alla modalità di modifica della linea locale ogni volta che lo si desidera oppure è necessario modificare il prompt sull'host remoto per consentire il rilevamento automatico. Inoltre, il completamento del nome file della scheda remota attualmente funziona solo riportandoti alla modalità char-by-char (o utilizza un filesystem locale invece di quello remoto, a seconda delle tue preferenze). Sono lavori in corso, tuttavia, quindi le richieste pull o le idee realizzabili per il miglioramento sono benvenute!


Dal lato non convenzionale, è possibile utilizzare in alternativa SSHFS per montare il filesystem remoto localmente.

Il vantaggio non è solo che la tua shell (e la sua modifica della linea) è locale e senza ritardi, ma anche che puoi navigare nel filesystem remoto e usare il completamento del nome file della shell ( tasto tab ) per i file remoti. Inoltre, (la migliore funzione IMHO) è possibile utilizzare l'editor locale preferito per la modifica senza ritardi di file remoti.

Gli svantaggi sono (specialmente se il collegamento è anche a bassa larghezza di banda, e non solo ad alta latenza) che per ogni file da modificare, deve essere trasferito completamente su localhost e, successivamente, modificato nuovamente su remoto. SSHFS prevede alcune cache (vedi sshfs (1) opzioni cache , cache_timeout , cache_x_timeout ) per alleviare un po 'quei problemi. Inoltre, se si desidera eseguire qualcosa sul telecomando, è necessario utilizzare un'altra schermata o aggiungere il prefisso a tutti i comandi con " ssh remotehost " (ad esempio ssh remotehost sudo service apache restart). Vedi l'opzione ControlMaster in ssh_config (5) per renderlo più veloce da eseguire (e senza richiedere la password).


3

Puoi emulare quel comportamento se stai solo eseguendo i comandi facendo,

ssh user @ targetmachine 'i miei comandi in una stringa'

ma,

  1. questo aggiunge un ulteriore ritardo nella creazione della connessione (può essere mitigato usando connessioni master / condivise ssh )
  2. se non disponi di una chiave privata senza password, dovrai utilizzare ssh-agento digitare la password
  3. chiaramente non funziona se interagisci con menu o modifichi file, ecc.

1

Puoi usare tmux per ottenere un'eco fluente della digitazione. Esegui tmux localmente. Se si dispone della shell ssh in un riquadro e di una shell locale in un riquadro sottostante, dal riquadro locale è possibile inviare le chiavi al riquadro remoto.

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

Comandi interattivi e piccoli comandi che digito direttamente nella shell ssh in ritardo. Non appena il ritardo inizia a ostacolare la mia digitazione, passo al riquadro locale e utilizzo i tasti di invio. Funziona anche durante la digitazione di un comando.

Per collegarlo ho aggiunto questo al mio .bashrc

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

Grazie a Christian Pelczarski per la spiegazione delle chiavi di invio: https://minimul.com/increased-developer-productivity-with-tmux-part-5.html

Dovrai scappare quando usi le virgolette, per esempio

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.