Как вы удаляете мягкого пользователя из вашей системы?

66

Я гуглил это немного назад и заметил несколько способов, но я предполагаю, что Google не знает все. Итак, как вы пинаете пользователей с вашего Linux-бокса? Кроме того, как вы видите, что они вошли в систему? и связанный с этим ... работает ли ваш метод, если пользователь вошел в систему X11 DE (это не требование, мне просто любопытно)?

xenoterracide
источник
3
Изменен вопрос, чтобы отразить предположения с учетом принятого ответа. В контексте нарушения безопасности единственный способ выгнать злоумышленника из вашей системы - быть намного умнее этого пользователя. Умный пользователь не позволит себе проявиться в utmp или найти что-то столь же тривиальное, как who(1)или w(1). Единственный надежный способ избавиться от любых возможных руткитов, которые могут быть установлены, - это полностью стереть и переустановить систему.
jw013

Ответы:

140

Вероятно, есть более простой способ, но я делаю это:

  1. Посмотрите, кто вошел в вашу машину - используйте whoили w:

    > who  
    mmrozek  tty1         Aug 17 10:03  
    mmrozek  pts/3        Aug 17 10:09 (:pts/2:S.0)
    
  2. Найдите идентификатор процесса оболочки, к которой подключен их TTY:

    > ps t  
    PID   TTY      STAT   TIME COMMAND  
    30737 pts/3    Ss     0:00 zsh
    
  3. Смейтесь над их надвигающимся разъединением (этот шаг не обязателен, но приветствуется)

    > echo "HAHAHAHAHAHAHAHA" | write mmrozek pts/3
    
  4. Убейте соответствующий процесс:

    > 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)
Михаил Мрозек
источник
61
+1 за «Смейтесь над их надвигающимся разъединением (этот шаг не обязателен, но приветствуется)»
Джош
9
kill -9а? Вы действительно находитесь в режиме BOFH на этом.
Январь
12
@ Jander Вы выгнали пользователя из системы; как хорошо ты должен быть?
Майкл Мрозек
6
Обычно я бы сказал, что не поощряйте людей злоупотреблятьkill -9 , а вместо этого начните с более мягких сигналов , но я полагаю, что в этом контексте это не так важно. Я просто оставляю комментарий на случай, если люди пропустят шутку.
jw013
5
Также есть убийство, которое в основном автоматизирует весь процесс (даже высмеивая вашу жертву, если вы включаете режим «Баттхед»)
Ульрих Дангел
32

Как уже отмечал Micheal, вы можете использовать, whoчтобы узнать, кто вошел в систему. Однако, если у них есть несколько процессов, есть более удобный способ, чем уничтожение каждого процесса по отдельности: вы можете использовать, killall -u usernameчтобы убить все процессы этого пользователя.

sepp2k
источник
+1. Использование killallтакже будет немного более уместным в графических средах, так как нужно убивать не только оболочку.
Джон В. У. Смит,
3
ВНИМАНИЕ: Если вы используете это для пользователя root, вы уничтожите все корневые процессы, и вам потребуется физически перезапустить сервер.
Кунок
1
@ Kunok, в какой ситуации вы хотите выгнать пользователя с правами root? Например, если этот аккаунт похитили или что-то в этом роде?
Алексей Магура
23

Некромантия!

Я ценю юмор принятого ответа, но профессионально я не могу защищать его.

Самый изящный метод, который я знаю, это отправить -HUP в оболочку для имитации зависания пользователя. Вы можете отправить это на sdle sshd пользователя, чтобы имитировать потерянное соединение, которое запускает очистку всей среды оболочки (включая дочерние оболочки), или отправить это на определенные вложенные оболочки (скажем, те, которые установлены внутри мультиплексора отключенного терминала, который удерживает вас от размонтирования файловой системы), если вы хотите быть очень точным.

Использование writeсообщений для окончательного простоя ptys перед их загрузкой - забавное хобби.

Андрей Б
источник
1
Хотя псевдо-всемогущее чувство, сопровождающее убийство -9, забавно, это предположение, вероятно, лучше. Голосование от меня.
Эндрю Фаланга
4
Чтобы сделать этот ответ явным, я сделал следующее: echo "Hasta la vista, baby" | write user_name pty_name && sleep 30 && killall -u user_name -HUP(сон дает пользователю возможность сохранить и выйти из системы, но вы, вероятно, используете это только для пользователя, который все равно забыл выйти из системы)
wkschwartz,
13

Выйдите из системы 'username':

skill -KILL -u username

Видеть man skill

BSD
источник
3
Я думаю, что это убьет все процессы этого пользователя, не только его оболочку, но если это то, что вы хотите, то это определенно проще
Майкл Мрозек
Я не вижу, чтобы это работало над RHEL7
антивиртель
11

Другая полезная команда pkillздесь pkill -u username && pkill -9 -u username. killallесть недостаток в том, что в Solaris IIRC это означает что-то совершенно другое - также pkillесть немного более продвинутые опции.

Мацей Печотка
источник
8
В Solaris killall используется сценариями завершения работы для уничтожения (почти) всех процессов на сервере. «Он делает то, что говорит на банке».
д-р Ян
Ребята, почему вы так любите SIGKILL? Запущенные программы и приложения даже не смогут сохранить данные и немного их очистить. SIGTERM (как используется при выключении) или SIGHUP тоже подойдут и будут более изящными. (Вы все еще можете отправить SIGKILL после истечения льготного периода.)
контррежим
3

Прежде всего, это указывает на большую проблему. Если у вас есть пользователи, которым вы не доверяете в своей системе, вам, вероятно, следует выровнять их и переизобразить.

Имея это в виду, вы можете выполнить некоторые или все из следующих действий:

