Paksa telnet / ssh untuk menggunakan crtl-H untuk backspace

9

Saya memiliki beberapa perangkat yang terhubung ke server jangka serial Cisco; banyak yang berfungsi dengan baik ketika saya telnetlangsung 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 rxvtbawah Debian memeras (dalam X Window). TERMdiatur untuk rxvt, tetapi tidak peduli apakah saya menggunakan vt100, vt101atau xterm... mengubah TERMtidak berpengaruh. Saya memulai perubahan TERMberdasarkan apa yang saya lihat di FAQ Kermit lama . FWIW, stty erase ^hdan 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 -auntuk tombol yang bersangkutan ... ^?bersesuaian dengan Backspacedan ^Hadalah 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 loadkeystanpa 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 dumpkeysjuga ... 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]$
Mike Pennington
sumber
1
Sudahkah Anda mencoba ssty erase '^?'? Jika perangkat bersikeras pada C-h, itu bukan panggilan telnet, itu terminal (emulator).
Gilles 'SANGAT berhenti menjadi jahat'
@Gilles komentar Anda sebenarnya tidak benar, lihat jawaban saya di bawah ini
Mike Pennington

Jawaban:

10

Saya akhirnya menemukan jawaban di Linux Bar Hall of Shame Anne Baretta ... tampaknya mengubah pemetaan kunci di xterm/ rxvttidak ada gunanyatelnet .

Saya memvalidasi ini ketika saya mengendus koneksi telnet. Pertama saya mengendus sesi telnet dan melihatnya Backspacedikirim 0x7fke host. Berikutnya saya sengaja pecah Backspacedi rxvtmenggunakan stty erase $(dengan demikian pemetaan Backspace saya untuk tanda dolar di rxvt). Setelah melakukan ini, saya harus menekan $backspace rxvt, tetapi telnetmasih dikirim 0x7fketika saya menggunakannyaBackspace remote host.

LARUTAN

Buat skrip yang disebut kbdfix(di bawah), dan buat itu dapat dieksekusi dengan 755izin; Anda akan membutuhkan tclshdan expectpaket yang dimuat dari arsip distribusi Anda.

#!/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"}
}

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 adalah kbdfix ssh 172.16.1.26.

Mike Pennington
sumber
2
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.
jlliagre
@ jlliagre, ya, saya menemukan bagaimana keyboard sttytidak berubah telnetberbunyi saat saya gunakan wireshark; Namun, fakta penting ini tidak jelas bagi saya sampai saya mengendus. Saya akan menyelidiki bagaimana saya dapat mengubah Backspace untuk digunakan Control_hdalam rxvt... atau mungkin saya perlu berpikir tentang menemukan istilah lain.
Mike Pennington
@ Mike: Saya pikir Anda masih bingung tentang sesuatu (yang saya akui tidak jlliagre atau saya sebutkan secara eksplisit; Saya telah memperbarui jawaban saya). sttyperlu dijalankan di sisi aplikasi. Saya sangat ragu telnetmenerjemahkan karakter input atau yang perlu Anda gunakan script; hanya berjalan sttydi mesin jarak jauh mungkin akan melakukan trik.
Gilles 'SANGAT berhenti menjadi jahat'
@Gilles, mesin jarak jauh adalah perangkat jaringan, tidak ada stty.
Mike Pennington
1
@ Mike: Ketika Anda menggunakan netcat, terminal Anda dalam mode matang: Anda menulis baris, mengeditnya secara lokal , dan Entermengirimkannya. Saat Anda menggunakan telnet, terminal Anda dalam mode mentah: setiap karakter dikirim langsung ke aplikasi. Lihat misalnya awal halaman ini , atau artikel Wikipedia ini .
Gilles 'SO- stop being evil'
3

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.

Jlliagre
sumber
Pertanyaan Anda didasarkan pada asumsi bahwa telnet melakukan pemrosesan spesifik dari backspace key yang saya yakini salah. Seharusnya saya menempatkan itu sebagai komentar bukannya jawaban memang.
jlliagre
AFAICT, telnettidak memperhatikan pemetaan terminal lokal dari keyboard. Catatan Anne Barreta tentang keyboard dan telnet
Mike Pennington
Saya khawatir Anda salah memahami apa yang dilakukan stty.
jlliagre
3

Program seharusnya menanyakan pengaturan terminal untuk mengetahui apa karakter backspace ( ^hdan ^?, yaitu \010dan \177, adalah dua pilihan di luar sana). Gunakan stty erase '^h'atau stty 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 . sttytidak 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 menjalankan sttydi 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 netcatvs telnetadalah 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[?67luntuk BackSpacemengirim ^?. Sumber daya yang sesuai adalah XTerm.backarrowKeyIsErase. Emulator terminal lain mungkin atau mungkin tidak memiliki fitur antarmuka yang sama atau mendukung urutan pelarian.

Banyak emulator terminal mengirim salah satu ^hatau ^?ketika Anda menekan BackSpace, dan karakter lainnya ketika Anda menekan Ctrl+ BackSpace. Ini bisa bermanfaat dalam keadaan darurat.

Perhatikan bahwa showkeysdan teman hanya relevan di konsol Linux, bukan di dalam X.

Gilles 'SANGAT berhenti menjadi jahat'
sumber