web-dev-qa-db-ja.com

バックスペースにctrl-Hを使用するようにtelnet / sshを強制する

一部のデバイスをCiscoシリアルタームサーバーに接続しています。多くの場合、シスコのポートに直接telnetすると正常に動作します。しかし、私は使用しないいくつかの頑固なデバイスを持っています Backspace デフォルトではtelnetにマッピングされているため。

問題がある場合は、Debian squeeze(Xウィンドウ)でrxvtからtelnetを実行します。 TERMrxvtに設定されていますが、vt100vt101、または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は CtrlHLinuxキーボードとコンソールのハウツー を見ると、近づいているように見えますが、これを変更するために何ができるかを解読することはできません。 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]$
9
Mike Pennington

Anne BarettaのLinuxキーボードホールオブシェイム でようやく答えが見つかりました(---)... xterm/rxvtでキーマッピングを変更しても、telnetには効果がないようです

Telnet接続をスニッフィングしたときにこれを検証しました。まず、Telnetセッションを傍受し、それを見ました Backspace0x7fをホストに送信しました。次に私は故意に壊した Backspacerxvtstty erase $を使用して(つまり、バックスペースをrxvtのドル記号にマッピングします)。これを行った後、私は $rxvtのバックスペースに追加しましたが、telnet0x7fを送信しました。 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接続しているだけの場合 Backspacekbdfix telnet <addr_of_the_broken_device>を使用します。同様の問題があるDLink DGS-3200イーサネットスイッチにSSHで接続する場合にも、SSHでこれを使用しています。構文はkbdfix ssh 172.16.1.26です。

10
Mike Pennington

BackspaceとControl-Hは同じものになるように設計されましたが、最近では特にLinuxで、バックスペース送信と削除送信の奇妙なエスケープシーケンスが頻繁に発生します。

いずれにせよ、私が知る限り、TelnetやTERM変数はバックスペースの送信内容を変更するべきではありません。これは通常、ターミナルエミュレータの構成機能です。

3
jlliagre

プログラムは、端末設定を照会して、バックスペース文字が何であるかを調べることになっています(^h^?、つまり\010\177は、2つの選択肢です)。 stty erase '^h'またはstty erase '^?'を使用して、端末が送信するものを宣言します。

ターミナル内でリモートからログインする場合(Telnet、rsh、またはsshを使用)、アプリケーション側でsttyを実行する必要があることに注意してくださいsttyは、端末に何か異なることを指示しません。ローカルターミナルドライバー(つまり、端末で実行されているアプリケーションとインターフェースする部分)に端末(歴史的には物理オブジェクト、現在は端末エミュレーター)について通知します設定。同様に、Screenまたは同様のターミナルインターミナルソフトウェアを実行する場合は、各画面ウィンドウでsttyを実行する必要があります(ただし、通常は、構成ファイルからScreenが正しく動作するように構成できます) t箱から出して動作します)。

netcattelnetで観察される動作の違いは、ターミナルの使用方法によるものです。* 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内では関連しないことに注意してください。