Заключительное соединение после выполняющейся перезагрузки с помощью ssh команду

Можно использовать tput reset.

Кроме того, reset и tput reset можно использовать следующий сценарий оболочки.

#!/bin/sh
echo -e \\033c

Это отправляет управляющие символы Esc-C к консоли, которая сбрасывает терминал.

Ключевые слова Google: консольные управляющие последовательности Linux

man console_codes говорит:

ESC последовательности c вызывает терминальный сброс, который является тем, что Вы хотите, если экран все искажен. Часто рекомендуемое "эхо ^V^O" только сделает ток G0, но нет никакой гарантии, что G0 указывает на таблицу a). В некоторых дистрибутивах существует сброс программы (1), который просто "повторяет ^ [c". Если Ваша terminfo запись для консоли будет корректна (и имеет запись rs1 =\Ec), то "tput сброс" будет также работать.

18
17.12.2013, 00:24
9 ответов

Команда reboot -f никогда возвраты (если у Вас не было разрешения вызвать перезагрузку). В точке, где это выпущено, клиент SSH ожидает чего-то, чтобы сделать, который мог быть:

  • сервер SSH, уведомляющий клиент, что что-то произошло, который требует его внимания, например, что существует некоторый вывод для отображения, или что удаленная команда закончилась;
  • некоторое событие на стороне клиента, такой как сигнал передать;
  • таймер, разжигающий, чтобы заставить клиент отправлять сообщение проверки активности (и закрывать соединение, если сервер не отвечает).

Так как серверный процесс SSH мертв, клиент SSH не умрет, пока таймер не разожжет.

Если Вы работаете ssh remotehost 'reboot -f >/dev/null &', затем то, что происходит:

  1. Удаленная оболочка запускается reboot команда в фоновом режиме.
  2. Поскольку команда оболочки серверной стороны вышла и нет никакого процесса, содержащего дескриптор файла для открытого стандартного вывода, сервер SSH закрывает соединение.
  3. reboot управляйте вызывает машину к перезагрузке.

Однако это не надежно: в зависимости от синхронизации шаг 3 мог бы произойти перед шагом 2. Добавление таймера делает это вряд ли:

ssh remotehost '{ sleep 1; reboot -f; } >/dev/null &'

Быть абсолютно уверенным, что сторона сервера стремится работать reboot, при проверке, что это на самом деле не перезагружает прежде, чем уведомить клиент, что это фиксируется, Вам нужно дополнительное уведомление для движения от сервера до клиента. Это может быть произведено посредством соединения SSH, но оно сложно.

22
27.01.2020, 19:46
  • 1
    , К сожалению, у меня нет уведомления для всех тегов (уже следуют за большим количеством из). В следующий раз В случае, если любой ищет способ сделать это из удаленного хоста (аналогичное решение): (sleep 1 && sudo reboot &) && exit. Круглые скобки порождают подпроцесс, который ожидает одна секунда и затем инициирует перезагрузку. Хост-процесс однако сразу завершает ssh сессию. Я не гуру оболочки, но это работало на меня до сих пор. –  Griddo 12.12.2016, 22:16

Как насчет выхода от ssh сессии и системы перезагрузки с помощью затем управляйте:

ssh login@host "reboot -f"

После того, как это просто нажимает Ctrl+C для оконечного ssh.

0
27.01.2020, 19:46

Вы попробовали следующее

# shutdown -r now

Я нахожу, что в некоторых системах продолжил работать в передаче, команда перезагрузки имела некоторые проблемы. С другой стороны я ничего не могу найти в странице справочника завершения работы, которое сделало бы то же как перезагрузку с флагом-f.

0
27.01.2020, 19:46
  • 1
    Да, завершение работы doesnot работает в машине, с которой я пытаюсь соединиться по некоторым странным причинам. Именно поэтому я использую перезагрузку-f для принуждения завершения работы и перезапуска. –  coffeMug 12.12.2012, 15:08

