Як запобігти запису "Не вдалося: зламана труба" на з'єднанні SSH?


283

Що я можу зробити, щоб налаштувати SSH на клієнті та серверах, щоб запобігти Write Failed: broken pipeпомилкам? Це часто виникає, якщо ви спите клієнтський комп'ютер і продовжуєте пізніше.


8
Нічого насправді. Сеанс було перервано, а безпека сесії була порушена. Якщо ви не вкладаєте комп'ютер у режим сну, ви можете встановити час, коли клієнт може стріляти в сервісі, але якщо система буде спати, то нічого не можна зробити.
darkdragn

3
У цьому випадку я шукаю щось, що дозволило б мені знову ініціювати розірване ssh-з'єднання (можливо, засноване на коді виходу) та відновити використання screen?
sorin

4
Ви люди помиляєтеся: у мене є дві Клієнтські комп'ютерні машини, які підключаються до сервера SAME. Один - ubuntu 12.10, Quantal, клієнт SSH якого працює добре і підтримує з'єднання годинами. Інший - Ubuntu 14.10, Utopic, навпроти іншого та в новому встановленні; через пару хвилин він блокується цим повідомленням. Решта мережевих функцій машини не перериваються. Отже, ні, це не проблема мережі, не проблема сервера, а специфічна проблема програмного забезпечення SSH CLIENT, яку МОЖЕ вирішити, навпаки тому, що "darkdragan" наважується сказати, що "нічого не можна зробити".
Девід L

2
І справді, як я вже говорив: люди занадто багато говорять, коли кажуть, що "нічого не можна зробити", як @darkdragn наважився. Я прочитав відповідь Арама Кочаряна, і застосував її: 20 хвилин тому ... Я зрозумів, що в моїй старій Quantal Ubuntu 12.10 я застосував цю інструкцію у цьому файлі [я щойно перевірив], два роки тому, і це було причина стабільності там. Я це зробив тут, і за останні 20 хвилин зв’язок був стабільним відтоді. Тож, будь ласка, люди: утримуйтесь себе, коли наважуєтесь думати, що "нічого не можна зробити", і ще більше утримуйтесь, намагаючись залишити це повідомлення іншим людям.
Девід L

11
@DavidL, ви повинні прочитати питання краще, перш ніж здавати на оренду. Ваша проблема не така, як у ОП, яка чітко згадує про переведення комп'ютера в режим сну. Який, до речі, лише один із відповідей на адресу ("мош"), і він був розміщений через 2 роки після питання. Однак інші відповіді роблять наступне найкраще, що пропонує рішення у випадках, які можна вирішити простіше, як і ваш. Охолоджуйтесь, не будьте настільки напружені,
оренда

Відповіді:


266

Я спробував це /etc/ssh/ssh_configдля Linux та Mac:

Host *
ServerAliveInterval 120

Ось як часто, за лічені секунди, він повинен надсилати повідомлення про збереження життя на сервер. Якщо це не працює, тоді тренуйте мавпу, щоб натиснути клавішу кожні дві хвилини, поки ви працюєте.

Ви можете встановити або ServerAliveIntervalв /etc/ssh/ssh_configклієнтській машині або ClientAliveIntervalв /etc/ssh/sshd_configсерверній машині. Спробуйте зменшити інтервал, якщо ви все ще отримуєте помилку.

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


4
Я не на Mac, але Ubuntu 12.04 і файл для цієї операційної системи також здається ~ / .ssh / config.
H2ONaCl

5
OS X 10.8.4 видає помилкуBad configuration option: ClientAliveInterval
ой

3
Я отримую ту саму Bad configuration optionпомилку на OSX 10.8.4.
Нік Хайнер

10
Як правило, ви складаєте ці дві команди в різні частини системи. Тільки ServerAliveInterval на стороні клієнта OSX ... і лише ClientAliveInterval у файлі конфігурації sshd ...
ftrotter

2
Моя мавпа сказала мені: "Чому ти не
набереш

85

Сеанси SSH можуть перерватися через численні та, можливо, неминучі причини.

Називається корисна утиліта, яка може бути використана для зменшення проблем, викликаних цим screen. Екран - це потужна утиліта, яка дозволяє керувати кількома терміналами, які залишаться живими незалежно від сеансу ssh. Наприклад, якщо ви запускаєте screenсеанс ssh, ви побачите новий термінал відкритим, і ви можете використовувати його для запуску завдань. Скажімо, ваш сеанс ssh вмирає в процесі. Запуск screen -dпотім screen -rбуде знову відкрити останню сесію , і ви будете в змозі продовжити звідти. Обов’язково прочитайте частину документації перед її використанням.


