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


9

シスコのシリアルタームサーバーに接続されているデバイスがあります。telnetシスコのポートに直接アクセスすると、多くが正常に動作します。ただし、Backspaceデフォルトではtelnetにマッピングされているため、使用しない頑固なデバイスがいくつかあります。

問題がある場合はrxvt、Debian squeeze(Xウィンドウ)からtelnetで接続します。 TERM設定されているrxvtが、それは私が使用するかどうかは関係ありませんvt100vt101またはxterm変更することは... TERM何の効果もありません。私TERM古いカーミットFAQで見たものに基づいて変更の道を歩み始めました。FWIW、stty erase ^hそしてstty erase ^?どちらも動作しません。

... Backspaceからのraw TCPソケットを使用すると、これらのデバイスで正しく動作することに気付きました。ただし、その場合、非表示ではないパスワードやターミナルページングに関する他の問題が発生します。netcatnc 192.168.12.117 2006

これらのデバイスに対してtelnetおよびsshを選択的に強制的にマップBackspaceするにCtrlHはどうすればよいですか?また、これがデバイスのバグかどうかを評価するには、どの基準を使用すればよいですか?

編集

重要な場合、これはshowkey -a問題のキーのからの出力です...に^?対応しBackspace^HですCtrlHLinuxのキーボードとコンソールのHowtoを見ると、もう少し近づいているように見えますが、これを変更するために何ができるかを理解することができません。いろいろな呪文を試し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]$

1
試しましたssty erase '^?'か?デバイスがをC-h要求する場合、それはtelnetの呼び出しではなく、端末(エミュレーター)の呼び出しです。
Gilles 'SO-悪をやめる'

@ギレスあなたのコメントは実際には正しくありません、以下の私の答えを参照してください
マイクペニントン

回答:


10

アンバレッタのLinuxキーボードホールオブシェイムでようやく答えが見つかりました... キーのマッピングをxterm/rxvttelnet変更しても、は役に立たないようです

Telnet接続をスニッフィングしたときにこれを検証しました。まず、Telnetセッションを傍受し、それがホストにBackspace送信されるの0x7fを見ました。次に、意図的Backspacerxvt使用をstty erase $中断しました(このため、Backspaceをのドル記号にマッピングしていrxvtます)。これを行った後、で$バックスペースにヒットする必要rxvttelnetありまし0x7fBackspaceが、リモートホストで使用した場合でも送信されました。

解決

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年で混乱した人への注意...壊れたデバイス(この場合、Brocade FCXスイッチ)のコンソールへのシリアル接続にCisco用語サーバーが使用するTCPポートです。

気に入らないデバイスにtelnet接続するだけの場合はBackspace、を使用しますkbdfix telnet <addr_of_the_broken_device>。同様の問題があるDLink DGS-3200イーサネットスイッチにsshするときにも、sshでこれを使用しています。構文はkbdfix ssh 172.16.1.26です。


2
stty erase $「バックスペース」キーを「$」に​​マップしません。文字を消去するには「$」キーを使用する必要があることをttyドライバーに伝えます。telnetを実行するとrawモードになるため、この設定は無視されます。簡単な解決策は、ターミナルエミュレーターを構成してバックスペースに^ Hを送信することです。別の方法は、期待を使用してこれらの文字をその場で変換するハックを使用することです。
jlliagre

@jlliagre、はい、使用したときにキーボードの読み取りがどのようにstty変更されないかを発見しました。しかし、この重要な事実は、私が嗅ぐまでははっきりしませんでした。私は私が使用してBackspaceキーを変更する方法を調査する中で...または多分私は別の用語を見つけることについて考える必要があります。telnetwiresharkControl_hrxvt
マイクペニントン

@マイク:私はあなたがまだ何か混乱していると思います(jlliagreも私も明示的に言ったことは認めません。私は私の答えを更新しました)。sttyアプリケーション側で実行する必要があります。telnet入力文字の変換、または使用する必要があるかどうかは非常に疑わしいですscriptsttyリモートマシンで実行するだけでおそらくうまくいくでしょう。
Gilles「SO-邪悪なことをやめなさい」

@ギレス、リモートマシンはネットワークデバイスであり、持っていませんstty
Mike Pennington、

1
@マイク:netcatを使用すると、端末はクックドモードになります。行を書き込んでローカルで編集し、Enter送信します。telnetを使用すると、端末はrawモードになります。各文字はすぐにアプリケーションに送信されます。このページの最初、またはこのウィキペディアの記事などを参照してください
Gilles「SO-邪悪なこと

3

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

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


あなたの質問は、Telnetがバックスペースキーの特定の処理を行っているという仮定に基づいています。確かにそれを答えではなくコメントとして入れるべきだった。
jlliagre

AFAICT telnetは、キーボードのローカル端末のマッピングに注意を払いません。 アンネ・バレッタのキーボードとTelnetに関するメモ
マイクペニントン

私はあなたがsttyが何をしているのか誤解していると思います。
jlliagre

3

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

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

あなたから観察すること挙動の違いnetcat対はtelnet、端末を使用する方法が原因である:* netcatを、端末は(も「調理モード」と呼ばれる)のライン・バイ・ラインモードです。(ローカル端末の組み込みエディション機能を使用して、特にローカルstty設定を使用して)行を編集し、最終的な状態でリモートホストに送信します。* Telnetでは、(ローカル)端末は文字単位のモード(「ローモード」とも呼ばれます)です。すべてのキーストロークは直接telnetに送られ、すぐにリモートシステムにリレーされます。リモートシステムのラインエディション機能に依存しています。

端末の設定を気にしない壊れたプログラムがあります。それらの1つに遭遇したようです。あなたの最善の策は、端末の設定を変更することです。TelnetやSSHなどのリモートプロトコルを介してデバイスと通信する必要があり、デバイスを構成できない場合も同様です。

xtermを使用すると簡単ですBackSpace。実行時にキーによって送信される文字を切り替える設定があります。左側のボタンメニューから[削除はDEL]に切り替えます。プログラムで、エスケープシーケンス \e[?67hBackSpace送信してsendを送信^hするか\e[?67lBackSpacesendを送信します^?。対応するリソースはXTerm.backarrowKeyIsEraseです。他の端末エミュレータは、同様のインターフェース機能を備えていたり、備えていなかったり、エスケープシーケンスをサポートしている場合があります。

多くの端末エミュレータのいずれ送っ^hたり^?するときに押しBackSpaceを押すとき、およびその他の文字をCtrl+ BackSpace。これはピンチに役立ちます。

showkeysおよび友人はLinuxコンソールでのみ関連し、X内では関連しないことに注意してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.