Что я могу сделать, когда моя сессия SSH застряла?

109

Иногда мой ssh-сеанс в терминале зависает. Как я могу выйти из сеанса SSH и восстановить соединение?

Кит Сунде
источник

Ответы:

196

Введите ~.(тильда, точка) в начале строки. Другими словами, нажмите Enter, затем ~, затем .. (На некоторых языках может потребоваться нажать Shiftили Altдля ввода ~символа.)

Вообще говоря, этот ~символ является escape-символом в сеансе SSH, когда вы вводите его в начале строки. EnterЗатем нажмите, ~?чтобы увидеть список управляющих команд. Наиболее распространенными являются

  • ~. разорвать соединение
  • ~^Z(нажмите ~затем Ctrl+ Z), чтобы приостановить соединение и введите команду локально (выполните команду, fgчтобы вернуться к сеансу SSH)

Если вы хотите тильду в начале строки, нажмите ~дважды.

жилль
источник
7

Все, что вам нужно сделать, чтобы выйти из сеанса SSH, это ввести exitв командной строке.

Попробуйте ввести Shift+ `+.

daviesgeek
источник
2
Он больше не принимает пользовательский ввод, он буквально застопорился. В Ubuntu есть комбинация клавиш, которая завершает сеанс, который вы можете использовать в подобных случаях. Через некоторое время сеанс прекратится, broken-pipeно я не буду ждать.
Кит Санде
1
@Kit Я исправил свой ответ. Прости за это. Я не осознавал, что вы имели в виду полностью застопорившуюся сессию SSH.
daviesgeek
Я обычно просто жду, пока истечет время ожидания. Несмотря на то, что я знаю об этих командах, я всегда забываю, что могу использовать их, чтобы ускорить процесс возвращения моей оболочки. Обратите внимание на ответ @Gilles, вам, возможно, придется нажать Enter / Return один раз, прежде чем ~. вы сможете узнать больше на man-странице SSH (чуть более чем на полпути), и набрав: ~?в активный / подключенный сеанс SSH, опять же, вы можете иметь нажать ввод один раз раньше.
Джейсон Салаз
7

Если ваш сеанс завис и подсказка больше не отвечает, вы можете просто уничтожить экземпляр терминала, и все дочерние процессы, связанные с этим экземпляром, одним из которых является сеанс ssh, должны быть исключены вместе с ним.

Если вы действительно хотите быть внимательным, хотя вы можете открыть новый экземпляр Terminal, найдите ssh-сессии в списке процессов и уничтожьте их с помощью командной строки:

> ps -ef  |grep ssh
501  1332   142   0 20Dec11 ??         0:01.33 /usr/bin/ssh-agent -l
501 57172 57150   0  1:58pm ttys000    0:00.01 grep ssh
501 57139 57133   0  1:57pm ttys002    0:00.03 ssh -i/Users/ian/code/ec2-keys/id_rsa-gsg-keypair someuser@someinstance.amazonaws.com

> kill 57139

Если это не сработает, попробуйте:

> kill -9 57139

Не убивай ssh-agentпроцесс.

Или вы можете открыть Activity Monitor и найти там сеансы и нажать на кнопку их уничтожения:

Фильтрация активности монитора для сессий SSH

Ян С.
источник
+1, это то, что я делаю. Часто, когда я оставляю сеанс запущенным, а затем либо случайно разрывается соединение, либо я сплю на ноутбуке, это приводит к зависанию ssh. Я открываю новую вкладку консоли и уничтожаю PID процесса ssh (или закрываю вкладку ssh и открываю новую)
Halfer
Работает ли сочетание клавиш на вашем Mac без утомительного уничтожения процесса?
Рафаэль Бугаевски
1
Используйте ~.. Смотри выше.
Снегопад
0

~. работает, хотя это выглядит как застревание, останавливает соединение ssh, и вы можете запустить его снова, но на моей клавиатуре я должен нажать Alt + ~, затем пробел, а затем.

Ханну
источник