Czy istnieje sposób na uniknięcie opóźnienia pisania SSH?


43

Czy mogę powiedzieć SSH, aby wysłał dane dopiero po naciśnięciu klawisza Enter lub Tab, a nie po każdym naciśnięciu klawisza?


Bardzo mnie interesuje, gdzie masz takie opóźnienie pisania, że ​​nie możesz z tym pracować. Użyłem ssh w erze modemu i nigdy nie spotkałem się z tymi problemami.
mailq

4
Uzyskuję dostęp do SliceHost VPS (USA) z Belgii. Opóźnienie jest na tyle zauważalne, że wprawiło mnie w zakłopotanie. Zauważyłem jednak, że inni wydają się tym mniej przejmować niż ja ..
StackedCrooked


@mailq nie korzystasz z 3G w 2019 roku? sshing z wiejskiej rezydencji wiejskiej lub metra bardziej przypomina robienie połączenia modemowego
POMATu

Odpowiedzi:


32

Nie, ponieważ SSH nie ma możliwości dowiedzenia się, czy to, co wpisujesz, wymaga Enter lub Tab do działania - jeśli próbujesz przejrzeć historię poleceń, na przykład ^Rstrzałki lub w górę nie zostaną wysłane sami, a to byłoby ... nieprzyjemne.

Jednak nie musisz czekać między każdą postacią, aby pojawiła się na ekranie; jeśli wiesz, co musisz wpisać, zrób to tak szybko, jak zechcesz, a terminal nadrobi zaległości w czasie około jednej podróży w obie strony od momentu, gdy przestałeś pisać, co jest tak dobre, jak będziesz mógł i tak konfiguracja buforowana w linii (utrata pakietów jest inna, ale wprowadza własne ciekawe dziwactwa).


Byłbym bardzo zainteresowany znalezieniem sposobu na przetestowanie prędkości pisania na klawiaturze ssh na kilku maszynach. Zauważyłem, że prędkość może różnić się DUŻO między maszynami znajdującymi się w tym samym miejscu i że nie mają na nich żadnego dużego obciążenia. Moja teoria jest taka, że ​​dzieje się tak zwłaszcza w przypadku małych instancji AWS (takich jak mikro lub mini).
sorin

1
Spójrz na papier Mosha. Autor przeprowadził testy porównawcze mosh.org/#techinfo
user7610

25

PuTTY oferuje dwie funkcje, które mogą być przydatne: „lokalne echo” i „lokalna edycja linii”. Lokalna edycja linii buforuje wszystko i wysyła ją do serwera dopiero po powrocie linii. Może to znacznie ułatwić obsługę wiersza poleceń, ale może także sprawić, że korzystanie z edytora tekstu będzie piekłem.

PuTTY ma również kilka innych opcji włączania / wyłączania niektórych rzeczy (algorytm Nagle), które mogą wpływać na postrzegane opóźnienie połączenia. Widzę, że klient OpenSSH nie oferuje wszystkich funkcji, które PuTTY ma w tym zakresie, i nie znam alternatywy dla Linuksa.

W przeciwnym razie womble ma rację.


To powinna być zaakceptowana odpowiedź
Freddie Fabregas

Nie udało mi się zainstalować PuTTY na macOS, czy jest zamiennik?
Aero Windwalker

Kit na Linuksie to trochę ból. Nie można połączyć się ponownie automatycznie, pokazuje komunikat po rozłączeniu i muszę ponownie otworzyć okno. Chciałbym móc użyć czegoś takiego jak Kitty lub Plink.exe na Linuksie lub lepiej, aby jakoś ulepszyć autossh. Niektóre urządzenia nie obsługują mosh tho (jeśli próbuję uzyskać dostęp do mojego domowego routera openwrt)
POMATu

22

Mosh został zaprojektowany, aby rozwiązać dokładnie ten problem. Jest przeznaczony do stosowania w przypadku połączeń o dużym opóźnieniu i niewiarygodnych oraz zapewnia lokalną edycję echa i linii.


Możesz zainstalować go w lokalnym katalogu ze źródła bez sudo. Zobacz także mosh.org. Mówi: „Brak uprzywilejowanego kodu. Bez demona. Nie musisz być superużytkownikiem, aby zainstalować lub uruchomić Mosh. Klient i serwer to pliki wykonywalne uruchamiane przez zwykłego użytkownika i trwające tylko przez całe połączenie”.
Steven C. Howell,

1
Uwaga: Mosh nie jest SSH. Korzysta z własnego, zastrzeżonego protokołu. (Nie mam z tym jednak problemu.)
user7610

Działa to od podstaw dla Androida i domowej sieci Wi-Fi. Wie o readline
tinmarino

9

Otwórz sesję ssh za pomocą ssh host.example.org bash(lub jakiejkolwiek powłoki, której chcesz użyć).

Otrzymasz tryb buforowania linii do zdalnej powłoki, co oznacza, że ​​nie otrzymasz monitu i edycji linii, ale dostaniesz lokalne echo i tryb „jedna linia na raz”. Czasami jest to przydatne podczas pracy z bardzo złym połączeniem. Nie wszystkie programy będą działały poprawnie, ponieważ nie będziesz mieć pseudo-tty, ale większość narzędzi UNIX działa dobrze.

Aktualizacja:

