Спосіб уникнення тайм-ауту з'єднання ssh та заморожування терміналу GNOME


235

Коли я підключаюсь через ssh до певних серверів, він таймаутує та «заморожує» термінал (не приймає вхід, не відключається, не може Ctrl-C вбити процес ssh чи що-небудь інше).

Це в Ubuntu, gnome-terminalхоча це, здається, призупиняє термінальний вхід / вихід, і не впливає на роботу самого програмного забезпечення терміналу GNOME. Так менше помилок, gnome-terminalніж дратівливої ​​невідповідності з ssh.

Отже, чи є спосіб запобігти / відновити термінал від часу з ssh-з'єднань?


Відповіді:


256

sshd (сервер) закриває з'єднання, якщо він деякий час нічого не чує від клієнта. Ви можете сказати своєму клієнтові раз на час надсилати на сервер сигнал про вхід.

Конфігурація для цього знаходиться у файлі ~/.ssh/config. Щоб надсилати сигнал кожні чотири хвилини на віддалений хост, введіть у своєму розпорядженні наступне ~/.ssh/config.

Host remotehost
  HostName remotehost.com
  ServerAliveInterval 240

Це те, що в мене є ~/.ssh/config.

Щоб увімкнути його для всіх хостів, використовуйте:

Host *
  ServerAliveInterval 240

Також переконайтеся, що запустіть chmod 600 ~/.ssh/config, оскільки файл конфігурації не повинен читатись у всьому світі.


1
Дякую sblair за те, що мені допомогли у формулюванні, це дуже цінується. Я змінив "не повинен" повернутися до "не повинен", оскільки ssh перевіряє дозволи файлу, і якщо він читається світовим або груповим, він виходить з ладу.
Ludwig Weinzierl

1
Це не те, що запитувала ОП. Його не відводять через бездіяльність. Він намагається підключитися, і його термінал замерзає.
Серін

Де це ~/.ssh/config?
Користувач

1
@User '~ /' представляє вашу домашню папку. '.ssh' - це папка у вашій домашній папці.
wkm

6
це марно, якщо ваш зв’язок насправді втрачається ...
so12311

248

Натисніть Enter, ~, .один за іншим , щоб відключитися від замерзлого сесії.

У розділі "ХАРАКТЕРИ ESCAPE" на сторінці ssh man пояснюються основні деталі.


40
Ця відповідь здається мені більш точно відповісти на питання, і в будь-якому випадку, це була відповідь, яку я шукав.
CoatedMoose

Зверніть увагу , що вам потрібно розкоментувати рядок EscapeChar ~в /etc/ssh/ssh_config(або , ~/.ssh/ssh_configякщо ви віддаєте перевагу).
Адітя МП

@adityamenon Ні, EscapeChar ~це вже вбудований за замовчуванням.
Пітер Ейзентрав

2
@Mark питання задає "чи є спосіб запобігти поверненню терміналу від часу, коли термін дії ssh закінчився ?" Наголос мій.
CoatedMoose

2
Попри те, що це було невірно в контексті питання, саме цього я хотів.
Субін Себастьян

38

Навіть це не є прямою відповіддю на ваше запитання, воно дуже пов'язане з вашою проблемою. Замість того, щоб намагатися підтримувати з'єднання живим (усі з'єднання зрештою вмирають), ви можете використовувати термінальні мультиплексори, як, наприклад, screenі tmuxякі підтримують сеанс живим у фоновому режимі, навіть якщо ваш термінал відключається.

По суті, коли ви увійдете на сервер SSH, ви негайно запускаєте, screenякий створить і додасть новий сеанс:

$ screen

Тоді ви йдете вперед і виконайте свою роботу з оболонкою, як це робили зазвичай. Тепер, якщо з'єднання перервано, коли ви зможете повернутися в Інтернет та знову підключитися до сервера через SSH, ви отримаєте список поточних сеансів з:

$ screen -ls

Щоб повторно долучити до сеансу:

$ screen -r <session>

де <session>PID або ім'я сеансу. Ви будете знову підключені до сеансу, і ви зможете продовжити там, де ви зупинилися!

Можна навіть відключити сеанс і знову підключитися додому, щоб забрати з точної точки, де ви зупинилися. Щоб від'єднати сеанс, який ви використовуєте, C-aпісля чого C-d(той Control + Aі потім Control + D).

Також є простий онлайн-підручник .

Використання screenта tmuxвіддалені сервери вважається найкращою практикою та настійно рекомендується . Деякі люди йдуть настільки далеко, щоб мати screenоболонку входу за замовчуванням, тому після підключення вони негайно починають новий screenсеанс.


2
Ще одна альтернатива - використовувати mosh
Zombies

Це особливо корисно, якщо ви користуєтесь гарячою точкою або wifi, який час від часу випадає.
Рандалл

11

Спробуйте приєднати -o ServerAliveInterval=30до рядка підключення ( 30означає 30 секунд і, звичайно, можна відрегулювати)


5

Ви також можете встановити інтервал очікування в режимі очікування з боку сервера SSH:

Файл: /etc/ssh/ssh_config

Зміст:

ClientAliveInterval XX
ClientAliveCountMax YY

Це працює точно так само, як і налаштування клієнта, але нульові пакети надсилаються з сервера, а не з клієнта.

Витягнуто з:

http://www.sysadmit.com/2016/02/linux-y-vmware-ssh-evitar-desconexion.html


1

Для людей, які хочуть не допустити, щоб клієнт не вийшов із часу.

Ви можете спробувати встановити ConnectTimeout 0у конфігураційному файлі. Значення 0 означає, що з'єднання буде збережено безперервно, якщо не буде закрито.

ваш файл конфігурації (або ssh_config) може виглядати так:

Host *
   ConnectTimeout 0
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.