Posso dire a SSH di inviare i dati solo dopo aver premuto Invio o Tab e non dopo ogni singola pressione del tasto?
Posso dire a SSH di inviare i dati solo dopo aver premuto Invio o Tab e non dopo ogni singola pressione del tasto?
Risposte:
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 ^R
frecce 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).
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.
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.
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
.
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!
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).
Puoi emulare quel comportamento se stai solo eseguendo i comandi facendo,
ssh user @ targetmachine 'i miei comandi in una stringa'
ma,
ssh-agent
o digitare la passwordPuoi 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\'
Questo fa quello che vuoi. Tuttavia, è necessario installare sia il client che il server e OpenSSH upstream non ha mai adottato le modifiche. https://github.com/hyc/OpenSSH-LINEMODE