Korzystając z powyższej sztuczki, możesz uzyskać normalną edycję linii ( readline ) na lokalnym końcu za pomocą wygodnego programu do pakowania o nazwie rlfe . Po prostu biegnij rlfe ssh host.example.org bash.


1
Próbowałem i nie uważałem tego za bardzo wykonalne. Ale fajnie jest wiedzieć, dzięki.
StackedCrooked

to działa dla mnie wspaniale.
lakesare

6

Miałem ten sam problem ( duże opóźnienia i utratę pakietów z powodu okropnej jakości danych mobilnych w niektórych lokalizacjach) i mosh nie wycinał go dla mnie (potrzebuje specjalnych programów na wszystkich zdalnych hostach, naprawiając UTF8 lokalnie i zdalnie na wszystkich serwerach bez ich uszkodzenia , modyfikując wszystkie zapory ogniowe - i tak naprawdę nie zapewnia edycji linii lokalnej) Zdecydowałem się napisać małe opakowanie, aby zapewnić tryb edycji linii lokalnej dla ssh .

Domyślnie po prostu przekazuje wszystko do ssh w domyślnym trybie char-by-char, ale możesz nacisnąć klawisz skrótu, aby w dowolnym momencie przejść do trybu edycji linii lokalnej opartego na readline. Możesz więc wprowadzić (z edycją, przywołaniem poleceń itp.) Całą linię lokalnie, a następnie po naciśnięciu klawisza enter zostanie wysłany jako jeden pakiet TCP na stronę zdalną.

Zaletą jest wolne od opóźnień edytowanie wiersza poleceń (takie jak stary gotowany / kanoniczny telnet „tryb buforowany wiersz po wierszu”, ale z lepszymi poleceniami edycji zapewnianymi przez readline GNU ). Ponadto nie trzeba nic zmieniać na serwerach ani zaporach ogniowych. Edytory i inne programy oparte na przekleństwach nadal działają normalnie (aczkolwiek z opóźnieniem) w domyślnym trybie char-by-char jak w normalnym połączeniu ssh.

Wadą jest to, że albo musisz nacisnąć klawisz skrótu, aby przejść do trybu edycji linii lokalnej za każdym razem, gdy tego chcesz, albo musisz zmodyfikować monit na zdalnym hoście, aby umożliwić automatyczne wykrywanie. Ponadto zdalne uzupełnianie nazw plików kart działa obecnie tylko poprzez przeniesienie cię z powrotem do trybu char-by-char (lub używa lokalnego systemu plików zamiast zdalnego, w zależności od twoich preferencji). Trwają prace, więc prośby o wyciągnięcie ręki lub praktyczne pomysły na ulepszenia są mile widziane!


Po niekonwencjonalnej stronie można alternatywnie użyć SSHFS do lokalnego zamontowania zdalnego systemu plików.

Zaletą jest nie tylko to, że twoja powłoka (i jej edycja linii) jest lokalna i wolna od opóźnień, ale także, że możesz nawigować po zdalnym systemie plików i używać uzupełniania nazw plików powłoki ( klawisz Tab ) w przypadku plików zdalnych. Ponadto (najlepsza funkcja IMHO) możesz użyć lokalnego edytora do bez opóźnień edycji zdalnych plików.

Wadami są (zwłaszcza jeśli łącze ma również niską przepustowość, a nie tylko duże opóźnienia), że każdy plik do edycji musi być w pełni przeniesiony do localhost, a następnie po edycji ponownie w pełni przeniesiony do zdalnego. SSHFS nie przewiduje jakiegoś buforowania (patrz sshfs (1) Opcje pamięci podręcznej , cache_timeout , cache_x_timeout ), aby złagodzić problemy, że nieco. Ponadto, jeśli chcesz wykonać coś na pilocie, musisz użyć innego ekranu lub poprzedzić wszystkie polecenia słowemssh remotehost ” (na przykład ssh remotehost sudo service apache restart). Zobacz opcję ControlMaster w ssh_config (5), aby przyspieszyć wykonanie (i bez pytania o hasło).


3

Możesz naśladować to zachowanie, jeśli po prostu uruchamiasz polecenia, wykonując,

ssh user @ targetmachine 'moje polecenia w ciągu'

ale,

  1. dodaje to dodatkowe opóźnienie w tworzeniu połączenia (można je złagodzić za pomocą połączeń master / shared ssh )
  2. jeśli nie masz klucza prywatnego bez hasła, musisz go użyć ssh-agentlub wpisać hasło
  3. najwyraźniej nie działa, jeśli wchodzisz w interakcje z menu lub edytujesz pliki itp.

1

Możesz użyć tmux, aby uzyskać płynne echo pisania. Uruchom tmux lokalnie. Jeśli masz powłokę ssh w jednym okienku, a lokalną powłokę w okienku poniżej, to z lokalnego panelu możesz wysłać klucze do zdalnego panelu.

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

Interaktywne polecenia i małe polecenia piszę bezpośrednio w opóźnionej powłoce ssh. Gdy tylko opóźnienie zacznie utrudniać pisanie, przełączam się do lokalnego panelu i używam klawiszy wysyłania. Działa to nawet w trakcie pisania polecenia.

Aby to zrobić, dodałem to do mojego .bashrc

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

Podziękowania dla Christiana Pelczarskiego za wyjaśnienie kluczy wysyłania: https://minimul.com/increased-developer-productivity-with-tmux-part-5.html

Na przykład będziesz musiał uciec, używając cudzysłowów

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.