Можно использовать 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 сброс" будет также работать.
Команда reboot -f
никогда возвраты (если у Вас не было разрешения вызвать перезагрузку). В точке, где это выпущено, клиент SSH ожидает чего-то, чтобы сделать, который мог быть:
Так как серверный процесс SSH мертв, клиент SSH не умрет, пока таймер не разожжет.
Если Вы работаете ssh remotehost 'reboot -f >/dev/null &'
, затем то, что происходит:
reboot
команда в фоновом режиме.reboot
управляйте вызывает машину к перезагрузке.Однако это не надежно: в зависимости от синхронизации шаг 3 мог бы произойти перед шагом 2. Добавление таймера делает это вряд ли:
ssh remotehost '{ sleep 1; reboot -f; } >/dev/null &'
Быть абсолютно уверенным, что сторона сервера стремится работать reboot
, при проверке, что это на самом деле не перезагружает прежде, чем уведомить клиент, что это фиксируется, Вам нужно дополнительное уведомление для движения от сервера до клиента. Это может быть произведено посредством соединения SSH, но оно сложно.
Как насчет выхода от ssh сессии и системы перезагрузки с помощью затем управляйте:
ssh login@host "reboot -f"
После того, как это просто нажимает Ctrl+C для оконечного ssh.
Вы попробовали следующее
# shutdown -r now
Я нахожу, что в некоторых системах продолжил работать в передаче, команда перезагрузки имела некоторые проблемы. С другой стороны я ничего не могу найти в странице справочника завершения работы, которое сделало бы то же как перезагрузку с флагом-f.
Я нашел решение для этого, которое могло бы быть полезным для других также. Я использовал следующую команду для закрытия соединения прямо после запуска команды, присоединенной к ssh:
ssh host "command to run on the host machine > /dev/null &"
Я точно не понимаю причины, почему эта команда вынуждает соединение закрыться, но по крайней мере это было полезно для меня. Если кто-либо понимает, почему это уничтожает соединение SSH; объясните.
Я нашел это решение наиболее эффективным для себя.
Используйте -o "ServerAliveInterval 2"
с командой ssh
следующим образом:
$ ssh -o "ServerAliveInterval 2" root@remotehost reboot
Указанная опция заставляет клиентскую сторону "тыкать" сервер по защищенному каналу каждые 2 секунды. В конце концов, по мере перезагрузки сервер перестанет отвечать, и клиент разорвет соединение.
Простой способ, который я нашел, - это команда на выключение / перезагрузку в качестве фоновой задачи (с помощью '&'), защищая ее от закрытия, когда сеанс закрывается с помощью 'nohup', вместе с немедленным завершением оболочки / сеанса :
nohup shutdown -r now & exit
Таким образом, клиент SSH не зависает, так как сеанс завершается немедленно, в то время как удаленная система выполняет асинхронную перезагрузку.
Для этого требуется 1-минутная задержка, но у меня надежно сработало и решило проблему зависания клиента SSH:
$ sudo shutdown +1; logout
При этом запланировано завершение работы системы на 1 минуту позже, что дает время для выход из системы и, следовательно, завершение работы по SSH. Если вы хотите подождать как можно меньше времени, вы можете заменить +1
на ЧЧ: ММ
для быстро приближающегося времени суток, но это может быть сложно правильно рассчитать время и может иметь задержку до 59 секунд.
Некоторые ответы были близки, но правильный ответ:
ssh user@192.168.0.130 "nohup sudo reboot &>/dev/null & exit"
объяснение:
exit
в качестве последней команды, чтобы статус последней команды был 0 (успех). Вы можете добавить sleep, если хотите, но это не обязательноstdin
и stdout
все еще подключены к виртуальному терминалу через SSH, поэтому соединение не будет закрыто. Вам нужно сделать две дополнительные вещи, чтобы сеанс SSH завершился и команда осталась работать в фоновом режиме.
stdout
и stderr
в /dev/null
, чтобы они не перенаправлялись виртуальным терминалом, на котором находится SSH-сессия. Это часть &>/dev/null
. stdin
в нечитаемый файл таким же образом. Это делает встроенная функция shell nohup
. Когда в фоновом режиме выполняется только команда, отделенная от терминала во всех отношениях, exit
закроет сессию, а поскольку на виртуальном терминале не осталось ни stdin
, ни stdout
, SSH завершит соединение без ошибок.
(sleep 1 && sudo reboot &) && exit
. Круглые скобки порождают подпроцесс, который ожидает одна секунда и затем инициирует перезагрузку. Хост-процесс однако сразу завершает ssh сессию. Я не гуру оболочки, но это работало на меня до сих пор. – Griddo 12.12.2016, 22:16