Buộc telnet / ssh sử dụng crtl-H cho backspace


9

Tôi có một số thiết bị được kết nối với máy chủ nối tiếp của Cisco; nhiều hoạt động tốt khi tôi telnettrực tiếp đến cổng trên Cisco. Tuy nhiên, tôi có một vài thiết bị cứng đầu sẽ không sử dụng Backspacevì nó được ánh xạ trong telnet theo mặc định.

Trong trường hợp có vấn đề, tôi telnet từ rxvtDebian ép (trong Cửa sổ X). TERMđược thiết lập để rxvt, nhưng nó không quan trọng cho dù tôi sử dụng vt100, vt101hoặc xterm... thay đổi TERMkhông có tác dụng. Tôi bắt đầu con đường thay đổi TERMdựa trên những gì tôi thấy trong Câu hỏi thường gặp về Kermit cũ . FWIW, stty erase ^hstty erase ^?cũng không hoạt động.

Tôi đã nhận thấy rằng Backspacehoạt động chính xác trên các thiết bị này nếu tôi sử dụng ổ cắm TCP thô từ netcat... tức là nc 192.168.12.117 2006; tuy nhiên, sau đó tôi gặp phải các vấn đề khác với mật khẩu không bị ẩn hoặc phân trang đầu cuối.

Làm cách nào tôi có thể buộc chọn telnet và ssh để ánh xạ Backspacetới CtrlHcác thiết bị này? Ngoài ra, tôi nên sử dụng tiêu chí nào để đánh giá xem đây có phải là lỗi trong thiết bị không?

BIÊN TẬP

Trong trường hợp có vấn đề, đây là đầu ra từ showkey -acho các phím trong câu hỏi ... ^?tương ứng với Backspace^HCtrlH. Có vẻ như tôi nên đến gần khi nhìn vào Bàn phím và Bàn điều khiển Linux , nhưng dường như tôi không thể giải mã những gì tôi có thể làm để thay đổi điều này. Tôi đã thử các câu thần chú khác nhau loadkeysmà không có hiệu quả.

[mpenning@hotcoffee docs]$ sudo showkey -a

Press any keys - Ctrl-D will terminate this program

^?      127 0177 0x7f
^H        8 0010 0x08

Tôi cũng bao gồm cả đầu ra có liên quan từ dumpkeys... đây là ánh xạ hiện tại trong hệ thống của tôi (không hoạt động trên một số thiết bị được đề cập). Nếu tôi có thể tìm ra cách để Backspacelàm điều tương tự CtrlH, tôi sẽ có một giải pháp.

[mpenning@hotcoffee docs]$ sudo dumpkeys | grep -Ei "backspace|127"
keycode   8 = BackSpace        ampersand        braceleft       
keycode  14 = BackSpace        Delete          
        control keycode  14 = BackSpace       
keycode 127 =
[mpenning@hotcoffee docs]$

1
Bạn đã thử ssty erase '^?'chưa Nếu các thiết bị nhấn mạnh vào C-h, đó không phải là cuộc gọi của telnet, thì đó là thiết bị đầu cuối (trình giả lập).
Gilles 'SO- ngừng trở nên xấu xa'

@Gilles bình luận của bạn thực sự không chính xác, xem câu trả lời của tôi dưới đây
Mike Pennington

Câu trả lời:


10

Cuối cùng tôi đã tìm thấy một câu trả lời trong Phòng xấu hổ Bàn phím Linux của Anne Baretta ... có vẻ như việc thay đổi ánh xạ chính trong xterm/ rxvtkhông tốt cho việc nàytelnet .

Tôi xác nhận điều này khi tôi đánh hơi kết nối telnet. Đầu tiên tôi đánh hơi phiên telnet và thấy nó Backspaceđược gửi 0x7fđến máy chủ. Tiếp theo, tôi cố ý phá vỡ Backspacetrong rxvtsử dụng stty erase $(như vậy, lập bản đồ Backspace của tôi vào dấu $ rxvt). Sau khi làm điều này, tôi phải nhấn $vào backspace trong rxvt, nhưng telnetvẫn được gửi 0x7fkhi tôi sử dụng Backspacetrên máy chủ từ xa.

