Назад | Перейти на главную страницу

Перезапуск SSH и уничтожение экземпляров?

Я пытаюсь перезапустить SSH в Ubuntu, используя:

sudo /etc/init.d/ssh restart

но это просто дает мне:

Вместо того, чтобы вызывать сценарии инициализации через /etc/init.d, используйте служебную программу service (8), например перезапуск службы ssh

Однако запуск, который дает:

перезапуск: Неизвестный экземпляр:

Бег:

ps -A | grep ssh

дает 3 экземпляра.

Вопрос

Как мне определить, какой у меня экземпляр, и убить остальных? Позволит ли это перезапустить?

Кто-нибудь может мне с этим помочь?

Вызов сценария init.d должен перезапустить службу:

dermot@porkboy:~$ sudo /etc/init.d/ssh restart
[sudo] password for dermot:
Rather than invoking init scripts through /etc/init.d, use the service(8)
utility, e.g. service ssh restart

Since the script you are attempting to invoke has been converted to an
Upstart job, you may also use the stop(8) and then start(8) utilities,
e.g. stop ssh ; start ssh. The restart(8) utility is also available.
ssh stop/waiting
ssh start/running, process 4877
dermot@porkboy:~$

'service ssh restart' здесь отлично работает (11.04). Стоит отметить, что перезапуск sshd не убивает существующие сеансы SSH. Когда вы входите в ящик через SSH, sshd порождает новые процессы для обработки сеанса. Перезапуск sshd убьет основной процесс демона sshd (и, очевидно, запустит его снова), но оставит нетронутыми другие порожденные экземпляры sshd. Вам нужно такое поведение, потому что оно значительно упрощает жизнь при работе с автономными серверами в удаленных центрах обработки данных!

Теперь, чтобы ответить на оставшийся вопрос. Вместо того, чтобы запускать 'ps -A', попробуйте следующее:

dermot@porkboy:~$ ps -ef | grep ssh
root      2522     1  0 Aug29 ?        00:00:00 sshd: dermot [priv]
dermot    2615  2522  0 Aug29 ?        00:00:04 sshd: dermot@pts/0
root      4655     1  0 10:52 ?        00:00:00 sshd: dermot [priv]
dermot    4756  4655  0 10:52 ?        00:00:00 sshd: dermot@pts/1
root      4887     1  0 10:55 ?        00:00:00 /usr/sbin/sshd -D

Вероятно, это связано с тремя процессами sshd, которые вы видите - один для основного демона sshd, а затем два (корневой родитель, дочерний дермот) за сеанс. Я SSHed из двух мест o у меня пять процессов. Бит pts / X относится к виртуальному терминалу, к которому подключен сеанс, поэтому ...

dermot@porkboy:~$ who
dermot   pts/0        2011-08-29 21:32 (williams-mb.local)
dermot   pts/1        2011-08-30 10:52 (192.168.253.109)

... дает нам некоторое представление о том, какая сессия является какой. Так что, если бы я хотел убить сеанс со своего MacBook, я бы убил -9 2522.

Когда вы перезапускаете демон SSH с помощью

sudo /etc/init.d/ssh restart

или

service ssh restart

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

ps -ef | egrep '(ssh|PID)'

Вы получите один / usr / sbin / sshd с PPID 1 и UID корень. Это демон прослушивания. Все остальные sshd: пользователь @ pts / 0 записи - это пользовательские сеансы. Найдите подходящий сеанс по имени пользователя и завершите процесс, чтобы завершить этот сеанс.

Я бы рекомендовал сделать все это в Экран GNU сеанс, поэтому, если вы сделаете ошибку, вы сможете повторно подключиться и снова прикрепить этот экран сеанс.

Или я неправильно понял вопрос.

Если вы хотите узнать, какой из sshds принадлежит вам, это действительно просто:

$ ps -aef --forest | egrep "(sshd|PID|David Newcomb is ace)"

UID        PID  PPID STIME TTY        TIME CMD
root      1234     1  2018 ?      00:02:13 /usr/sbin/sshd
root     30546  1234 19:54 ?      00:00:00  \_ sshd: root@pts/0
root     32069 30548 20:17 pts/0  00:00:00  |  \_ egrep (sshd|PID|David Newcomb is ace)
root     30692  1234 19:56 ?      00:00:00  \_ sshd: root@pts/1
root     31890  1234 20:16 ?      00:00:00  \_ sshd: root [priv]
sshd     32054 31890 20:16 ?      00:00:00  |   \_ sshd: root [net]
root     31891  1234 20:17 ?      00:00:00  \_ sshd: [accepted]
sshd     32065 31891 20:17 ?      00:00:00      \_ sshd: [net]

Вы тот, кто управляет egrep !

Вот сценарий, который я написал, который завершит все сеансы SSH, кроме текущего (того, который запускает сценарий):

Большое спасибо Дэвид Ньюкомб и Патрик за помощь в создании этого скрипта.

#!/bin/bash

# Many thanks to stackoverflow.com user "patrik" for the following
containsElement () {
  local e match="$1"
  shift
  for e; do [[ "$e" == "$match" ]] && return 0; done
  return 1
}

SKIP_PIDS=()
ALL_PIDS=()
SESSIONS=`sudo ps -aef --forest | egrep "(sshd|__MY_ID__)"`

# Get root PIDs and add them to the skip list
ROOT_PIDS_STR=$(echo "$SESSIONS" | grep 'root' | sed -E 's/[[:space:]]+/@@@/g' | tr "\n" ' ')
ROOT_PIDS=($ROOT_PIDS_STR)

# Collect root PIDs and add them to the skip list
for LINE in "${ROOT_PIDS[@]}"; do
  LINE=$(echo "$LINE" | sed -E 's/@@@/ /g')
  PID=$(echo "$LINE" | cut -d ' ' -f 2)
  SKIP_PIDS+=($PID)
done

# Get my PID and add to the skip list
MY_PID=`echo "$SESSIONS" | grep -B 1 '__MY_ID__' | head -n 1 | sed -E 's/[[:space:]]+/ /g' | cut -d ' ' -f 2`
SKIP_PIDS+=($MY_PID)

# Get all PIDs, and only add those that aren't in the skip list
PIDS_STR=$(echo "$SESSIONS" | grep -v '__MY_ID__' | sed -E 's/[[:space:]]+/@@@/g' | tr "\n" ' ')
LINES=($PIDS_STR)

# Add all non-skip PIDs to the list of processes to kill
for LINE in "${LINES[@]}"; do
  LINE=$(echo "$LINE" | sed -E 's/@@@/ /g')
  PID=$(echo "$LINE" | cut -d ' ' -f 2)
  containsElement "$PID" "${SKIP_PIDS[@]}"

  if [ $? -ne 0 ]; then
    ALL_PIDS+=($PID)
  fi
done

# Kill all PIDs not in the skip list
for PID in "${ALL_PIDS[@]}"; do
  sudo kill -15 "$PID"
done