Telnet / ssh'yi geri silme için crtl-H kullanmaya zorla


9

Cisco seri terim sunucusuna bağlı bazı aygıtlarım var; birçoğu telnetdoğrudan Cisco'daki bağlantı noktasına gittiğimde iyi çalışıyor . Ancak, Backspacevarsayılan olarak telnet'te eşleştirildiği için kullanmayacak birkaç inatçı cihazım var .

Önemli olması durumunda, rxvtDebian sıkıştırmasının altından telnet yapıyorum (X Penceresinde). TERMayarlandığında rxvt, ancak kullandığım olsun önemli değil vt100, vt101ya da xtermdeğişen ... TERMetkisi yoktur. Eski bir Kermit SSS'deTERM gördüklerime dayanarak değişim yoluna başladım . FWIW, ve ya çalışmaz.stty erase ^hstty erase ^?

Ben Backspaceham bir TCP soketi kullanırsanız bu cihazlarda doğru çalışır fark ettim netcat... ie nc 192.168.12.117 2006; Ancak, daha sonra şifreleri gizli veya terminal sayfalama ile diğer sorunları koşmak.

Seçmeli şekilde nasıl eşlemek için telnet ve ssh zorlayabilir Backspaceiçin CtrlHbu cihazlar için? Ayrıca, bunun cihazdaki bir hata olup olmadığını değerlendirmek için hangi kriterleri kullanmalıyım?

DÜZENLE

Bu konularda durumda, bu çıktısı olan showkey -a... Söz konusu anahtarlar için ^?karşılık gelir Backspaceve ^Hbir CtrlH. Linux Klavye ve Konsol Nasıl Yapılır'a baktığımda yaklaşmalıyım gibi görünüyor , ancak bunu değiştirmek için ne yapabileceğimi çözemiyorum. loadkeysEtkisi olmayan çeşitli büyüler denedim .

[mpenning@hotcoffee docs]$ sudo showkey -a

Press any keys - Ctrl-D will terminate this program

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

Ben de ilgili çıktı da dahil ediyorum dumpkeys... Bu benim sistemdeki geçerli eşleme (söz konusu bazı cihazlarda çalışmaz). Eğer Backspaceaynı şeyi nasıl yapacağımı bulabilseydim CtrlH, bir çözümüm olurdu.

