Saya memiliki beberapa perangkat yang terhubung ke server jangka serial Cisco; banyak yang berfungsi dengan baik ketika saya telnet
langsung ke port di Cisco. Namun, saya memiliki beberapa perangkat keras kepala yang tidak akan digunakan Backspacekarena dipetakan di telnet secara default.
Dalam hal ini penting, saya telnet dari rxvt
bawah Debian memeras (dalam X Window). TERM
diatur untuk rxvt
, tetapi tidak peduli apakah saya menggunakan vt100
, vt101
atau xterm
... mengubah TERM
tidak berpengaruh. Saya memulai perubahan TERM
berdasarkan apa yang saya lihat di FAQ Kermit lama . FWIW, stty erase ^h
dan stty erase ^?
jangan bekerja juga.
Saya perhatikan bahwa Backspaceberfungsi dengan benar pada perangkat ini jika saya menggunakan soket TCP mentah dari netcat
... yaitu nc 192.168.12.117 2006
; namun, kemudian saya mengalami masalah lain dengan kata sandi yang tidak tersembunyi atau paging terminal.
Bagaimana saya bisa selektif memaksa telnet dan ssh untuk memetakan Backspaceke CtrlHuntuk perangkat ini? Juga, kriteria apa yang harus saya gunakan untuk mengevaluasi apakah ini bug di perangkat?
EDIT
Dalam hal itu penting, ini adalah output dari showkey -a
untuk tombol yang bersangkutan ... ^?
bersesuaian dengan Backspacedan ^H
adalah CtrlH. Sepertinya saya harus semakin dekat ketika saya melihat The Linux Keyboard dan Console Howto , tetapi saya tidak bisa menguraikan apa yang bisa saya lakukan untuk mengubah ini. Saya telah mencoba berbagai mantra loadkeys
tanpa hasil.
[mpenning@hotcoffee docs]$ sudo showkey -a
Press any keys - Ctrl-D will terminate this program
^? 127 0177 0x7f
^H 8 0010 0x08
Saya juga menyertakan keluaran yang relevan dumpkeys
juga ... ini adalah pemetaan saat ini di sistem saya (yang tidak berfungsi pada beberapa perangkat yang dimaksud). Jika saya bisa mencari cara untuk Backspacemelakukan hal yang sama CtrlH, saya akan punya solusi.
[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]$
ssty erase '^?'
? Jika perangkat bersikeras padaC-h
, itu bukan panggilan telnet, itu terminal (emulator).Jawaban:
Saya akhirnya menemukan jawaban di Linux Bar Hall of Shame Anne Baretta ... tampaknya mengubah pemetaan kunci di
xterm
/rxvt
tidak ada gunanyatelnet
.Saya memvalidasi ini ketika saya mengendus koneksi telnet. Pertama saya mengendus sesi telnet dan melihatnya Backspacedikirim
0x7f
ke host. Berikutnya saya sengaja pecah Backspacedirxvt
menggunakanstty erase $
(dengan demikian pemetaan Backspace saya untuk tanda dolar dirxvt
). Setelah melakukan ini, saya harus menekan $backspacerxvt
, tetapitelnet
masih dikirim0x7f
ketika saya menggunakannyaBackspace remote host.LARUTAN
Buat skrip yang disebut
kbdfix
(di bawah), dan buat itu dapat dieksekusi dengan755
izin; Anda akan membutuhkantclsh
danexpect
paket yang dimuat dari arsip distribusi Anda.Sekarang untuk terhubung ke host yang rusak, saya mengetik
kbdfix telnet 192.168.12.117 2006
, dan Backspaceberfungsi.Catatan untuk siapa pun yang bingung pada tahun 2006 di atas ... yaitu port TCP yang digunakan server istilah Cisco untuk koneksi serial ke konsol perangkat yang rusak (dalam hal ini, sakelar Brocade FCX).
Jika Anda hanya melakukan telnetting ke perangkat yang tidak suka Backspace, Anda akan menggunakannya
kbdfix telnet <addr_of_the_broken_device>
. Saya juga menggunakan ini dengan ssh ketika saya ssh ke switch Ethernet DLink DGS-3200 yang memiliki masalah serupa; sintaksnya adalahkbdfix ssh 172.16.1.26
.sumber
stty erase $
tidak memetakan kunci "backspace" ke "$", itu memberitahu driver tty bahwa untuk menghapus karakter, kunci "$" perlu digunakan. Ketika Anda menjalankan telnet, Anda berada dalam mode mentah sehingga pengaturan ini diabaikan. Solusi sederhana adalah mengonfigurasi emulator terminal Anda untuk mengirim ^ H untuk backspace, seperti yang diinginkan dewa, yang lain menggunakan peretasan Anda yang menerjemahkan karakter ini dengan cepat menggunakan ekspektasi.stty
tidak berubahtelnet
berbunyi saat saya gunakanwireshark
; Namun, fakta penting ini tidak jelas bagi saya sampai saya mengendus. Saya akan menyelidiki bagaimana saya dapat mengubah Backspace untuk digunakanControl_h
dalamrxvt
... atau mungkin saya perlu berpikir tentang menemukan istilah lain.stty
perlu dijalankan di sisi aplikasi. Saya sangat ragutelnet
menerjemahkan karakter input atau yang perlu Anda gunakanscript
; hanya berjalanstty
di mesin jarak jauh mungkin akan melakukan trik.stty
.Enter
mengirimkannya. Saat Anda menggunakan telnet, terminal Anda dalam mode mentah: setiap karakter dikirim langsung ke aplikasi. Lihat misalnya awal halaman ini , atau artikel Wikipedia ini .Backspace dan Control-H dirancang untuk menjadi hal yang sama tetapi saat ini, terutama di Linux, Anda sering memiliki backspace mengirim hapus dan hapus mengirimkan beberapa urutan pelarian yang aneh.
Dalam kasus apa pun dan sejauh yang saya tahu, telnet atau variabel TERM tidak boleh mengubah apa yang dikirimkan oleh backspace, ini biasanya merupakan fitur konfigurasi terminal emulator.
sumber
telnet
tidak memperhatikan pemetaan terminal lokal dari keyboard. Catatan Anne Barreta tentang keyboard dan telnetProgram seharusnya menanyakan pengaturan terminal untuk mengetahui apa karakter backspace (
^h
dan^?
, yaitu\010
dan\177
, adalah dua pilihan di luar sana). Gunakanstty erase '^h'
ataustty erase '^?'
untuk menyatakan apa yang dikirim terminal Anda.Jika Anda log in jarak jauh (dengan telnet, rsh atau ssh) di dalam terminal, perhatikan bahwa Anda harus berjalan
stty
di sisi aplikasi .stty
tidak memberi tahu terminal untuk melakukan sesuatu yang berbeda, itu menginformasikan driver terminal lokal (yaitu bagian yang berinteraksi dengan aplikasi yang berjalan di terminal) tentang pengaturan terminal (secara historis objek fisik, sekarang emulator terminal). Demikian pula, jika Anda menjalankan Layar atau perangkat lunak terminal-in-terminal serupa, Anda perlu menjalankanstty
di setiap jendela layar (tetapi biasanya Layar dapat dikonfigurasi untuk melakukan hal yang benar dari file konfigurasinya, jika tidak berfungsi di luar kotak) ).Perbedaan perilaku yang Anda amati dari
netcat
vstelnet
adalah karena cara terminal digunakan: * Di netcat, terminal berada dalam mode baris-per-baris (juga disebut "mode matang"). Anda mengedit sebuah baris (menggunakan fitur edisi built-in terminal lokal, dan khususnya pengaturan stty lokal), kemudian mengirimkannya dalam keadaan akhir ke host jarak jauh. * Dalam telnet, terminal (lokal) berada dalam mode karakter-per-karakter (juga disebut "mode mentah"). Setiap keystroke langsung ke telnet yang langsung merelay ke sistem remote. Anda bergantung pada fitur edisi garis sistem jarak jauh.Ada program yang rusak di luar sana yang tidak peduli dengan pengaturan terminal. Sepertinya Anda pernah menjumpai salah satunya. Taruhan terbaik Anda adalah mengubah konfigurasi terminal Anda. Hal yang sama berlaku jika Anda perlu berkomunikasi dengan perangkat melalui protokol jarak jauh seperti telnet atau SSH dan perangkat tidak dapat dikonfigurasi.
Dengan xterm, mudah: ada pengaturan untuk mengganti karakter yang dikirim oleh BackSpacekunci saat run-time. Dari menu tombol kiri, ganti “Delete is DEL”. Secara terprogram, kirim urutan pelepasan
\e[?67h
untuk BackSpacemengirim^h
, atau\e[?67l
untuk BackSpacemengirim^?
. Sumber daya yang sesuai adalahXTerm.backarrowKeyIsErase
. Emulator terminal lain mungkin atau mungkin tidak memiliki fitur antarmuka yang sama atau mendukung urutan pelarian.Banyak emulator terminal mengirim salah satu
^h
atau^?
ketika Anda menekan BackSpace, dan karakter lainnya ketika Anda menekan Ctrl+ BackSpace. Ini bisa bermanfaat dalam keadaan darurat.Perhatikan bahwa
showkeys
dan teman hanya relevan di konsol Linux, bukan di dalam X.sumber