5
Це, мабуть, найкраща відповідь, я не впевнений, чому це не проголосували вище. Інші "виправлення" корисні в спеціальному випадку, коли ви насправді піклуєтеся про підтримку SSH-з'єднання, але в більшості випадків використання я думаю, що справжнє занепокоєння полягає в тому, що намічені процеси продовжують працювати, незалежно від будь-яких проблем з підключенням клієнт / сервер. .
Пол Макмюрді

16
Я також додав би Tmux як альтернативу екрану. Я вважаю його більш універсальним і стабільним, ніж екран.
п'ятниця

2
просто залишивши це для подальшої довідки - ви можете зручно запустити, screen -d -rщоб відновити останній сеанс.
doplumi

2
Або просто screen -dr. Або screen -xзалежно від того, що ви плануєте робити. Справа в тому, що слід знати, що роблять усі ці комутатори, щоб можна було використовувати відповідні, а не просто сліпо слідувати пропозиціям людей в Інтернеті. Тут представлений приємний короткий підсумок: ss64.com/bash/screen.html
flith

Це не відповідь на проблему
користувач3728501

46

Конфігурація клієнта

Спробуйте створити файл:

~/.ssh/config

Додайте вміст:

Host *
  ServerAliveInterval 30
  ServerAliveCountMax 5

Тепер ssh на ваш сервер і подивіться, чи виправлена ​​ваша проблема. Параметр ClientAliveInterval корисний лише під час налаштування ssh-сервера (він же sshd), він не змінює нічого на стороні клієнта ssh, тому не використовуйте його у наведеному вище файлі конфігурації.

Це надішле сигнал на сервер привіт, якщо ви не отримали жодних пакетів за попередні 30 секунд (як зазначено вище). Однак, якщо кількість послідовних привітних сигналів привітає вас до ServerAliveCountMax, ssh відключиться від сервера. Це значення за замовчуванням до 3 (тому 3 * 30 = 90 секунд без активності сервера), збільште його, якщо воно відповідає вашим потребам. Для файлу .ssh / config є багато інших параметрів конфігурації, і ви можете прочитати:

Використання файла конфігурації SSH

Для отримання додаткової інформації про інші параметри. Ви, можливо, не захочете застосовувати це до кожного сервера, до якого ви підключаєтесь. Або обмежте його лише на певному сервері, замінивши рядок Host *на Host <IP>(замініть IP-адресу, див. Сторінку man ssh_config).

Конфігурація сервера

Так само ви можете сказати серверу бути обережними зі своїми клієнтами. Файл конфігурації є /etc/ssh/sshd_config.

ClientAliveInterval 20
ClientAliveCountMax 5

Ви можете або відключити його, встановивши ClientAliveIntervalна 0або налаштувати ClientAliveIntervalі ClientAliveCountMaxвстановити максимальну SSH клієнта бездіяльність , не відповідав на зондах. Однією з переваг цих налаштувань над TCPKeepAlive є те, що сигнали надсилаються через зашифровані канали, тому це менш ймовірно, що їх можна підробляти.


Це не працює. Я знову стикаюся з тією ж помилкою.
user997704

3
Спробуйте прямо з командного рядка та йдіть нижче: ssh -o ServerAliveInterval = 5 user @ host
Метт

Спробував, що теж .. не працює. Я дійсно не знаю, що відбувається з моєю системою
user997704

2
Це ClientAliveCountMax, а не ClientAliveMaxCount
David G

@DavidG Будь ласка, відредагуйте відповідь зі своїми виправленнями.
CivMeierFan

23

Я віддалено модернізую сервер Ubuntu з простого до точного та втратив ssh-з'єднання посеред оновлення з повідомленням "Написати не вдалося. Брокен труба". ClientAliveInterval та ServerAliveInterval нічого не зробили. Рішення полягає в тому, щоб увімкнути параметри TCPKeepAlive в ssh клієнта:

TCPKeepAlive yes

в

/etc/ssh/ssh_config

20

Для клієнта відредагуйте свій ~/.ssh/config(або /etc/ssh/ssh_config) файл так:

Host *
  TCPKeepAlive yes
  ServerAliveInterval 120

