Як вбити всі процеси користувача за допомогою їх UID


41

Я хочу знищити всі запущені процеси конкретного користувача з скрипту оболонки або з власного коду в системі Linux.

Чи потрібно читати каталог / proc і шукати їх?

Будь-які ідеї? Чи є в Linux динамічне відображення підводів під UID? Хіба це не в процедурі?

Якщо ні, то де цей список зберігається? Чи варто читати з нього? Також де знаходиться статичний список усіх UID в системі, щоб я міг підтвердити це, цей користувач існує, а потім перейти до знищення всіх процесів, що працюють під ним?


6
Ви хочете зробити інструмент для цього (pkill, slay, інші існують), або ви хочете написати це самостійно? Якщо перший, сайт обміну стеками надрукувань, ймовірно, кращий. Якщо останнє - це шлях, сканування / обробку і створення примітки для всіх процесів конкретним користувачем. Наприклад, вихідний код утиліти pkill показав би, як це зробити.

Не могли б ви пояснити, про що це питання стосувалося коментаря @ LarsWirzenius? Дякую!
Калеб

@Caleb: Я хотів вбити процеси, читаючи / proc, оскільки я не знав, що це робить будь-який інструмент. Також зараз я вважаю, що крім "убивати", "pkill", "skill" тощо немає в моїй системі. У такому випадку я думаю, що мені доведеться розглянути альтернативи сценарію оболонки, щоб прочитати / proc і розглянути спосіб отримання процесів під одним користувачем. Будь-які ідеї?
user489152

1
Щодо "статичного списку всіх UID ... так що я можу підтвердити це, існує цей користувач": немає такого поняття, як перевірка ідентифікатора користувача. Імена користувачів походять з бази даних, але ідентифікатори користувачів - це те, що setuid()обраний процес буде обраний.
Жил 'SO- перестань бути злим'

Відповіді:


53

Використовуйте pkill -U UIDабо pkill -u UIDабо ім’я користувача замість UID. Іноді skill -u USERNAMEможе працювати, інший інструмент є killall -u USERNAME.

Навичка була специфічною для Linux і тепер застаріла, а pkill - більш портативний (Linux, Solaris, BSD).

pkill дозволяють як числові, так і символічні UID, ефективні та реальні http://man7.org/linux/man-pages/man1/pkill.1.html

pkill - ... сигнальні процеси на основі імені та інших атрибутів

    -u, --euid euid,...
         Only match processes whose effective user ID is listed.
         Either the numerical or symbolical value may be used.
    -U, --uid uid,...
         Only match processes whose real user ID is listed.  Either the
         numerical or symbolical value may be used.

Сторінка чоловічої майстерності говорить, чи дозволяється використовувати лише ім’я користувача, а не ідентифікатор користувача: http://man7.org/linux/man-pages/man1/skill.1.html

майстерність, хитрість ... Ці інструменти є застарілими і непідданими. Синтаксис команд погано визначений. Подумайте про використання killall, pkill

  -u, --user user
         The next expression is a username.

killall не позначений як застарілий у Linux, але він також не працюватиме з числовим UID; єдине ім’я користувача: http://man7.org/linux/man-pages/man1/killall.1.html

killall - вбивати процеси по імені

   -u, --user
         Kill only processes the specified user owns.  Command names
         are optional.

Я думаю, будь-яка утиліта, яка використовується для пошуку процесу в стилі Linux / Solaris / proc (procfs), буде використовувати повний перелік процесів (виконуючи деякий перегляд /proc). Думаю, вони повторять /procцифрові вкладені папки та перевірять кожен знайдений процес на відповідність.

Щоб отримати список користувачів, використовуйте getpwent(він отримуватиме одного користувача за дзвінок).

інструменти skill (propps & procps-ng) та killall (psmisc) обидва використовують getpwnamвиклик бібліотеки для розбору аргументу -uпараметра, і буде розбиратися лише ім'я користувача. pkill(procps & procps-ng) використовує як atol, так і getpwnam для розбору -u/ -Uаргументу та дозволу як числового, так і текстового специфікатора користувача.


1
pkill не застарілий. Це може бути непридатним за межами Linux, але питання стосувалося саме Linux.

1
щоб отримати список користувачів, використовуйте один вкладиш: getent passwd | awk -F: '{print $ 1}'
Petesh

а як же я даю команду типу: "kill -ju UID" з виклику C system ()?

1
це вбудований Linux? у вас немає навичок, pkill і killall? Навіть оболонка з вбудованою навантаженою коробкою має pkill та killall.
osgx

2
killall -u USERNAMEпрацював як шарм
michalzuber

8

Якщо ви передаєте -1 як аргумент ідентифікатора процесу або killкоманді оболонки, або функції killС , тоді сигнал надсилається всім процесам, до яких він може досягти, що на практиці означає всі процеси користувача, які виконують killкоманду або syscall.

su -c 'kill -TERM -1' bob

В C (перевірка помилок пропущена):

if (fork() == 0) {
    setuid(uid);
    signal(SIGTERM, SIG_DFL);
    kill(-1, SIGTERM);
}

5

Якщо функція pkill недоступна у вашому дистрибутиві UNIX / Linux, ви можете виконати таку команду як основний користувач:

ps -ef | grep username | grep -v grep | awk '{print $2}' | xargs kill

де ім'я користувача - це той користувач, який обробляє ви хочете видалити


або просто pkill -U username.
osgx


0

Це добре працювало для мене. Ви можете знайти всі підпрограми процесів за іменем користувача, виконавши ps U <username>і перейдіть звідти. Спробуйте це:

ps U <username> | cut -d " " -f 1 | xargs kill
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.