2011-10-14 13 views
9

Buduję okno terminala w przeglądarce (np. Ajaxterm) i nie wiem, którą sekwencję unikową wysłać do tunelu ssh (otwarty przez paramiko.SSHClient().invoke_shell(term='linux')).co to jest sekwencja ucieczki terminalu dla ctrl + strzałka (lewo, prawo, ...) w TERM = linux

Znalazłem key logger i próbowali go w terminalu z $ TERM == „linux”, ale zwraca taką samą sekwencję dla ctrl+left i left (27,91,68).

Jeśli spróbuję keyloggera w innym terminalu (z $ TERM == 'xterm'), otrzymam kody (27,9, 59,59,53,68). Ale te kody się nie poruszają, generują oczekiwane wyjście z kanału SSH (który przesunie kursor o jedno słowo na normalnej powłoce linuksa). Jest to prawdą, nawet jeśli zaczynam paramiko z term = xterm.

Jakieś pojęcie, którą sekwencję powinienem użyć? Albo dlaczego powyższa sekwencja nie działa?

UPDATE: Byłbym szczęśliwy użyć innego typu terminala (nie „Linux”), ale niestety pyte współpracuje z terminalami VTxxx tylko (wierzę „Linux” jest terminalu VT220 podobny - tak, to działa) więc xterm nie działa poprawnie.

+0

Typowa domyślna konfiguracja readline (bash używa readline) ma "Alt-B" dla ** wstecznego słowa **. terminfo nie ma nawet wpisu dla 'Ctrl-←'. – ninjalj

+0

Ale działa na konsoli xterm ... Czy mógłbyś powiedzieć więcej o terminfo, najlepiej w odpowiedzi? – johndodo

+0

Konsola systemu Linux nie jest nawet * blisko * do vt220. Jest to podzbiór (mniej zdolnego) vt100. Każda odpowiedź na to pytanie zawiera co najmniej jeden błąd. –

Odpowiedz

21

Terminale to urządzenia sprzętowe składające się z klawiatury i urządzenia wyjściowego (początkowo drukarka drukowana, później monitor CRT). Duży komputer może mieć do niego podłączone kilka odległych terminali. Każdy terminal miałby protokół umożliwiający wydajną komunikację z komputerem, w przypadku terminali opartych na CRT obejmuje to specjalne "sekwencje kontrolne" w celu zmiany pozycji kursora, usunięcia części bieżącej linii/ekranu, przełączenia na alternatywny tryb pełnoekranowy,. ..

Emulator terminala to aplikacja emulująca jeden z tych starszych terminali. Pozwala wykonywać funkcje takie jak pozycjonowanie kursora, ustawianie kolorów pierwszego planu i tła, ... Emulatory terminalowe próbują emulować określony protokół terminala, ale każdy ma swój własny zestaw dziwactw i odchyleń.

Systemy uniksowe mają bazy danych opisujące terminale i emulatory terminali, więc aplikacje są pobierane z konkretnego używanego terminala (lub emulatora terminala). Starsza baza danych to termcap(5), a terminfo(5) jest nowszą bazą danych. Te bazy danych umożliwiają aplikacjom wyszukiwanie informacji o możliwościach terminalu w użyciu. Możliwości mogą być wartościami logicznymi, numerycznymi, a nawet łańcuchowymi, np .: jeśli określony typ terminala ma/obsługuje klawisz F12, będzie miał zdolność "key_f12" (długa nazwa terminfo), "kf12" (krótka nazwa terminfo), "F2" (nazwa termcap) opisująca łańcuch, który tworzy klucz. Wypróbuj za pomocą: tput kf12 | od -tx1.

Od programowania bezpośrednio z możliwości może być uciążliwe, aplikacje zazwyczaj korzystają z biblioteki wyższego poziomu jak przekleństw/ncurses, slang, itp ...

Istnieje specjalna zmienna nazywa TERM aplikacji, która mówi, jakiego rodzaju terminala oni rozmawiają z. Ta zmienna powinna być ustawiona dokładnie na typ terminala, jeśli istnieje w bazie danych, dla uzyskania najlepszych wyników. To właśnie mówi aplikacji, które dokładny protokół i odchylenia protokołu ma rozumieć terminal. Zmiana zmiennej TERM powoduje zmianę typu terminala, zmienia tylko typ terminala, z którym aplikacja myśli, że rozmawia.

Wszystko to powiedziawszy, Ctrl+arrow jest zachowaniem xterm (zależnym od opcji konfiguracji), którego nie ma w ogóle w bazach terminfo/termcap, więc większość aplikacji nie będzie o tym wiedziała. Tak czy inaczej, albo twój emulator terminala (w twoim przypadku pyte) obsługuje go, albo nie.

Zakładając, że główne zastosowanie jest bash lub jakaś inna aplikacja, która korzysta z biblioteki readline, można uciec z wykorzystaniem readline za backward-word (Meta-b/Alt-b/ESC b domyślnie konfigurowane w inputrc) zamiast.

8

Szybkie sprawdzenie z od -c ujawnia, że ​​gnome-termainal generuje te wartości:

strzałka w lewo generuje ESC - [ - D. geneates

Control lewej tablicy ESC - [ - 1 - ; - 5 - D

+0

Ok, ale gnome-terminal jest TERM = xterm ... a co z linuxem? – johndodo

+1

Konsola systemu Linux generuje 'ESC'-' ['-DD' dla obu naciśnięć klawiszy. –

+0

Wiem, że tak, napisałem tak ... :) Nadal jest to specyficzne dla konsoli lub specyficzne dla terminala? – johndodo

4

Ctrl + strzałka kody klawiszy zostały wprowadzone przez xterm i tacy Gnome Terminal i KDE Konsole starają się być zgodny z xterm . Rzeczywiste terminale VT100 i VT220 nie mają oddzielnych kodów klawiszy dla takich kombinacji. O ile mi wiadomo, konsola Linuksa ma być kompatybilna z VT100, z pewnymi dodatkami, podczas gdy Xterm emuluje VT220, z wieloma dodatkami.

+0

Początkowo konsola linuksowa próbowała emulować VT100, ale fragment tego (przełączanie między zestawami znaków) został utracony pod koniec lat 90. ubiegłego wieku po dodaniu obsługi UTF-8. Konsola Linux zaimplementowała klawisze funkcyjne (funkcja nie będąca częścią VT100) w oparciu o VT220 (lub implementację xterma na początku lat 90. XX wieku). W przeciwieństwie do xterma funkcja klucza funkcyjnego Linuxa nie została przedłużona. –

Powiązane problemy