TCPKeepAlive - Вказує, чи повинна система надсилати повідомлення про збереження TCP в іншу сторону. Якщо вони будуть надіслані, загибель підключення або аварія однієї з машин буде помічена належним чином. Однак це означає, що з'єднання загинуть, якщо маршрут тимчасово не працює, а деякі люди вважають його дратівливим (за замовчуванням - "так").

ServerAliveInterval - Встановлює інтервал тайм-ауту в секундах, після якого, якщо дані не отримані від сервера, ssh (1) надішле повідомлення через зашифрований канал із запитом відповіді від сервера. За замовчуванням 0, що вказує на те, що ці повідомлення не надсилаються на сервер.


На сервері відредагуйте /etc/ssh/sshd_configтак:

ClientAliveInterval 600
ClientAliveCountMax 0

Якщо ви хочете, щоб ssh-клієнт автоматично вийшов (тайм-аут) через 10 хвилин (600 секунд).

ClientAliveCountMax - Це вказує на загальну кількість повідомлень чекаліви, надісланих сервером ssh, без отримання відповіді від ssh-клієнта. За замовчуванням - 3.

ClientAliveInterval - це вказує час очікування в секундах. Через x кількість секунд, ssh-сервер надішле клієнту повідомлення з проханням відповісти. Дефолт 0 (сервер не надсилає повідомлення клієнту для перевірки.)


Дивіться також: Що точно роблять параметри ServerAliveIntervalта ClientAliveIntervalв sshd_config?


Встановлення ServerAliveCountMax вище за замовчуванням для клієнта також повинно допомогти зберегти з'єднання в прямому ефірі для повільних з'єднань.
jonnyjandles

17

Я абсолютно люблю Моша. Я часто впадаю в сервер, закриваю ноутбук і заходжу в кафе, відкриваю його і продовжую так, ніби нічого не змінилося.

Mosh (мобільна оболонка)

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

Mosh - це заміна SSH. Це більш надійний та чуйний, особливо через Wi-Fi, стільникові та міжміські зв’язки.

Mosh - безкоштовне програмне забезпечення, доступне для GNU / Linux, FreeBSD, Solaris, Mac OS X та Android.


6

Для мене я отримував Write failed: Broken pipeнавіть тоді, коли активно друкував у vim або підказки оболонки. Я також не міг деякий час переглядати Інтернет в Інтернеті. (Я віддалено підключався до Ubuntu за допомогою терміналу.)

Інші в моїй мережі передають багато відео з Netflix та інших місць. Я не можу цього довести, але підозрюю, що це проблема провайдера чи маршрутизатора. Наприклад, Verizon і Netflix вказують пальцями один на одного щодо проблем із мережею своїх клієнтів.

Якщо у вас є комутований зв’язок і ви передаєте відео чи музику з одночасним SSH або telnet-з'єднанням, то неминуче в якийсь момент ви отримаєте повідомлення про розрив труби. Оновлення мого широкосмугового пакету провайдерів, здавалося, зробило моє порушене з'єднання менш частим.



3

У мене на віддаленому сервері є сценарій, який ніколи не виходить з ладу, незалежно від клієнта або сервера конфігурації SSH.

#!/bin/bash
while true; do date; sleep 10; done;

Збережіть його в якомусь файлі dummy.sh і швидко запустіть його, перш ніж мінімізувати вікно або відійти від нього. Він буде продовжувати друкувати поточну марку часу на сервері та підтримуватиме ваше з'єднання живим до тих пір, поки з'єднання не перерветься з будь-якої іншої причини. Повернувшись до цього терміналу, просто натисніть CTRL + C і продовжуйте працювати.


9
або просто залиште topпрацювати
Eben Geer

1

Ви можете додавати ці аргументи щоразу, коли ви викликаєте ssh: -o ServerAliveInterval=15 -o ServerAliveCountMax=3

Для цього вам не потрібно редагувати / etc / ssh / * конфігураційні файли.

Ви можете створити псевдонім bash або функцію або сценарій, щоб зробити це просто.

Наприклад, ці функції bash ви можете додати у свій .bashrc, do_ssh використовується вручну, щоб увімкнути збереження. do_ssh_pty використовується в скриптах для встановлення pty та уникнення підказок.

do_ssh() {
    ssh -o ServerAliveInterval=15 -o ServerAliveCountMax=3 $*
}

do_ssh_pty() {
    ssh -tt -o "BatchMode=yes" -o "StrictHostKeyChecking=no" -o ServerAliveInterval=15 -o ServerAliveCountMax=3 $*
}

Тепер do_ssh user@hostможна використовувати або, do_ssh user@host <args> <command>і кипариви будуть активними.

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