Удаленный выход из системы сессий оболочки на в спящем режиме

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

Как я могу вызвать чистый выход удаленных ssh-сессий на, в спящем режиме/приостанавливают/завершают работу?

PS На хинду и человечности

1
задан 07.09.2010, 12:20

2 ответа

Уничтожьте ssh клиенты прежде, чем быть в спящем режиме или приостановить.

На ясной Ubuntu приостановить сценарии находятся в /etc/pm/sleep.d. Документация находится в pm-action(8) страница справочника. Добавить /etc/pm/sleep.d/20_dariusz_kill_ssh содержа что-то как

#!/bin/sh
case $1 in
  suspend|hibernate) pkill -x ssh;;
esac

Я не знаю, где соответствующие сценарии находятся на хинду. Вы могли бы хотеть совершенствовать для исключения ssh к localhost, если Вы когда-нибудь делаете это.

Для завершения работы Вы ничего не должны делать, нормальные сценарии завершения работы уже уничтожают ssh клиенты чисто (таким образом, они закроют соединение).

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

Вот подтверждение концепции (полностью не протестировано). В /etc/network/if-down.d/ssh-sessions-record (Местоположение Ubuntu), запишите IP-адрес, связанный с исчезающим интерфейсом и время, по которому спустился интерфейс:

#!/bin/sh
{
  echo OLD_IP=$(ifconfig "$IFACE" | sed -n 's/^ *inet addr:\([0-9.]\+\).*/\1/p')
  echo OLD_DATE=$(date +%s)
} >"/var/run/$IFACE.ssh-sessions-record"

В /etc/network/if-up.d/ssh-sessions-record, уничтожьте соединения SSH, которые прошли этот сетевой интерфейс, но только если IP-адрес изменился, или достаточно времени протекло, которого, возможно, привел к таймауту сервер:

#!/bin/sh
if [ -e "/var/run/$IFACE.ssh-sessions-record" ]; then
. "/var/run/$IFACE.ssh-sessions-record"
NEW_IP=$(ifconfig "$IFACE" | sed -n 's/^ *inet addr:\([0-9.]\+\).*/\1/p')
NEW_DATE=$(date +%s)
if [ "$NEW_IP" != "$OLD_IP" ] || [ $(($NEW_DATE-$OLD_DATE)) -ge 300 ]; then
  ## Kill all ssh processes that were connecting through $OLD_IP
  for pid in $(lsof -Fp -n -i "tcp@$OLD_IP"); do
    if [ "$(ps -$pid -o comm=)" = "ssh" ]; then
      kill $pid
    fi
  done
fi
2
ответ дан 12.12.2019, 13:11

Начиная ни с кого еще попробовал этого, я буду делать попытку его. Если ничто иное, возможно, это будет подстрекать кого-то еще.

У меня нет ноутбука или текущего хинду удобными, поэтому возможно, Ubuntu будет достаточна. Моим текущим рабочим столом является Ubuntu 10.04... Вы не упоминали свою версию - надо надеяться, это близко.

Так или иначе я посмотрел бы на Новомодную конфигурацию (или/etc/inittab, если Вы не используете Выскочку). Проверьте выполнение выскочки:

# dpkg --list | grep upstart
ii  upstart          0.6.5-7     event-based init daemon

Очевидно, если Вы не видите что-то подобное, Вы, вероятно, используете init. Оба инструмента (выскочка и init) разработаны, чтобы сделать вещи на запуске, завершении работы, и т.д. (т.е., события).

В случае Выскочки, CD к Вашему/etc/init каталогу и посмотрели на файлы там. Так как я не нахожусь на ноутбуке, я не имею, "в спящем режиме или приостанавливают" функцию, но я держал пари, что Вы делаете. Попробуйте некоторые власти там для наблюдения:

/etc/init# egrep -i "suspend|hibernate" *

Однако мой control-alt-delete.conf файл кажется мне чем-то интересным. Если я посмотрел на него, я вижу:

/etc/init# cat control-alt-delete.conf 
# control-alt-delete - emergency keypress handling
#
# This task is run whenever the Control-Alt-Delete key combination is
# pressed, and performs a safe reboot of the machine.

description     "emergency keypress handling"
author          "Scott James Remnant <scott@netsplit.com>"

start on control-alt-delete

task
exec shutdown -r now "Control-Alt-Delete pressed"

Я был бы готов держать пари, что Вы могли настроить ту последнюю строку для сценариев некоторых выходов из системы SSH или примерно чего-либо, что Вы любите. Вы хотели бы обновить (или создать) надлежащий файл конфигурации. Я предполагаю, что установка ноутбука будет иметь что-то специфичным для, быть в спящем режиме/приостанавливать/и т.д. При рассмотрении некоторых из других файлов (как apport.conf) я вижу, что конфигурационные файлы на самом деле поддерживают сценарии, встроенные в них.

Если Вы имеете дело с init вместо выскочки, попытайтесь смотреть на/etc/inittab строки как:

# What to do when the power fails/returns.
pf::powerwait:/etc/init.d/powerfail start
pn::powerfailnow:/etc/init.d/powerfail now
po::powerokwait:/etc/init.d/powerfail stop
...
# What to do when CTRL-ALT-DEL is pressed.
ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r now

После того как Вы определили местоположение идеального места, на основе Вашей конфигурации, не будет слишком трудно бросить вместе сценарий удара, который мог уничтожить их и т.п.

Простой пример:

#!/bin/bash
kill -9 `ps -ef | grep "[s]sh " | awk '{print $2}'`

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

Почти забыл: Принятие Вас делает любой из который, необходимо было бы, вероятно, возвратить init для него для вступления в силу:

# kill -HUP 1
0
ответ дан 12.12.2019, 13:11

Теги

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