
皆さんこんにちは!今回は私が最近遭遇した厄介な問題、「Windows TerminalでSSHセッションがすぐに切断される現象」とその解決方法を共有させてもらえればと思います。
発生した問題
最近、Windows TerminalからSSH接続を行うと、接続直後にセッションが突然切断されるという問題に悩まされていました。何度試しても同じ結果になり、リモート作業が全くできない状態でした。
環境情報
問題が発生した環境は以下の通りです:
- Windows 11 Pro 24H2
- PowerShell 7.5.0
- Windows Terminal 1.22.10731.0
- OpenSSH_for_Windows_9.5p1, LibreSSL 3.8.2
トラブルシューティングの道のり
1. SSHの詳細ログを確認
最初は、Windows端末と接続先のLinuxサーバのどちらかの設定に問題があるのではないかと考え、-v
オプション(Verbose)を使ってSSH接続のデバッグログを確認しました。
ssh -v user@server
しかし、切断の直前に特別なエラーメッセージは見つかりませんでした。
2. キープアライブ設定の調整
次に、タイムアウトによる切断を疑い、Windows側の~/.ssh/config
ファイルにキープアライブ設定を追加してみました:
Host *
ServerAliveInterval 60
ServerAliveCountMax 3
この設定は「60秒ごとに生存確認パケットを送信し、3回連続で応答がなければ切断する」というものですが、残念ながら効果はありませんでした。
3. 類似の既知問題の確認
調査を進める中で、マイナビニュースで報告されていた類似の問題を思い出しました。それは「Windows 11 ビルド 26100(23H2/22H2)でWindows Terminalとリモートデスクトップが使えない問題」というものでした。
記事によると、この問題はWindows 11 ビルド26100で発生している既知の問題とのことでした。
記事を参考に対処を試みましたが、私の環境では問題は解消されませんでした。これは、私のケースが記事で説明されているものとは若干異なる問題だったためと思われます。
4. DISMコマンドによるWindowsイメージ修復
システムファイルの破損を疑い、Microsoft公式ドキュメントを参考に、DISMコマンドを使用してWindowsイメージの修復も試みました。
管理者権限のコマンドプロンプトで以下のコマンドを実行しました:
DISM /Online /Cleanup-Image /RestoreHealth
その後、システムファイルチェッカーも実行:
sfc /scannow
これらのコマンドはシステムの整合性を確認・修復するためのものですが、残念ながらSSH接続の問題は解消されませんでした。
5. 真の原因を発見:イベントビューア
行き詰まりを感じていた時、Windows標準のトラブルシューティングツール「イベントビューア」を確認してみたところ、次のようなエラーログを発見しました:
障害が発生しているアプリケーション名: WindowsTerminal.exe、バージョン: 1.22.2503.14001、タイム スタンプ: 0x67d4a8f9
障害が発生したモジュール名: ucrtbase.dll、 バージョン: 10.0.26100.3037、タイム スタンプ: 0x8481217d
例外コード: 0xc0000409
フォールト オフセット: 0x00000000000a4c2e
フォールト プロセス ID: 0x1438
アプリケーションのフォールトの開始時刻: 0x1DBA432F6B93005
Faulting アプリケーション パス: C:\Program Files\WindowsApps\Microsoft.WindowsTerminal_1.22.10731.0_x64__8wekyb3d8bbwe\WindowsTerminal.exe
Faulting モジュール パス: C:\WINDOWS\System32\ucrtbase.dll
Report Id: a07e45a2-c8a8-4633-8e2b-a5c975879136
Faulting パッケージの完全名: Microsoft.WindowsTerminal_1.22.10731.0_x64__8wekyb3d8bbwe
Faulting パッケージ相対アプリケーション ID: App
このログから、問題の原因がucrtbase.dll
というファイルにあることが判明しました。調査によると、このDLLはMicrosoftのVisual C++ランタイムライブラリの一部であることがわかりました。
解決方法:C++再配布可能パッケージの更新
ucrtbase.dll
エラーに関するMicrosoftのコミュニティフォーラムを参考に、以下の手順で問題を解決しました:
- 既存のC++再配布可能パッケージをアンインストール:
- コントロールパネル > プログラムと機能 から「Microsoft Visual C++ Redistributable」を探し、既存のバージョンをアンインストール
- 最新版のC++再配布可能パッケージをインストール:
- Microsoft公式サイトから最新の「Visual C++ Redistributable」をダウンロード・インストール
- 公式ダウンロードページ
これらの手順を実行した結果、Windows Terminalでの突然の切断問題は完全に解消されました。
まとめ
今回のトラブルシューティングから得られた教訓をいくつか共有します:
- 接続問題は必ずしもネットワーク設定だけが原因ではない:今回のケースでは、OSのランタイムコンポーネントが原因
- Windows標準のトラブルシューティングツールを活用する:Windowsの場合、最初に見るべきはイベントビューアだった
- 似た症状でも原因が異なることがある:公式に報告されている問題に症状が似ていても、必ずしも同じ原因とは限らない。
- システムの整合性チェックは万能ではない:DISMやSFCのようなシステム修復ツールも、特定のアプリケーションの問題を解決できないことがある
- DLLエラーが出る場合は関連コンポーネントの再インストールを検討する:特に
ucrtbase.dll
のようなシステムファイルでエラーが出る場合は、関連パッケージの更新が効果的
同様の問題で悩んでいる方がいれば、ぜひこの方法を試してみてください。Windows Terminal自体を再インストールするよりも、C++再配布可能パッケージを更新する方が根本的な解決につながる可能性が高いです。