[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
Denedin ssty erase '^?'mi Cihazlar bir ısrar ediyorsa, C-htelnet çağrısı değil, terminal (emülatör) 'dir.
Gilles 'SO- kötü olmayı bırak'

@Gilles yorumunuz aslında doğru değil, aşağıdaki cevabımı görün
Mike Pennington

Yanıtlar:


10

Sonunda Anne Baretta'nın Linux Klavye Utanç Salonu'nda bir cevap buldum ... Görünüşe göre / içindeki önemli eşlemeleri değiştirmekxtermrxvttelnet işe yaramıyor .

Telnet bağlantısını kokladığımda bunu doğruladım. Önce telnet oturumunu kokladım ve bunu sunucuya Backspacegönderdiğini gördüm 0x7f. Sonra kasıtlı Backspaceolarak rxvtkullanarak kırdı stty erase $(böylece Backspace dolar oturum açma harita rxvt). Bunu yaptıktan sonra $geri inmek zorunda kaldım rxvt, ancak uzak ana bilgisayarda kullandığımda telnetyine de gönderdim .0x7fBackspace

ÇÖZÜM

kbdfix(Aşağıda) adlı bir komut dosyası oluşturun ve 755izinlerle çalıştırılabilir yapın ; dağıtım arşivlerinizden tclshve expectpaketlerine yüklenmiş olmanız gerekir .

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

Şimdi kırık ana bilgisayarlara bağlanmak için yazıyorum kbdfix telnet 192.168.12.117 2006ve Backspaceçalışıyor.

Yukarıda 2006 yılına kadar kafası karışmış olan herkes için not ... bu, Cisco term sunucusunun kırık cihazın konsoluna seri bağlantı için kullandığı TCP portudur (bu durumda, bir Brocade FCX anahtarı).

Sadece hoşlanmayan bir cihaza telnet Backspaceyapıyorsanız, kullanırsınız kbdfix telnet <addr_of_the_broken_device>. Ben de benzer sorunları olan bir DLink DGS-3200 Ethernet anahtarına ssh ssh ile bunu kullanıyorum; sözdizimi kbdfix ssh 172.16.1.26.


2
stty erase $"backspace" tuşunu "$" ile eşlemez, tty sürücüsüne bir karakteri silmek için "$" tuşunun kullanılması gerektiğini söyler. Telnet'i çalıştırdığınızda, ham modda olursunuz, bu nedenle bu ayar yok sayılır. Basit bir çözüm, terminal emülatörünüzü geri alan için ^ H gönderecek şekilde yapılandırmaktır, tanrının amaçladığı gibi, başka bir tanesi, beklediğinizi kullanarak bu karakteri anında çeviren hackinizi kullanıyor.
jlliagre

@jlliagre, evet, kullandığımda klavye okumalarını nasıl sttydeğiştirmediğini keşfettim ; ancak koklamayana kadar bu önemli gerçek benim için net değildi. Ben kullanmak için Backspace nasıl değişebileceğinin araştıracağız içinde ... ya da belki bir dönem bulma konusunda düşünmek gerekir. telnetwiresharkControl_hrxvt
Mike Pennington

@Mike: Sanırım hala bir şey hakkında kafanız karıştı (ne jlliagre'yi ne de açıkça bahsetmiştim; cevabımı güncelledim). sttyuygulama tarafında çalışması gerekir. telnetGiriş karakterlerini çevirmekte veya kullanmanız gerektiğinden şüpheliyim script; sadece sttyuzak makinede çalışan muhtemelen hile yapacak.
Gilles 'SO- kötü olmayı bırak'

@Gilles, uzak makine bir ağ cihazıdır, yoktur stty.
Mike Pennington

1
@Mike: netcat kullandığınızda, terminaliniz pişmiş modda: bir satır yazar, yerel olarak düzenler ve Entergönderir. Telnet kullandığınızda, terminaliniz ham moddadır: her karakter hemen uygulamaya gönderilir. Örneğin, bu sayfanın başlangıcına veya bu Wikipedia makalesine bakın .
Gilles 'SO- kötü olmayı bırak'

3

Backspace ve Control-H aynı şey olacak şekilde tasarlanmıştır, ancak günümüzde, özellikle Linux'ta, sık sık silme ve silme işlemlerini bazı tuhaf kaçış dizileri göndererek sık sık geri alanınız vardır.

Her durumda ve bildiğim kadarıyla, telnet veya TERM değişkeni, backspace'in gönderdiği şeyi değiştirmemelidir, bu genellikle bir terminal emülatör yapılandırma özelliğidir.


Sorunuz telnet'in yanlış olduğuna inandığım geri tuşu anahtarının belirli bir şekilde işlendiği varsayımına dayanıyor. Bunu bir cevap yerine bir yorum olarak koymalıydım.
jlliagre

AFAICT, telnetklavyenin yerel terminal eşlemelerine dikkat etmez. Anne Barreta'nın klavye ve telnet ile ilgili notları
Mike Pennington

Korkarım stty'nin ne yaptığını yanlış anlıyorsun.
jlliagre

3

Programlar (arkayı karakteri ne olduğunu öğrenmek için, terminal ayarları sorgulamak gerekiyor ^hve ^?, ie \010ve \177iki seçenek vardır dışarı,). Terminalinizin ne gönderdiğini bildirmek için stty erase '^h'veya stty erase '^?'düğmesini kullanın .

Terminal içinde uzaktan (telnet, rsh veya ssh ile) oturum açarsanız stty , uygulama tarafında çalıştırmanız gerektiğini unutmayın . sttyterminale farklı bir şey yapmasını söylemez, yerel terminal sürücüsünü (yani terminalde çalışan uygulamalarla arayüz oluşturan kısım) terminal (geçmişte fiziksel bir nesne, şimdi bir terminal emülatörü) ayarları hakkında bilgilendirir. Benzer şekilde, Screen veya benzeri bir terminal terminali yazılımını çalıştırırsanız stty, her ekran penceresinde çalışmanız gerekir (ancak genellikle kutunun dışında çalışmazsa, Ekran yapılandırma dosyasından doğru şeyi yapacak şekilde yapılandırılabilir) ).

Eğer gelen gözlemlemek davranışlardan fark netcatvs. telnet* netcat, terminal (aynı zamanda “pişmiş modu” olarak adlandırılır) çizgi-by-line modunda olduğunda: nedeniyle terminali kullanılan yol etmektir. Bir satırı (yerel terminalin yerleşik sürüm özelliğini ve özellikle de yerel stty ayarlarını kullanarak) düzenler, ardından son durumunda uzak ana bilgisayara gönderirsiniz. * Telnet'te, (yerel) terminal karakter karakter moddadır (“ham mod” olarak da adlandırılır). Her tuş vuruşu doğrudan telnet'e gider ve bu da onu hemen uzak sisteme aktarır. Uzaktaki sistemin satır sürümü özelliklerine bağımlısınız.

Orada terminal ayarlarını umursamayan kırık programlar var. Görünüşe göre bunlardan biriyle karşılaştınız. En iyi seçeneğiniz terminalinizin yapılandırmasını değiştirmektir. Telnet veya SSH gibi uzak bir protokol üzerinden bir cihazla iletişim kurmanız gerekiyorsa ve cihaz yapılandırılamıyorsa da aynı şey geçerlidir.

Xterm ile çok kolaydır: BackSpaceçalışma zamanında tuş tarafından gönderilen karakteri değiştirmek için bir ayar vardır . Sol düğme menüsünden “Sil DEL” tir. Programlı, göndermek kaçış dizisini \e[?67h olması BackSpacegönderme ^hveya \e[?67lsahip olmak BackSpacesend ^?. Karşılık gelen kaynak XTerm.backarrowKeyIsErase. Diğer terminal emülatörleri benzer bir arayüz özelliğine sahip olabilir veya olmayabilir veya kaçış dizisini destekleyebilir.

Çoğu terminal öykünücüsü , tuşuna bastığınızda ^hveya ^?tuşuna bastığınızda BackSpacediğer karakteri Ctrl+ tuşuna bastığınızda gönderir BackSpace. Bu bir tutam yararlı olabilir.

Not olduğunu showkeysve arkadaşlar X. içinde, Linux konsolunda sadece ilgili değildir

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.