it-swarm-ru.tech

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

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

68
xenoterracide

Там, вероятно, более простой способ, но я делаю это:

  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 the -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)
147
Michael Mrozek

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

33
sepp2k

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

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

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

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

23
Andrew B

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

skill -KILL -u username

Видеть man skill

13
bsd

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

11
Maciej Piechotka

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

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

 # настроить среду 
 $ 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 } -files - $ {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} 
3
cjac

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

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

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

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

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

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

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

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

0
Gus Neves

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

0
Mailo

Итак, как вы выгнаете [доброкачественных] пользователей из своего 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!

0
ron