# настроить среду
$ BADUSER = foo #, где foo - это имя пользователя, о котором идет речь
$ 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 = $ (дата +% F)
$ TAR_FILENAME = "$ {BADUSER} - $ {TSTAMP} .tar.bz2"
$ OWNED_FILENAME = "$ {BADUSER} -файлы - $ {TSTAMP} .txt"

# отключить будущий логин пользователя
$ sudo chsh -s / bin / false "$ {BADUSER}"

# убить все процессы пользователя
$ BADPROCS = $ (ps auwx | grep '^ $ {BADUSER}' | awk '{print $ 2}')
$ sudo kill -9 $ {BADPROCS}

# создать резервную копию / очистить домашний каталог пользователя
$ mkdir -p $ {BDIR}
$ sudo tar -cfj $ {BDIR} / $ {TAR_FILENAME} $ {BADHOMEDIR}
$ sudo rm -rf $ {BADHOMEDIR} /.* $ {BADHOMEDIR} / *

# найти все файлы, принадлежащие пользователю
$ sudo find / -user $ {BADUSER}> ~ / backup / $ {OWNED_FILENAME}

# удалить пользователя
$ sudo userdel $ {BADUSER}
cjac
источник
Я не знаю, согласен ли я с "level it reimage", это unix, а не windows ... У меня действительно нет этой проблемы ... Я просто спрашивал.
ксенотеррацид
3
Кроме того, только потому, что вы должны выгнать пользователя, не обязательно означает, что он не заслуживает доверия. Может быть, они просто забыли выйти из системы.
Дэвид Z
xenoterracide: Может быть, я просто защищаю системы, которые я поддерживаю, но если бы у меня был пользователь, который, по моему мнению, должен был быть принудительно удален из системы, находящейся под моим контролем, могло бы произойти что-то серьезное.
cjac
-1 для чтения вопросов в вопросе, которые логически не следуют, и перетаскивания вопросов / ответов вне темы.
Уэсли
you have users that you don't trust on your system... Или это может быть то, что вы убиваете одного как сообщение для других. В конце концов, является ли кредо сисадмина «Лучше бояться, чем быть любимым»? Помимо шуток, Макиавелли должен написать книгу О'Рейли.
Парфянский снимок
0

Я огляделся вокруг и не смог найти ни одного скрипта для автоматизации этой задачи.

Итак, основываясь на предложенных здесь решениях, я смешал все в интерактивном скрипте Bash, в котором перечислены пользователи и сеансы, who -uчтобы пользователь мог выбрать, что ему делать.

Вы можете затем либо:

  • убить все сеансы для пользователя killall -u <username> -HUP
  • убить определенный сеанс kill <PID>

Вся необходимая информация поступает who -uи затем анализируется с помощью mapfileи awk.

Я добавлю возможность отправки сообщения, используя writeпозже (разветвление процесса с задержкой).

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

Вы можете проверить код на github, если вы хотите попробовать его или узнать больше о том, как я делаю это в автоматическом режиме:

Гас Невес
источник
0

Итак, как вы выгнаете [доброкачественных] пользователей из своего Linux-бокса?

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

В основном два ответа ...

Вариант A: вызвать выход из системы указанного пользователя, для которого когда-либо и сколько бы логинов у них не было. Так что это будет означать идентификацию тех процессов, которые принадлежат пользователю, отслеживаются uid и классифицируются как часть какого-либо процесса входа в систему для данного дистрибутива linux, который вы запускаете. Поймите, что есть родительские процессы, такие как SSH или VNC до «входа в систему» ​​и дочерние процессы, такие как GDM после «входа в систему». Обычно уничтожение родительского процесса убивает дочерний процесс, но не всегда. Таким образом, вы захотите убить эти другие процессы, которые, очевидно, больше не нужны после выхода из системы. При выполнении всего этого фоновые задания будут работать ... потому что это доброжелательный пользователь, и, возможно, вы просто хотите выйти из него. Насколько я знаю, /usr/bin/wи /usr/bin/whoсообщу, кто прошел через процесс входа в систему.

Вариант B: полностью завершить все процессы, принадлежащие определенному uid, что будет означать просто уничтожение всех процессов, принадлежащих указанному пользователю, это также приведет к их выходу из системы, если они вошли в систему. Это удовлетворит удаление их из системы . Это должно быть просто, ps -ef | grep <uid>а затем завершить все эти процессы любым приемлемым способом.

fwiw в SLES 11 сообщает

навык человека ... Эти инструменты, вероятно, устарели и непереносимы. Синтаксис команды плохо определен. Попробуйте вместо этого использовать команды killall, pkill и pgrep.

kill -9 FTW!

рон
источник
-1

По моему мнению, это не очень полезно для использования, killall -u usernameпотому что, если это тот же пользователь, что и вы, вы начнете себя. Так killчто процесс будет лучшим решением.

Mailo
источник
Также, если есть процессы, запущенные этим пользователем, возможно, SSHD, вы никогда не зайдете на Сервер, что приведет к отключению SSH.
Майло
3
С какой стати демон SSH (или любой демон) будет работать с использованием учетных данных пользователя, которого необходимо принудительно отключить от системы по какой-либо реалистичной причине вообще? Кроме того, что добавляет этот ответ, который не охватывается ни ответом Михаила Мрозека, ни ответом Эндрю Б. (и, возможно, других)?
CVN
-2

Эта команда отлично работала для GUI, мой "значительный" отказывается выходить из ...

leaves@me:/# skill -HUP -u username
  • Я не знаю, что случилось.
  • Там должно быть обновление.
  • «Гугл» снова отключился.
  • Это был вирус на InterWebs.

Некоторые диверсии на случай, если они вам понадобятся.

JaInI
источник
1
Это уже упоминалось в ответе BSD.
Стивен Китт