Тримайте сеанс SSH живим [закритим]


241

Я використовую ssh -p8520 username@remote_hostдля входу на віддалений сервер.

Випуск :

Він завжди пов'язаний і працює належним чином, коли я перебуваю на робочому місці. На жаль, термінал замерзає через 10 - 15 хвилин після того, як я з'єднався з віддаленим сервером від дому.

Звіт про помилки / час очікування на консолі немає, але курсор більше не може рухатися.

Коли ви входите, wщоб перевірити користувачів, які входять, там є деякі користувачі, які входять у зомбі, і я маю їх вбити вручну.

Це досить дратує. Хтось може мені допомогти?


У мене це теж було, я почав використовувати screen. Можливо, це якась проблема тайм-ауту.
мартін

@martin screenдопомагає тримати роботу програми. На жаль, іноді мені доводиться працювати на віддаленому сервері :(
Хайфен Чжан

Якщо ви запускаєте його без параметрів, це дає оболонку.
мартін

Ви screenтільки говорите ? Це може вирішити втрачене питання про з'єднання? Ні screen -S screenName? Я завжди використовую екран з -Sі-r
Хайфен Чжан

1
Ні, це не вирішує питання, ви лише уникаєте втрати роботи в терміналі. Якщо ви нічого не зробите, воно все одно замерзне, ви просто зможете вибрати там, де ви почали. Я мав на увазі, що ви можете створити термінал, який ви завжди можете відновити, використовуючи screen. Ви, здається, це вже знаєте;)
мартін

Відповіді:


450

Демон ssh (sshd), який працює на стороні сервера, закриває з'єднання з боку сервера, якщо клієнт перебуває в глухому режимі (тобто не надсилає інформацію). Щоб запобігти втраті з’єднання, доручіть ssh-клієнту раз на час надсилати на сервер сигнал про вхід.

Конфігурація для цього є у файлі $HOME/.ssh/config, створіть файл, якщо він не існує (конфігураційний файл не повинен бути читаним у всьому світі, тому запустіть chmod 600 ~/.ssh/configпісля створення файлу). Щоб надсилати сигнал кожні, наприклад, чотири хвилини (240 секунд) віддаленому хосту, введіть у цей файл конфігурації наступне:

Host remotehost
    HostName remotehost.com
    ServerAliveInterval 240

Щоб увімкнути надсилання активного сигналу для всіх хостів, розмістіть у конфігураційному файлі такий вміст:

Host *
    ServerAliveInterval 240

24
@ user271996, чому слід перезапустити демон для налаштування на стороні клієнта?
maxschlepzig

Конфігурація повинна бути доступною лише для запису користувача. читабельність не викликає занепокоєння. Використання 600 як рівня дозволу є прекрасним, оскільки це лише для користувача.
jbruni

1
про всяк випадок, коли це не очевидно, цей конфігураційний файл знаходиться на вікні ПК / linux
zzapper

5
Я завжди плутаюсь з назвою конфігурації: клієнт використовує, ServerAliveInterval поки сервер використовує ClientAliveInterval . Який безлад.
youkaichao

@youkaichao Часто виникає ця плутанина. Як дизайнер API, є причини, що я можу сказати про це обома способами. Зрештою, найважливіше - це хороша документація обраного стандарту.
Cameron Tacklind

170

Я хотів одноразового рішення:

ssh -o ServerAliveInterval=60 myname@myhost.com

Збережено його в псевдонімі:

alias sshprod='ssh -v -o ServerAliveInterval=60 myname@myhost.com'

Тепер можна підключитися так:

me@MyMachine:~$ sshprod

12
Це круто, але не зовсім "одноразове рішення". Якщо ви збираєтеся підключатися до сервера не раз, чому б не зробити Host *& ServerAliveInterval 240(або вказати ім'я хоста, якщо ви хочете, щоб це було так, myname@myhost.comяк у відповіді rockymonkey555? Встановити псевдонім ні в якому разі не здається простішим.
Lambart

8
Або просто створіть псевдонім у своєму ~ / .bashrc:alias ssh='ssh -o ServerAliveInterval=60'
Jabba

15
Він означає "один раз", як у "це працює лише один раз", а не "я повинен написати це один раз".
Джонатан Хартлі

1
Так, якщо ви читаєте "одноразово" як "одноразове використання", це робить цю роботу ідеально.
philraj

Якщо ви хочете "однолінійний", який налаштований ServerAliveIntervalна 60, чудово. Однак використовувати псевдонім bash, коли ви могли використовувати, .ssh/configце просто нерозумно.
Cameron Tacklind

50

Для тих, хто цікавиться, @ Edward-coast

Якщо ви хочете встановити збереження живого для сервера , додайте це до /etc/ssh/sshd_config:

ClientAliveInterval 60
ClientAliveCountMax 2

ClientAliveInterval : Встановлює інтервал очікування в секундах, після чого, якщо дані від клієнта не отримано, sshd (8) надішле повідомлення зашифрованим каналом, щоб запитати відповідь від клієнта.

ClientAliveCountMax : Встановлює кількість активних повідомлень клієнта (див. Нижче), які можуть бути надіслані без sshd (8) отримання будь-яких повідомлень від клієнта. Якщо цей поріг буде досягнуто під час надсилання активних повідомлень клієнта, sshd відключить клієнта, припинивши сеанс.


Здається, що немає такого "параметра", як ClientAliveInterval, лише ServerAliveInterval, ви можете перевірити на сторінці керівництва "man ssh_config"
dtj

6
Це неправильно, дивіться у "man sshd_config" для частини сервера, на якій працює ssh демон, а не конфігурації клієнта.
Джефф Давенпорт

Чи повинен я використовувати, ClientAliveIntervalщоб сервер перевіряв наявність клієнта живим, або я повинен дозволити клієнту ServerAliveIntervalкілька разів "пінг" сервера ? І те, і
інше,

1
Встановіть ClientAliveIntervalна сервері лише те, якщо ви хочете, щоб сервер відключився від мертвих з'єднань, які не відповідають, і ви можете налаштувати частоту та коли це відбувається.
Джефф Давенпорт


10

Ми можемо зберегти наше ssh-з'єднання живим, дотримуючись глобальних конфігурацій

Додайте у /etc/ssh/ssh_configфайл такий рядок :

ServerAliveInterval 60

Це працює тільки для клієнта чи це також працює для sshd?
Едвард Коуст

1
@EdwardCoast Це працює на машині клієнта. Я перевірив його на Mac
minhas23
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.