ssh経由で特定のサーバに接続すると、タイムアウトして端末が「フリーズ」してしまいます(入力を受け付けず、切断もできず、Ctrl-Cでsshプロセスを終了させることもできません)
これはUbuntuのgnome-terminal
にありますが、ターミナルの入出力を一時停止しているようで、GNOMEターミナルソフトウェア自体の動作には影響しません。ですから、gnome-terminal
のバグというよりも、ssh の厄介な矛盾というよりは、gnome-terminal
のバグというべきでしょう
そこで、タイムアウトしてしまったssh接続から端末を防ぐ/取り戻す方法はありますか?
244 Kzqai 2010-01-20
sshd (サーバ) は、しばらくの間クライアントから何の音沙汰もない場合、接続を閉じます。クライアントに、たまにサーバにサインオブライフシグナルを送るように指示することができます
そのための設定はファイル ~/.ssh/config
にあります。リモートホストに4分ごとにシグナルを送信するには、~/.ssh/config
に以下のように記述します
Host remotehost
HostName remotehost.com
ServerAliveInterval 240
これが私の~/.ssh/config
にあるものです
すべてのホストで使用するために有効にするには
Host *
ServerAliveInterval 240
また、設定ファイルは世界で読めるようにしてはいけないので、chmod 600 ~/.ssh/config
も必ず実行してください
265 Ludwig Weinzierl 2010-01-20
Enter, ~, .を順に押すと、フリーズしたセッションから切断することができます
ssh man ページの「ESCAPE CHARACTERS」の項では、その根底にある詳細を説明しています
258 Peter Eisentraut 2010-01-20
これはあなたの質問に対する直接的な答えではありませんが、あなたが抱えている問題に大きく関連しています。接続を維持しようとする代わりに (すべての接続は最終的には死んでしまいます)、端末が切断されてもバックグラウンドでセッションを維持する screen
や tmux
のような端末マルチプレクサを使うことができます
本質的には SSH サーバにログインすると、すぐに screen
を実行し、新しいセッションを作成してアタッチします
$ screen
その後は、通常のようにシェルを使って作業を行います。接続が切断されても、オンラインに戻ってSSHでサーバに再接続すれば、現在のセッションの一覧が表示されます
$ screen -ls
セッションに再アタッチすること
$ screen -r <session>
ここで <session>
は PID またはセッション名です。セッションに再接続されますので、元の場所から続けることができます!
セッションを切り離して、ホームから再接続して、中断した場所から再開することもできます。セッションを切り離すには、C-a
の後にC-d
を使います(Control + A
の後にControl + D
が続きます)
シンプルなオンラインチュートリアルもあります
リモートサーバでscreen
とtmux
を使うことはベストプラクティスと考えられており、強く推奨されています。デフォルトのログインシェルとして screen
を使う人もいます
40 fotos 2012-07-03
接続文字列に-o ServerAliveInterval=30
を追加してみてください(30
は30秒を意味し、もちろん調整可能です)
13 Fergie 2014-02-06
また、SSHサーバ側からアイドルタイムアウトの間隔を設定することもできます
File: /etc/ssh/ssh_config
Content:
ClientAliveInterval XX
ClientAliveCountMax YY
これはクライアントの設定と全く同じように動作しますが、ヌルパケットはクライアントではなくサーバーから送信されます
Extracted from:
6 Ladinfremes 2016-02-12
そもそもクライアントのタイミングアウトを防ぎたい方へ
設定ファイルでConnectTimeout 0
を設定してみてください。値 0 は、閉じない限り、接続を無期限に維持することを意味します
あなたの設定ファイル (または ssh_config) は次のようになっているかもしれません
Host *
ConnectTimeout 0
2 Yohannes Libanos 2015-12-17
私の場合はMTUのサイズが大きいのが問題でした。NATを使っている場合はルータ側でMTUを変更することもできますが、私はサーバ側でMTUを変更しています
sudo /sbin/ifconfig eth0 mtu 1036
sudo /etc/init.d/networking restart
Windowsでは、このキーを増やすこともできます
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters]
"TcpMaxDataRetransmissions"=dword:00000010
0 Vasin Yuriy 2020-01-24
これがgnomeターミナルでも動作するかどうかはわかりませんが、sshクライアントプロセスを終了させれば、再びターミナルを使えるようになるはずです
pgrep -a ssh
プロセスIDが表示されるので、それを使って強制終了させることができます
kill <pID>
0 MoRe 2020-08-04