Я пытаюсь перезапустить 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 сеанс, поэтому, если вы сделаете ошибку, вы сможете повторно подключиться и снова прикрепить этот экран сеанс.
Или я неправильно понял вопрос.
Если вы хотите узнать, какой из sshd
s принадлежит вам, это действительно просто:
$ 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