Backspace, Tab nie działa w terminalu (przy użyciu ssh)


37

Kiedy ssh do innego komputera z Debianem z moim kontem (z uprawnieniami sudo), mój klawisz backspace generuje kilka dziwnych symboli po naciśnięciu. Również Tabi delprzyciski nie działają zbyt.

Z drugiej strony mam też inne konto na tej samej maszynie, a kiedy ssh przez to konto, jego terminal działa doskonale. Nie mogłem zrozumieć, dlaczego tak się dzieje.

Odpowiedzi:


37

Widziałem już takie problemy.

Weźmy na przykład backspace, zdalny host oczekuje, że jakiś znak zostanie użyty jako „wymazanie / backspace”, podczas gdy naciskasz backspace w terminalu, program terminalowy wyśle ​​część znaku do zdalnego hosta, jeśli to, czego oczekuje zdalny host, różni się od znaków wysłanych przez program terminalowy, możesz napotkać ten problem. Szybka poprawka jest następująca:

  1. uruchom polecenie #stty -ana zdalnym hoście i znajdź kod wyjściowy, który powinien być kodem do usunięcia. Powiedzmy erase=^?.
  2. W terminalu wpisz Ctrlvi naciśnij klawisz Backspace. Zobaczysz, jaki kod jest wysyłany jako „wymaż”. Powiedz, że tak ^H.
  3. Na zdalnym hoście uruchom #stty erase ^H.
    (Uwaga: użyj Ctrlv+ Backspace, nie wpisuj ^ ręcznie)

Możesz naprawić problem z kartami tak samo jak powyżej.


Mój znak backspace to jakiś specjalny symbol, coś w rodzaju odwróconego trójkąta. Więc to nie działa
gopi1410,

1
Ten prosty komentarz jest z pewnością najlepszym rozwiązaniem, jakie widziałem. Czuje się jak kludge, ale działa.
Paulo Matos,

To zadziałało dla mnie! Nie rozumiem jednak, dlaczego moja powłoka obsługuje backspace zgodnie z oczekiwaniami, ale czytanie ze standardowego wejścia w mojej aplikacji nie. Dokonanie sugerowanej zmiany powoduje, że backspace działa dla obu. Rozumiem, że powłoka obsługuje buforowanie stdin, więc czy obsługa backspace nie powinna być taka sama dla powłoki i aplikacji?
Samuel

1
Co jeśli żaden kod nie zostanie wysłany? Ctrlv + backspace nie produkuje nic ...
Manfredo

Dla mnie kod backspace jest taki sam jak stty -awynik, ale nadal nie działa
Matej J

36

Oprócz rozwiązania „stty” możesz wypróbować rozwiązanie „TERM”.

Ssh do swojego Debiana z jakiegoś terminala (putty, solaris dterm, debain xterm, you-name-it), ten terminal ogłasza możliwości (w tym klucze takie jak Backspace i Tab) poprzez zmienną środowiskową TERM.

Tak więc po ssh do hosta unix (nie zależy to od debiana, czy innego hosta) ustaw zmienną TERM zgodnie z terminalem. Rozważ, że używasz bash jako powłoki, a vt100 jako terminala:

export TERM=vt100

ps: TERM powinien być zapowiadany automatycznie przez ssh, ale w niektórych okolicznościach ta magia zawodzi.


wciąż nie działa :(
gopi1410

Z jakiego terminala korzystasz? A jaką wartość TERM próbowałeś?
Paul

Próbowałem vt100. Jak poznać wartość TERM? Próbowałem ssh z cygwin (w systemie Windows) do Debiana. Jeśli są problemy z cygwinem, próbowałem nawet z terminalu ubuntu, ale ten sam problem.
gopi1410

Nie jestem pewien, czy cygwin ma dobrą emulację terminala, o ile wiem, cygwin po prostu używa zwykłej konsoli Windows, która nie ma emulacji terminala (może być niepoprawna). Od Ubuntu wszystko powinno działać dobrze. Coś nie tak z biblioteką powłoki lub termcap na Debianie. Zaloguj się z Ubuntu i przekaż mi wynik poleceń: 1. echo $ TERM 2. stty -a
paul

2
Chociaż nie pomogło mi to bezpośrednio, ponieważ TERM został poprawnie ustawiony, pomógł zidentyfikować problem. Brakowało mi wpisów terminfo dla mojego terminala. Korzystam z urxvt i na łuku musisz zainstalować rxvt-unicode-terminfo, aby rozwiązać ten konkretny problem
Xandaros

15

Wynika to z tego, że domyślną powłoką jest shpo bashprostu uruchomić bashz powłoki.

bash

Aby ustawić bashjako domyślną powłokę:

chsh -s /bin/bash 

lub

sudo chsh -s /bin/bash yourusername

2
Ten naprawił to dla mnie. Nigdy nawet nie patrzę na moją powłokę logowania!
James Pack

2
Widzę ten problem, ale moja powłoka jest bash.
fraxture

6

Twoja powłoka może być ustawiona na /bin/shzamiast/bin/bash


1
Powiązane z tą odpowiedzią: unix.stackexchange.com/questions/50542/...
Samuel


Byłoby to bardziej pomocne, gdyby wyjaśnił nieco więcej i jak to zmienić, ale to był mój problem. Dzięki @Tom za Twój link, który rozwiązał problem.
Jake

To był powód w moim przypadku .. dla tego konkretnego użytkownika. Nie zdefiniowano żadnej powłoki /etc/passwd, gdy dodałem :/bin/bashdo jego linii, zadziałało. Możesz dowiedzieć się, z jaką powłoką jest używanyecho $0
MSpreij

6

Zwykle używam tego, aby naprawić wyjście funky postaci w moim terminalu. Resetuje wszystkie znaki specjalne do ich wartości domyślnych.

stty sane

Ze strony stty man:

to samo co cread -ignbrk brkint -inlcr -igncr icrnl -iutf8 -ixoff -iuclc -ixany imaxbel opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0 isig icanon iexten echo echo-ech -xcase -tostop -echoprt echoctl echoc, wszystkie znaki specjalne do wartości domyślnych


2

nad odpowiedzią Pawła, jeśli chcesz zachować możliwość uzyskania kolorowych wydruków, możesz użyć xterm-88color

echo 'export TERM=xterm-88color' >> ~/.bashrc
source ~/.bashrc

1
toe -apokazuje listę obsługiwanych typów terminali ... nie xterm-88colorjest zdecydowanie jedyną opcją i może być niedostępna w niektórych systemach.
0xC0000022L
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.