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?
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?
Odpowiedzi:
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 ^R
strzał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).
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ę.
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.
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
.
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!
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łowem „ ssh 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).
Możesz naśladować to zachowanie, jeśli po prostu uruchamiasz polecenia, wykonując,
ssh user @ targetmachine 'moje polecenia w ciągu'
ale,
ssh-agent
lub wpisać hasłoMoż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\'
To robi co chcesz. Musisz jednak zainstalować zarówno klienta, jak i serwer, a OpenSSH nigdy nie zaakceptował zmian. https://github.com/hyc/OpenSSH-LINEMODE