Я нашел решение для этого, которое могло бы быть полезным для других также. Я использовал следующую команду для закрытия соединения прямо после запуска команды, присоединенной к ssh:

ssh host "command to run on the host machine > /dev/null &"

Я точно не понимаю причины, почему эта команда вынуждает соединение закрыться, но по крайней мере это было полезно для меня. Если кто-либо понимает, почему это уничтожает соединение SSH; объясните.

0
27.01.2020, 19:46

Попробуйте эту команду:

$ reboot -f && exit
-2
27.01.2020, 19:46
  • 1
    К сожалению, это не работает. –  coffeMug 12.12.2012, 12:27
  • 2
    @AKh_Sw Быть характерным для "не работает". –  gertvdijk 12.12.2012, 14:44
  • 3
    @AKh_Sw: при вводе знака '$', он не будет работать –  tH0r 12.12.2012, 15:09
  • 4
    Бесполезный. Это точно эквивалентно reboot -f. –  Gilles 'SO- stop being evil' 13.12.2012, 01:21

Я нашел это решение наиболее эффективным для себя.

Используйте -o "ServerAliveInterval 2" с командой ssh следующим образом:

$ ssh -o "ServerAliveInterval 2" root@remotehost reboot

Указанная опция заставляет клиентскую сторону "тыкать" сервер по защищенному каналу каждые 2 секунды. В конце концов, по мере перезагрузки сервер перестанет отвечать, и клиент разорвет соединение.

5
27.01.2020, 19:46

Простой способ, который я нашел, - это команда на выключение / перезагрузку в качестве фоновой задачи (с помощью '&'), защищая ее от закрытия, когда сеанс закрывается с помощью 'nohup', вместе с немедленным завершением оболочки / сеанса :

nohup shutdown -r now & exit

Таким образом, клиент SSH не зависает, так как сеанс завершается немедленно, в то время как удаленная система выполняет асинхронную перезагрузку.

0
27.01.2020, 19:46

Для этого требуется 1-минутная задержка, но у меня надежно сработало и решило проблему зависания клиента SSH:

    $ sudo shutdown +1; logout

При этом запланировано завершение работы системы на 1 минуту позже, что дает время для выход из системы и, следовательно, завершение работы по SSH. Если вы хотите подождать как можно меньше времени, вы можете заменить +1 на ЧЧ: ММ для быстро приближающегося времени суток, но это может быть сложно правильно рассчитать время и может иметь задержку до 59 секунд.

0
27.01.2020, 19:46

Некоторые ответы были близки, но правильный ответ:

ssh user@192.168.0.130 "nohup sudo reboot &>/dev/null & exit"

объяснение:

  • вы хотите exit в качестве последней команды, чтобы статус последней команды был 0 (успех). Вы можете добавить sleep, если хотите, но это не обязательно
  • вам нужно запустить reboot в фоновом режиме, потому что иначе сервер закроет соединение и вы получите ошибку. Он все равно перезагрузится на большинстве систем, но если вы пишете сценарий, то статус возврата будет ошибкой (не 0) даже при правильном выполнении команды
  • запуска в фоне недостаточно, так как stdin и stdout все еще подключены к виртуальному терминалу через SSH, поэтому соединение не будет закрыто. Вам нужно сделать две дополнительные вещи, чтобы сеанс SSH завершился и команда осталась работать в фоновом режиме.
    • 1) вам нужно перенаправить stdout и stderr в /dev/null, чтобы они не перенаправлялись виртуальным терминалом, на котором находится SSH-сессия. Это часть &>/dev/null.
    • 2) вам нужно перенаправить stdin в нечитаемый файл таким же образом. Это делает встроенная функция shell nohup.

Когда в фоновом режиме выполняется только команда, отделенная от терминала во всех отношениях, exit закроет сессию, а поскольку на виртуальном терминале не осталось ни stdin, ни stdout, SSH завершит соединение без ошибок.

4
27.01.2020, 19:46

Теги

Похожие вопросы