質問: cmd.exeで正しく機能するようにputtyキーバインディングを構成するにはどうすればよいですか? puttyがwindowsで実行されているsshサーバーに接続されていて、cmd.exeがシェルとして使用されている場合、カーソルキーは正しく機能しません。通常、cursor up/downを使用して古いコマンドを呼び出すことができますが、putty内ではこれは機能しなくなります。puttyの端末タイプを変更してもうまくいきませんでした。代替シェルを使用することは解決策ではありません。 puttyでそれが不可能な場合は、キーバインディング/ターミナルエミュレーションの変更を可能にする代替のsshクライアントがありますか?
回答: 問題はおそらくクライアントではなくサーバーです。puttyはxterm/vt100ターミナルエミュレーターです。 vt100端末は、単純な8ビットシリアルストリームの一方の端に接続され、ファンクションキー用の特別な「エスケープシーケンス」を送信します。たとえば、esc [ aは up 矢印–そしてこれは今日のlinuxとbsdでも続いています。基本を超えたライン編集 ← backspace これらのエスケープシーケンスを読み取って解析し、カーソルを移動してテキストを表示するためにそれらをさらに出力することにより、プログラム自体によって処理されます。 telnetとsshはどちらも、シリアル回線とまったく同じように、ターミナルストリームの単純なキャリアと考えることができます。問題の原因は、windowsコンソールがそのように機能しないことです。コンソールはストリームではなく、画面バッファーです。コンソールサブシステムには行編集(および基本履歴)が組み込まれており、cmd.exeはこの機能をreadconsole()で使用するだけです。 –矢印キーイベントは、特に「ライン入力」モードを無効にしない限り、プログラムに到達しません。 (windows apiには、出力スタイル用の個別の関数もあります。)cmd.exeの入力がコンソールではなくパイプに接続されている場合、このシステムはバイパスされ、すべてが入力ストリームに直接挿入されます。 cmd.exeはvt100シーケンスを処理するように記述されていないため、特別な処理は行われず、escは入力されたコマンドの一部になります。 。つまり、windows sshサーバーとwindows組み込みtelnetサーバーは、vt100シーケンスをコンソールイベントに変換し、フォーマットされたコンソール出力をvt100シーケンスに変換する必要があります。すべてのsshサーバーが実際にそれを行う必要があるわけではありません。リモートエンドがユーザーのsshサーバーソフトウェアを変更していないことを確認してください。キーが同じ構成で機能していた場合は、puttyをデフォルトにリセットしてみてくださいputty -cleanupを使用するか、レジストリブランチを手動で削除して設定します。windows powershellには remotingsupport が付属しています。これは、ローカルの行編集を使用し、完全な行のみをリモートエンドに送信して、この問題を回避します。 cmd.exeの場合、これは psexec で実現できます(ただし、smb接続はデフォルトでは暗号化されていません) 、またはpowershellリモートセッション内からcmdを開始できます。