Backspace, Tab không hoạt động trong terminal (sử dụng ssh)


37

Khi tôi ssh vào một máy khác có Debian bằng tài khoản của mình (có quyền sudo), phím backspace của tôi sẽ tạo ra một số biểu tượng khó xử khi nhấn. Ngoài ra Tab& delcác phím không hoạt động quá.

Mặt khác, tôi cũng có một tài khoản khác trên cùng một máy và khi tôi ssh thông qua tài khoản này, thiết bị đầu cuối của nó hoạt động hoàn toàn tốt. Tôi không thể hiểu tại sao điều này xảy ra.

Câu trả lời:


37

Tôi đã thấy những vấn đề như vậy trước đây.

Lấy ví dụ về backspace, máy chủ từ xa mong muốn một số ký tự được sử dụng là "xóa / xóa lùi", trong khi bạn nhấn backspace trong thiết bị đầu cuối, chương trình thiết bị đầu cuối sẽ gửi một số ký tự đến máy chủ từ xa, nếu những gì máy chủ từ xa mong đợi các ký tự được gửi bởi chương trình đầu cuối, bạn sẽ gặp phải vấn đề này. Vì vậy, một sửa chữa nhanh chóng như sau:

  1. chạy lệnh #stty -atrong máy chủ từ xa và tìm thấy những gì được dự kiến ​​là một mã xóa trong đầu ra. Nói erase=^?.
  2. Trong thiết bị đầu cuối, nhập Ctrlvvà nhấn backspace của bạn. Bạn sẽ thấy mã nào được gửi dưới dạng "xóa". Nói là có ^H.
  3. Trong máy chủ từ xa, chạy #stty erase ^H.
    (Lưu ý: sử dụng Ctrlv+ Backspace, không nhập ^ thủ công)

Bạn có thể khắc phục sự cố Tab giống như trên.


Nhân vật backspace của tôi là một số biểu tượng đặc biệt giống như một hình tam giác ngược. Vì vậy, nó không hoạt động
gopi1410

1
Nhận xét đơn giản này chắc chắn là giải pháp tốt nhất tôi đã thấy cho điều này. Nó cảm thấy giống như một loại bùn nhưng nó hoạt động.
Paulo Matos

Điều này làm việc cho tôi! Điều tôi không hiểu là tại sao shell của tôi xử lý backspace như mong đợi, nhưng đọc từ stdin trong ứng dụng của tôi thì không. Thực hiện thay đổi đề xuất của bạn dẫn đến backspace làm việc cho cả hai. Sự hiểu biết của tôi là shell xử lý bộ đệm stdin, vì vậy không nên xử lý backspace giống nhau cho cả shell và ứng dụng?
Samuel

1
Điều gì nếu không có mã nào được gửi? Ctrlv + backspace không tạo ra gì ...
Manfredo

Đối với tôi, mã backspace giống như stty -ađầu ra, nhưng vẫn không hoạt động
Matej J

36

Bên cạnh giải pháp "stty", bạn có thể thử giải pháp "HẠN".

Bạn ssh đến Debian của bạn từ một số thiết bị đầu cuối (putty, solaris dterm, debain xterm, you-name-it), khả năng thông báo thuật ngữ này (bao gồm các khóa như Backspace và Tab) thông qua biến môi trường TERM.

Vì vậy, sau khi ssh thành máy chủ unix (nó không phụ thuộc vào debian nó hoặc máy chủ khác), hãy đặt biến TERM theo thiết bị đầu cuối của bạn. Hãy xem xét bạn đang sử dụng bash làm shell và vt100 làm thiết bị đầu cuối:

export TERM=vt100

ps: TERM nên được thông báo qua ssh một cách tự động, nhưng trong một số trường hợp, phép thuật này thất bại.


vẫn không hoạt động :(
gopi1410

Bạn đang sử dụng thiết bị đầu cuối nào? Và giá trị của HẠN bạn đã thử là gì?
paul

Tôi đã thử vt100. Làm thế nào để tôi biết giá trị của HẠN? Tôi đã thử ssh từ cygwin (trong windows) sang Debian. Nếu có vấn đề với cygwin, tôi thậm chí đã thử nó từ thiết bị đầu cuối Ubuntu, nhưng vấn đề tương tự.
gopi1410

Không chắc chắn Cygwin có mô phỏng thiết bị đầu cuối tốt, theo như tôi biết, cygwin chỉ sử dụng bảng điều khiển windows thông thường mà thiếu mô phỏng thiết bị đầu cuối (có thể sai). Từ ubfox tất cả sẽ hoạt động tốt. Một cái gì đó sai với thư viện shell hoặc termcap trên debian. Đăng nhập từ Ubuntu và cung cấp cho tôi đầu ra của các lệnh: 1. echo $ TERM 2. stty -a
paul

2
Mặc dù điều này không trực tiếp giúp tôi, vì TERM đã được đặt chính xác, nhưng nó đã giúp xác định vấn đề. Tôi đã thiếu các mục terminfo cho thiết bị đầu cuối của tôi. Tôi đang sử dụng urxvt và trên vòm, bạn cần cài đặt rxvt-unicode-terminfo để khắc phục sự cố cụ thể này
Xandaros

15

Điều này là do shell mặc định của bạn sh, để sử dụng bash, chỉ cần chạy bashtừ shell của bạn.

bash

Để đặt bashlàm vỏ mặc định của bạn:

chsh -s /bin/bash 

hoặc là

sudo chsh -s /bin/bash yourusername

2
Cái này đã sửa nó cho tôi. Không bao giờ mặc dù nhìn vào vỏ đăng nhập của tôi!
James Pack

2
Tôi đang nhìn thấy vấn đề này, nhưng vỏ của tôi là bash.
3:22

6

Vỏ của bạn có thể được đặt thành /bin/shthay vì/bin/bash


1
Liên quan đến câu trả lời này: unix.stackexchange.com/questions/50542/iêu
Samuel


Điều này sẽ hữu ích hơn nếu nó giải thích thêm một chút và cách thay đổi nó, nhưng đó là vấn đề tôi gặp phải. Cảm ơn @Tom vì liên kết của bạn đã khắc phục sự cố cho tôi.
Jake

Đây là lý do trong trường hợp của tôi .. cho người dùng cụ thể đó. Không có vỏ được xác định trong /etc/passwd, khi tôi thêm vào :/bin/bashdòng của nó, nó hoạt động. Bạn có thể tìm hiểu shell nào đang được sử dụng vớiecho $0
MSpreij

6

Tôi thường sử dụng điều này để sửa bất kỳ đầu ra ký tự sôi nổi nào trong thiết bị đầu cuối của tôi. Nó đặt lại tất cả các ký tự đặc biệt về giá trị mặc định của chúng.

stty sane

Từ trang stty man:

giống như cread -ignbrk brkint -inlcr -igncr icrnl -iutf8 -ixoff -iuclc -ixany imaxbel opost -olcuc -ocnl onlcr -onoc -onlret -ofill -xcase -tostop -echoprt echoctl echoke, tất cả các ký tự đặc biệt cho các giá trị mặc định của chúng


2

Trên câu trả lời của paul, nếu bạn muốn giữ lại khả năng có đầu ra đầy màu sắc, bạn có thể sử dụng xterm-88color

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

1
toe -ahiển thị danh sách các loại thiết bị đầu cuối được hỗ trợ ... xterm-88colorcho đến nay không phải là tùy chọn duy nhất và trên thực tế có thể không có sẵn trên các hệ thống cụ thể.
0xC0000022L
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.