GIẢI PHÁP

Tạo một tập lệnh được gọi là kbdfix(bên dưới) và làm cho nó có thể thực thi được với các 755quyền; bạn sẽ cần tclshexpectcác gói được tải từ kho lưu trữ phân phối của bạn.

#!/usr/bin/expect

#Name this file as kbdfix and make it executable in your path
eval spawn -noecho $argv

interact {
 \177        {send "\010"}
 "\033\[3~"  {send "\177"}
}

Bây giờ để kết nối với các máy chủ bị hỏng, tôi gõ kbdfix telnet 192.168.12.117 2006Backspacelàm việc.

Lưu ý cho bất kỳ ai bị nhầm lẫn vào năm 2006 ở trên ... đó là cổng TCP mà máy chủ hạn của Cisco sử dụng cho kết nối nối tiếp với bảng điều khiển của thiết bị bị hỏng (trong trường hợp này là công tắc Brocade FCX).

Nếu bạn chỉ đơn thuần là dịch chuyển đến một thiết bị không thích Backspace, bạn sẽ sử dụng kbdfix telnet <addr_of_the_broken_device>. Tôi cũng đang sử dụng điều này với ssh khi tôi chuyển sang bộ chuyển mạch DLink DGS-3200 Ethernet có vấn đề tương tự; cú pháp là kbdfix ssh 172.16.1.26.


2
stty erase $không ánh xạ khóa "backspace" thành "$", nó nói với trình điều khiển tty rằng để xóa một ký tự, phím "$" cần được sử dụng. Khi bạn chạy telnet, bạn đang ở chế độ thô nên cài đặt này bị bỏ qua. Một giải pháp đơn giản là cấu hình trình giả lập thiết bị đầu cuối của bạn để gửi ^ H cho backspace, như ý định của thần, một cách khác là sử dụng bản hack của bạn để dịch các ký tự này khi đang sử dụng.
jlliagre

@jlliagre, vâng, tôi đã phát hiện ra cách sttykhông thay đổi telnetbàn phím đọc khi tôi sử dụng wireshark; tuy nhiên, sự thật quan trọng này không rõ ràng với tôi cho đến khi tôi sụt sịt. Tôi sẽ điều tra làm thế nào tôi có thể thay đổi Backspace để sử dụng Control_htrong rxvt... hoặc có lẽ tôi cần suy nghĩ về việc tìm một thuật ngữ khác.
Mike Pennington

@Mike: Tôi nghĩ rằng bạn vẫn còn bối rối về điều gì đó (điều mà tôi thừa nhận cả jlliagre và tôi không đề cập rõ ràng; tôi đã cập nhật câu trả lời của mình). sttycần phải chạy về phía ứng dụng. Tôi rất nghi ngờ telnetlà dịch các ký tự đầu vào hoặc bạn cần sử dụng script; Chỉ cần chạy sttytrên máy từ xa có thể sẽ thực hiện các mẹo.
Gilles 'SO- ngừng trở nên xấu xa'

@Gilles, máy từ xa là một thiết bị mạng, nó không có stty.
Mike Pennington

1
@Mike: Khi bạn sử dụng netcat, thiết bị đầu cuối của bạn ở chế độ nấu chín: bạn viết một dòng, chỉnh sửa cục bộEntergửi nó. Khi bạn sử dụng telnet, thiết bị đầu cuối của bạn ở chế độ thô: mỗi ký tự được gửi ngay đến ứng dụng. Xem ví dụ: phần đầu của trang này hoặc bài viết Wikipedia này .
Gilles 'SO- ngừng trở nên xấu xa'

3

Backspace và Control-H được thiết kế giống nhau nhưng ngày nay, đặc biệt là trên Linux, bạn thường có backspace gửi xóa và xóa gửi một số chuỗi thoát kỳ lạ.

Trong mọi trường hợp và theo như tôi biết, telnet hoặc biến TERM không nên thay đổi những gì backspace gửi, đây thường là một tính năng cấu hình trình mô phỏng đầu cuối.


