毎日使用しているSSH ARMマシンで奇妙な状況が発生しました。サーバーに接続してCtrl+を押してBASH機能をP呼び出すたびに、previous-history
SSH接続は停止します。チルダSSHシーケンスを介してのみ終了できます。これの考えられる理由を調査しようとしています。
previous-history
上矢印を押してもうまく動作するので、これはBASHのバグではありません。Ctrl+P例外的な状況は適用されず、次のことが適用されます
bind -p
。$ bind -p | grep previous-history "\C-p": previous-history "\eOA": previous-history "\e[A": previous-history
Ctrl+をこのようなP他の機能にバインドすることは役に立ちません。 - Ctrl+はPまだSSHを停止します。
$ bind '"\C-p":"\necho hi\n"'`
CtrlBASHは+、++の元の文字を正しく印刷します。PCtrlV CtrlP
^P
$TERM
に設定すると、screen
BASH/etc/termcap
readlineはデフォルトで正しい値(Ctrl+L画面消去など)を使用します。$TERM
xtermまたはlinuxに設定してもSSHは停止し続けますCtrl。P次の
--noprofile
ようにBASHを起動してみましたが、+はまだ機能しません。--nobashrc
CtrlPサーバーに接続していますが、
-vvv
ログメッセージに奇妙な点が見つかりませんでしたSSH接続が停止したら、問題なく他のサブシェルの同じサーバーに接続できます。これを実行した後、以前のサブシェルでハングしたセッションが再び正常になりました。入力した内容は表示できますが、セッションが停止している間に入力した内容はすべて表示されません。
ローカルの問題を解決するために、複数のコンピュータがこのサーバーに接続しましたが、Ctrl+P動作しませんでした。
バッシュバージョン:
GNU bash、バージョン 4.1.5(1)-リリース(armv7l-unknown-linux-gnueabi)
SSHバージョン:
OpenSSH_5.3p1、OpenSSL 1.0.1c 2012年5月10日
Linuxカーネル:
2030年10月3日
この行動の理由が何であるかわかりません。私はCtrl+Pキーバインディングに精通しています。知っている人はいますか?
ベストアンサー1
SSHでデバッグするときに使用されます。
ssh -vvv remotehost
最大デバッグ出力を有効にする:リモート側に送信されるすべてのキー入力に対して、「debug3:NNNNの合計48バイトの履歴」を表示する必要があります。 Ctrl-Pが表示されない場合は、問題がリモートではなくローカル(クライアント)にあることを意味します。
リモート側でデーモンを制御する権限がありますか? sshdの-Dおよび-dオプション(-ddd
最大デバッグ出力の場合も)を使用すると、問題を接続の半分に分離するのに役立ちます。
ローカル側に珍しいターミナルキーバインディングはありますか?stty -a
または、stty -a | fgrep '^D'
そこにバインディングがある場合は、Ctrl-Pを表示する必要があります。 (何を「停止」する必要がありますか?)
クライアントがクラッシュした後:
- このようなコマンドを実行すると、
touch /tmp/foo
サーバーに影響しますか? (つまり、停止を表示または実行します。) - SSHクライアントエスケープを実行できますか?
<enter>~?
「サポートされているエスケープシーケンス」のリストを入力して取得できますか?<enter>~.
接続を入力して終了できますか?もしそうなら、すべての凍結は確かにサーバーにあります。
straceを使用すると、サーバー側で実行されている作業についてより良いアイデアを得ることができます。
strace -fo /tmp/strace.out sshd -ddd -D