Решения, данные до сих пор главным образом, работают в более простом случае: имя хоста непосредственно решает к единственному адресу IPv4. Это могло бы быть единственным случаем, где необходимо разрешить, что имена хостов, но в противном случае ниже обсуждение некоторых случаев, которые Вы, возможно, должны были бы обработать.
Chris Down и Heinzi кратко обсудили случай, где имя хоста решает больше чем к одному IP-адресу. В этом случае (и другие ниже), основные сценарии под предположением, что имя хоста непосредственно решает к единственному IP-адресу, могут повредиться. Ниже, пример с именем хоста, решающим к больше, чем единственный IP-адрес:
$ host www.l.google.com
www.l.google.com has address 209.85.148.147
www.l.google.com has address 209.85.148.103
www.l.google.com has address 209.85.148.99
www.l.google.com has address 209.85.148.106
www.l.google.com has address 209.85.148.105
www.l.google.com has address 209.85.148.104
Но что www.l.google.com
? Это - то, где случай псевдонима должен быть представлен. Давайте проверим пример ниже:
$ host www.google.com
www.google.com is an alias for www.l.google.com.
www.l.google.com has address 74.125.39.103
www.l.google.com has address 74.125.39.147
www.l.google.com has address 74.125.39.105
www.l.google.com has address 74.125.39.99
www.l.google.com has address 74.125.39.106
www.l.google.com has address 74.125.39.104
Так www.google.com
непосредственно не решает к IP-адресам, но к псевдониму, который самому решает к нескольким IP-адресам. Для получения дополнительной информации о псевдонимах проверьте здесь. Конечно, случай, где псевдоним имеет единственный IP-адрес, возможен, как показано ниже:
$ host g.www.ms.akadns.net
g.www.ms.akadns.net is an alias for lb1.www.ms.akadns.net.
lb1.www.ms.akadns.net has address 207.46.19.190
Но псевдонимы могут быть объединены в цепочку? Ответ - да:
$ host www.microsoft.com
www.microsoft.com is an alias for toggle.www.ms.akadns.net.
toggle.www.ms.akadns.net is an alias for g.www.ms.akadns.net.
g.www.ms.akadns.net is an alias for lb1.www.ms.akadns.net.
lb1.www.ms.akadns.net has address 207.46.19.254
$ host www.google.fr
www.google.fr is an alias for www.google.com.
www.google.com is an alias for www.l.google.com.
www.l.google.com has address 74.125.39.147
www.l.google.com has address 74.125.39.103
www.l.google.com has address 74.125.39.99
www.l.google.com has address 74.125.39.106
www.l.google.com has address 74.125.39.104
www.l.google.com has address 74.125.39.105
Я не нашел примера, где имя хоста решает к псевдониму, который не решает к IP-адресу, но я думаю, что случай мог бы произойти.
Больше, чем несколько IP-адресов и псевдонимов, там некоторые другие особые случаи... что относительно IPv6? Вы могли попробовать:
$ host ipv6.google.com
ipv6.google.com is an alias for ipv6.l.google.com.
ipv6.l.google.com has IPv6 address 2a00:1450:8007::68
Где имя хоста ipv6.google.com
имя хоста только для IPv6. Что относительно имен хостов двойного стека:
$ host www.facebook.com
www.facebook.com has address 66.220.153.15
www.facebook.com has IPv6 address 2620:0:1c08:4000:face:b00c::
Снова о IPv6, если Вашим хостом является IPv4 только, можно все еще разрешить адреса IPv6 (протестированный на IPv4 только WinXP и с ipv6.google.com, Вы могли попробовать его на Linux). В этом случае разрешение успешно выполняется, но ping перестал работать с неизвестным сообщением об ошибке хоста. Это могло бы быть случаем, где Ваши сценарии перестали работать.
Я надеюсь, что те комментарии были полезны.
Существует, вероятно, более легкий путь, но я делаю это:
Посмотрите, кто вошел в Вашу машину - использование who
или w
:
> who
mmrozek tty1 Aug 17 10:03
mmrozek pts/3 Aug 17 10:09 (:pts/2:S.0)
Ищите идентификатор процесса оболочки, с которой подключен их TTY:
> ps t
PID TTY STAT TIME COMMAND
30737 pts/3 Ss 0:00 zsh
Смех при их предстоящем разъединении (этот шаг является дополнительным, но поощренный),
> echo "HAHAHAHAHAHAHAHA" | write mmrozek pts/3
Уничтожьте соответствующий процесс:
> kill -9 30737
Я просто обнаружил, что можно объединить шаги 1 и 2 путем предоставления who
-u
флаг; PID является числом прочь направо:
> who -u
mmrozek tty1 Aug 17 10:03 09:01 9250
mmrozek pts/18 Aug 17 10:09 01:46 19467 (:pts/2:S.0)
Как Micheal, на который уже указывают, можно использовать who
узнать, кто вошел в систему. Однако, если у них есть несколько процессов, существует более удобный способ, чем уничтожение каждого процесса индивидуально: можно использовать killall -u username
уничтожить все процессы тем пользователем.
killall
также будет немного более соответствующим в графических средах, так как существуют больше, чем просто оболочка для уничтожения.
– John WH Smith
15.10.2014, 22:25
Выход из системы пользователь 'имя пользователя':
skill -KILL -u username
Посмотрите man skill
Другая полезная команда pkill
здесь pkill -u username && pkill -9 -u username
. killall
имейте недостаток, что на Солярисе IIRC это означает что-то совершенно другое - также pkill
имейте немного больше расширенных настроек.
В первую очередь, это указывает на большую проблему. Если у Вас есть пользователи, которым Вы не доверяете в своей системе, необходимо, вероятно, выровнять ее и переизображение.
Имея это в виду, можно сделать некоторых или все следующее:
# set up the environment $ BADUSER=foo # where foo is the username in question $ USERLINE=$(grep '^${BADUSER}:' /etc/passwd) $ BADUID=$(echo ${USERLINE} | awk -F: '{print $3}') $ BADGID=$(echo ${USERLINE} | awk -F: '{print $4}') $ BADHOMEDIR=$(echo ${USERLINE} | awk -F: '{print $6}') $ BDIR="~/backup/home-backup/" $ TSTAMP=$(date +%F) $ TAR_FILENAME="${BADUSER}-${TSTAMP}.tar.bz2" $ OWNED_FILENAME="${BADUSER}-files-${TSTAMP}.txt" # disable the user's future login $ sudo chsh -s /bin/false "${BADUSER}" # kill all of the user's processes $ BADPROCS=$(ps auwx | grep '^${BADUSER} ' | awk '{print $2}') $ sudo kill -9 ${BADPROCS} # back up/clear the user's home directory $ mkdir -p ${BDIR} $ sudo tar -cfj ${BDIR}/${TAR_FILENAME} ${BADHOMEDIR} $ sudo rm -rf ${BADHOMEDIR}/.* ${BADHOMEDIR}/* # find all files owned by user $ sudo find / -user ${BADUSER} > ~/backup/${OWNED_FILENAME} # remove user $ sudo userdel ${BADUSER}
you have users that you don't trust on your system
... Или могло просто случиться так уничтожением того как сообщения другим. В конце концов, кредо системного администратора не, "Лучше бояться, чем быть любимым"? Все шутки в стороне, Machiavelli должен записать книгу O'Reilly.
– Parthian Shot
09.07.2014, 18:27
Некромантия!
Я ценю юмор принятого ответа, но профессионально я не могу защитить его.
Самый корректный метод, о котором я знаю, должен отправить - ПОНУКАЮТ к оболочке для моделирования пользовательского зависания. Можно отправить это в неактивный sshd пользователя для моделирования их потерянного соединения, который инициировал очистку всей среды оболочки (включая дочерние оболочки), или отправьте, это к определенным вложенным оболочкам (скажите, устанавливающие в разъединенном оконечном мультиплексоре, которые мешают Вам размонтировать файловую систему), если Вы хотите быть действительно точными.
Используя write
для отправки сообщений для терминального бездействия, имущества перед начальной загрузкой их, являются забавным хобби все же.
echo "Hasta la vista, baby" | write user_name pty_name && sleep 30 && killall -u user_name -HUP
(сон дает пользователю шанс сохранить и выйти из системы, но Вы, вероятно, только используете это на пользователе, который забыл выходить из системы так или иначе)
– wkschwartz
15.10.2014, 21:10
По-моему, не действительно полезно использовать killall -u username
потому что, если это - тот же пользователь как Вы, Вы сбросите себя с ноги. Так kill
процесс будет лучшим решением.
Я осмотрелся и не нашел ни одного сценария для автоматизации этой задачи.
Итак, на основе предложенных здесь решений я смешал все в интерактивном сценарии Bash , который перечисляет пользователей и сеансы из who -u
, чтобы пользователь мог выбрать, что делать.
Затем вы можете:
killall -u -HUP
kill
Вся необходимая информация поступает от who -u
и затем анализируется с помощью mapfile
и awk
.
Я добавлю возможность отправки сообщения с помощью write
позже (разветвление процесса с задержкой).
Я, вероятно, добавлю возможность убить конкретный сеанс с помощью kill -9
. Но у меня не было проблем с просто kill
, и, как указывали другие, следует по возможности избегать kill -9
.
Вы можете проверить код на github, если хотите попробовать, или узнать больше о том, как я делаю это автоматически:
Эта команда отлично сработала для графического интерфейса, из которого мой «значимый» отказывается выходить...
leaves@me:/# skill -HUP -u username
Некоторые отвлекающие маневры на случай, если они вам понадобятся.
So how do you kick [benign] users off your Linux box?
В конечном итоге все сводится к идентификации и завершению тех процессов, которые принадлежат, связаны или порождены пользовательским -идентификатором. Какие бы команды вы ни использовали для достижения конечной цели, это не обязательно имеет значение, пока вы ее достигаете.
В основном два ответа...
Вариант А:вызывает выход из системы указанного пользователя, для которого когда-либо и сколько у него входов в систему. Таким образом, это будет означать идентификацию тех процессов, которые принадлежат пользователю, отслеживаются по uid и классифицируются как часть некоторого процесса входа в систему для данного дистрибутива Linux, который вы используете. Поймите, что есть родительские процессы, такие как SSH или VNC, до «логина» и дочерние процессы, такие как GDM, после «логина». Обычно удаление родительского процесса убивает дочерний процесс, но не всегда. Таким образом, вы захотите убить эти другие процессы, которые, очевидно, больше не нужны после выхода из системы. При выполнении всего этого это будет поддерживать выполнение фоновых заданий... потому что это доброкачественный пользователь, и, возможно, вы просто хотите выйти из него. Насколько я знаю, /usr/bin/w
и /usr/bin/who
будут сообщать, кто прошел через процесс входа в систему.
вариант B:полностью завершить все процессы, принадлежащие определенному uid, что просто означает уничтожение всех и всех процессов, принадлежащих указанному пользователю, это также приведет к их выходу из системы, если они вошли в систему. Это удовлетворит выкинуть их из системы . Это должно быть просто ps -ef | grep <uid>
, а затем завершение всех этих процессов любым приемлемым способом.
fwiw в SLES 11 он сообщает
man skill ... These tools are probably obsolete and unportable. The command syntax is poorly defined. Consider using the killall, pkill, and pgrep commands instead.
kill -9
ДА!
kill -9
, ха? Вы действительно находитесь в режиме BOFH на этом. – Jander 18.02.2011, 09:43kill -9
, и запустите с более нежных сигналов вместо этого, но я предполагаю в этом контексте, он не имеет значения так. Я просто оставляю комментарий в случае, если люди пропускают шутку. – jw013 27.07.2012, 20:41