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

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

Cisco Serial Term Server には複数のデバイスが接続されていますが、telnetCisco ポートに直接接続すると、多くのデバイスが正常に動作します。ただし、BackspaceデフォルトではTelnetにマッピングされているため、使用しない頑固なデバイスがあります。

場合に備えて、rxvtDebian squeezeからリモートで(X Windowで)ログインしました。 TERMに設定されていますが、または...をrxvt使用して変更しても効果はありません。プロジェクトで見たことに基づいて変化の道を歩き始めました。vt100vt101xtermTERMTERM旧コミットに関するよくある質問。 FWIW、stty erase ^hそれもstty erase ^?動作しません。

生のTCPソケットを使用するとBackspace...これらのデバイスでは正常に動作しますが、パスワードが隠されていないか、端末ページングに関連する他の問題があります。netcatnc 192.168.12.117 2006

telnetとsshがこれらのデバイスBackspaceに選択的にマッピングされるようにするにはどうすればよいですか?CtrlHまた、これがデバイスのバグであるかどうかを評価するためにどの基準を使用する必要がありますか?

編集する

showkey -a重要な場合、合計に対応する関連キーの出力は次の^?とおりです。Backspaceもう少し詳しく見なければなりません。^HCtrlHLinux キーボードおよびコンソールガイドしかし、これを変更するために何ができるかを解読できないようです。いろいろな注文を試してみましたが、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

ついに答えを見つけました。アンバレタのLinuxキーボード数値の殿堂...のように見えるxterm/でキーマッピングを変更してもrxvt利点はありません。telnet

Telnet接続をスニッフィングしたときにこれを確認しました。まず、TelnetセッションをスニッフィングしてホストにBackspace送信されることを確認しました。次に、意図的に使用を0x7f中止しました(したがって、バックスペースキーをドル記号にマッピング)。これを行った後、バックスペースを押す必要がありますが、リモートホストで使用している場合でも転送されます。Backspacerxvtstty erase $rxvt$rxvttelnet0x7fBackspace

解決策

(下)というスクリプトを作成し、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年に混乱している人のための注意事項...これは、Cisco用語サーバーが破損したデバイス(この場合はBrocade FCXスイッチ)のコンソールへのシリアル接続に使用するTCPポートです。

Backspace気に入らないデバイスにkbdfix telnet <addr_of_the_broken_device>Telnetを接続する場合kbdfix ssh 172.16.1.26

答え2

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

ターミナル内でリモートでログインする場合(telnet、rsh、またはsshを使用)、以下を実行する必要があります。stty アプリケーションの観点からstty端末に他の操作を指示せずに、ローカル端末ドライバ(つまり、端末で実行されているアプリケーションと対話する部分)に端末設定(歴史的には物理オブジェクト、現在は端末エミュレータ)について通知します。同様に、Screenまたは同様のターミナル間ソフトウェアを実行している場合は、すべての画面ウィンドウで実行する必要がありますstty(ただし、Screenは通常機能しない場合は設定ファイルで正しい操作を実行するように設定できます)ボックスの)。

netcat観察された動作の違いは、telnet端末の使用方法によるものです。 * netcatでは、ターミナルはプログレッシブモード(「料理モード」とも呼ばれます)です。ローカル端末に組み込まれている編集機能、特にローカルのstty設定を使用して行を編集し、最終状態でリモートホストに送信します。 * Telnetでは、(ローカル)端末は文字固有モード(「生モード」とも呼ばれます)です。各キーストロークはTelnetに直接移動し、すぐにリモートシステムに渡されます。リモートシステムの回線バージョン機能を使用します。

端末の設定を気にしないいくつかの破損したプログラムがあります。あなたも彼らの一人に会ったようです。最良の方法は、端末の構成を変更することです。リモートプロトコル(TelnetやSSHなど)を介してデバイスと通信する必要があり、デバイスを設定できない場合も同様です。

BackSpacextermを使うのは簡単です。実行時にキーストロークに送信された文字を切り替える設定があります。左ボタンメニューから「Delete is DEL」を切り替えます。プログラムで送信エスケープシーケンス \e[?67h送信または送信。BackSpace該当するリソースはです。他の端末エミュレータは、同様のインタフェース機能を有していなくても、エスケープシーケンスをサポートしてもよい。^h\e[?67lBackSpace^?XTerm.backarrowKeyIsErase

多くの端末エミュレータは、またはキーを押すと文字の1つを送信し、^h+を押すと他の文字を送信します。これはピンチに便利です。^?BackSpaceCtrlBackSpace

友達と一緒にすることは、showkeysXではなくLinuxコンソールでのみ関連しています。

答え3

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

とにかく、私が知っている限り、TelnetまたはTERM変数は通常、ターミナルエミュレータ設定機能であるバックスペースキーが送信する内容を変更しないでください。

関連情報