Câu hỏi của bạn dựa trên giả định telnet đang xử lý cụ thể khóa backspace mà tôi tin là sai. Tôi nên đã đặt nó như là một nhận xét thay vì một câu trả lời thực sự.
jlliagre

AFAICT, telnetkhông chú ý đến ánh xạ thiết bị đầu cuối cục bộ của bàn phím. Ghi chú của Anne Barreta về bàn phím và telnet
Mike Pennington

Tôi sợ bạn đang hiểu nhầm những gì stty làm.
jlliagre

3

Các chương trình được yêu cầu truy vấn các thiết lập đầu cuối để tìm ra ký tự backspace là gì ( ^h^?, tức là \010\177, là hai lựa chọn ngoài kia). Sử dụng stty erase '^h'hoặc stty erase '^?'để khai báo những gì thiết bị đầu cuối của bạn gửi.

Nếu bạn đăng nhập từ xa (bằng telnet, rsh hoặc ssh) bên trong thiết bị đầu cuối, lưu ý rằng bạn phải chạy stty ở phía ứng dụng . sttykhông yêu cầu thiết bị đầu cuối làm bất cứ điều gì khác biệt, nó thông báo cho trình điều khiển thiết bị đầu cuối cục bộ (tức là phần có giao diện với các ứng dụng đang chạy trong thiết bị đầu cuối) về thiết bị đầu cuối (trước đây là một đối tượng vật lý, hiện là trình giả lập thiết bị đầu cuối). Tương tự, nếu bạn chạy Màn hình hoặc phần mềm đầu cuối tương tự, bạn cần chạy sttytrong mỗi cửa sổ màn hình (nhưng thông thường Màn hình có thể được cấu hình để thực hiện đúng từ tệp cấu hình của nó, nếu nó không hoạt động ).

Sự khác biệt trong hành vi mà bạn quan sát netcatso với telnetlà do cách sử dụng thiết bị đầu cuối: * Trong netcat, thiết bị đầu cuối ở chế độ từng dòng (còn được gọi là chế độ nấu chín chín). Bạn chỉnh sửa một dòng (sử dụng tính năng phiên bản tích hợp của thiết bị đầu cuối cục bộ, và cụ thể là cài đặt stty cục bộ), sau đó gửi nó ở trạng thái cuối cùng đến máy chủ từ xa. * Trong telnet, thiết bị đầu cuối (cục bộ) ở chế độ theo từng ký tự (còn được gọi là chế độ thô thô). Mỗi tổ hợp phím đi trực tiếp vào telnet sẽ chuyển tiếp nó ngay lập tức đến hệ thống từ xa. Bạn phụ thuộc vào các tính năng phiên bản dòng của hệ thống từ xa.

Có những chương trình bị hỏng ngoài kia không quan tâm đến cài đặt thiết bị đầu cuối. Có vẻ như bạn đã gặp một trong số họ. Đặt cược tốt nhất của bạn là thay đổi cấu hình thiết bị đầu cuối của bạn. Điều tương tự cũng xảy ra nếu bạn cần giao tiếp với thiết bị qua giao thức từ xa như telnet hoặc SSH và thiết bị không thể định cấu hình.

Với xterm, thật dễ dàng: có một cài đặt để chuyển đổi ký tự được gửi bởi BackSpacekhóa trong thời gian chạy. Từ menu nút bên trái, chuyển đổi Xóa Xóa là DEL XÓA. Lập trình, gửi dãy thoát \e[?67h để có BackSpacegửi ^h, hoặc \e[?67lBackSpacegửi ^?. Tài nguyên tương ứng là XTerm.backarrowKeyIsErase. Các trình giả lập thiết bị đầu cuối khác có thể có hoặc không có tính năng giao diện tương tự hoặc hỗ trợ chuỗi thoát.

Nhiều trình giả lập thiết bị đầu cuối gửi một ^hhoặc hoặc ^?khi bạn nhấn BackSpacevà ký tự khác khi bạn nhấn Ctrl+ BackSpace. Điều này có thể hữu ích trong một nhúm.

Lưu ý rằng showkeysvà bạn bè chỉ có liên quan trên bảng điều khiển Linux, không phải trong X.

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.