一部のデバイスをCiscoシリアルタームサーバーに接続しています。多くの場合、シスコのポートに直接telnet
すると正常に動作します。しかし、私は使用しないいくつかの頑固なデバイスを持っています Backspace デフォルトではtelnetにマッピングされているため。
問題がある場合は、Debian squeeze(Xウィンドウ)でrxvt
からtelnetを実行します。 TERM
はrxvt
に設定されていますが、vt100
、vt101
、またはxterm
を使用するかどうかは関係ありません... TERM
を変更しても効果はありません。 古いKermit FAQ で見たものに基づいて、TERM
を変更することから始めました。 FWIW、stty erase ^h
およびstty erase ^?
も機能しません。
気づいた Backspace 生のTCPソケットfrom netcat
...つまりnc 192.168.12.117 2006
を使用する場合、これらのデバイスで正しく動作しますが、非表示でないパスワードやターミナルページングで他の問題が発生します。
TelnetとSSHを選択的に強制的にマップするにはどうすればよいですか Backspace に CtrlH これらのデバイス用?また、これがデバイスのバグかどうかを評価するには、どの基準を使用すればよいですか?
重要な場合、これは問題のキーに対するshowkey -a
からの出力です... ^?
は Backspace そして^H
は CtrlH。 Linuxキーボードとコンソールのハウツー を見ると、近づいているように見えますが、これを変更するために何ができるかを解読することはできません。 loadkeys
を使用してさまざまな呪文を試しても効果はありません。
[mpenning@hotcoffee docs]$ Sudo showkey -a
Press any keys - Ctrl-D will terminate this program
^? 127 0177 0x7f
^H 8 0010 0x08
dumpkeys
からの関連する出力も含めています...これは私のシステムの現在のマッピングです(問題の一部のデバイスでは機能しません)。入手方法がわかれば Backspace 同じことをする CtrlH、私は解決策を持っているでしょう。
[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]$
Anne BarettaのLinuxキーボードホールオブシェイム でようやく答えが見つかりました(---)... xterm
/rxvt
でキーマッピングを変更しても、telnet
には効果がないようです 。
Telnet接続をスニッフィングしたときにこれを検証しました。まず、Telnetセッションを傍受し、それを見ました Backspace0x7f
をホストに送信しました。次に私は故意に壊した Backspacerxvt
でstty erase $
を使用して(つまり、バックスペースをrxvt
のドル記号にマッピングします)。これを行った後、私は $rxvt
のバックスペースに追加しましたが、telnet
は0x7f
を送信しました。 Backspace リモートホスト上。
kbdfix
(以下)というスクリプトを作成し、755
権限で実行可能にします。配布アーカイブからロードされたtclsh
およびexpect
パッケージが必要になります。
#!/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"}
}
壊れたホストに接続するために、kbdfix telnet 192.168.12.117 2006
と入力し、 Backspace 動作します。
上記の2006年までに混乱した人への注意...つまり、TCPポートは、Cisco用語サーバーが、壊れたデバイス(この場合、Brocade FCXスイッチ)のコンソールへのシリアル接続に使用します)。
気に入らないデバイスにtelnet接続しているだけの場合 Backspace、kbdfix telnet <addr_of_the_broken_device>
を使用します。同様の問題があるDLink DGS-3200イーサネットスイッチにSSHで接続する場合にも、SSHでこれを使用しています。構文はkbdfix ssh 172.16.1.26
です。
BackspaceとControl-Hは同じものになるように設計されましたが、最近では特にLinuxで、バックスペース送信と削除送信の奇妙なエスケープシーケンスが頻繁に発生します。
いずれにせよ、私が知る限り、TelnetやTERM変数はバックスペースの送信内容を変更するべきではありません。これは通常、ターミナルエミュレータの構成機能です。
プログラムは、端末設定を照会して、バックスペース文字が何であるかを調べることになっています(^h
と^?
、つまり\010
と\177
は、2つの選択肢です)。 stty erase '^h'
またはstty erase '^?'
を使用して、端末が送信するものを宣言します。
ターミナル内でリモートからログインする場合(Telnet、rsh、またはsshを使用)、アプリケーション側でstty
を実行する必要があることに注意してください 。 stty
は、端末に何か異なることを指示しません。ローカルターミナルドライバー(つまり、端末で実行されているアプリケーションとインターフェースする部分)に端末(歴史的には物理オブジェクト、現在は端末エミュレーター)について通知します設定。同様に、Screenまたは同様のターミナルインターミナルソフトウェアを実行する場合は、各画面ウィンドウでstty
を実行する必要があります(ただし、通常は、構成ファイルからScreenが正しく動作するように構成できます) t箱から出して動作します)。
netcat
とtelnet
で観察される動作の違いは、ターミナルの使用方法によるものです。* netcatでは、ターミナルは行単位のモードです(「クックドモード」)。 (ローカル端末の組み込みエディション機能を使用して、特にローカルstty設定を使用して)行を編集し、最終的な状態でリモートホストに送信します。 * Telnetでは、(ローカル)端末は文字単位モード(「ローモード」とも呼ばれます)です。すべてのキーストロークは直接telnetに送られ、すぐにリモートシステムにリレーされます。リモートシステムのラインエディション機能に依存しています。
端末の設定を気にしない壊れたプログラムがあります。それらの1つに遭遇したようです。あなたの最善の策は、端末の設定を変更することです。 TelnetやSSHなどのリモートプロトコルを介してデバイスと通信する必要があり、デバイスを構成できない場合も同様です。
Xtermを使用すると、簡単です。送信された文字を切り替える設定があります。 BackSpace 実行時のキー。左側のボタンメニューから、[削除はDEL]に切り替えます。プログラムで エスケープシーケンス\e[?67h
を送信して BackSpace^h
または\e[?67l
を送信して BackSpace^?
を送信します。対応するリソースはXTerm.backarrowKeyIsErase
です。他の端末エミュレータは、同様のインターフェース機能を備えていたり、備えていなかったり、エスケープシーケンスをサポートしている場合があります。
多くの端末エミュレータは、押すと^h
または^?
のいずれかを送信します BackSpaceを押すと、他の文字 Ctrl+BackSpace。これはピンチに役立ちます。
showkeys
とその仲間はLinuxコンソールでのみ関連し、X内では関連しないことに注意してください。