Я разрабатываю демон, который работает, и теперь я не могу создавать какие-либо новые процессы (т.е. Я не могу начать новый процесс, чтобы убить другие мошеннические процессы). Итак, мне нужно иметь возможность убивать процессы с удаленной машины. Как я могу "убить" удаленно без прав администратора? Если я не могу убить свой собственный процесс с удаленной машины как обычный пользователь, то скажите мне, чтобы я мог пометить его как правильный ответ.
3 ответа
Чтобы убить процесс, запущенный на машине, некоторый локальный процесс (или ядро) должен испустить сигнал уничтожения. Таким образом, вам нужен способ заставить этот процесс излучать этот сигнал, и поскольку вы не можете создать новый процесс, вам нужно найти способ, который основан исключительно на уже запущенных процессах.
Там нет стандартного демона, который может помочь вам там. Все они обработают вашу аутентификацию, а затем развернут новый процесс (такой как оболочка), работающий от вашего имени. Так что если у вас нет консольного доступа и нет взаимодействия с машиной, вам не повезло.
Судя по вашим комментариям, у вас все еще есть оболочка на машине. Тогда есть вещи, которые вы можете сделать. Вы не можете запустить какой-либо внешний процесс, такой как ls
или ps
. Но вы можете запускать встроенные команды, такие как echo
, read
и kill
(kill
не встроен во все оболочки, но он один во всех оболочках, которые поддерживают управление заданиями, например, bash и zsh).
С каждым процессом связан каталог в /proc
: /proc/12345
где 12345 - это идентификатор процесса. Таким образом, вы можете получить некоторую информацию о существовании, изучив /proc
. здесь полезно использовать echo
с подстановочными знаками, например, cd /proc; echo [0-9]*
показывает идентификаторы всех запущенных процессов. Если оболочкой является zsh, вы можете многое сделать с квалификаторами glob; например, echo /proc/*(u$UID)
показывает только процессы, запущенные под вашим идентификатором пользователя.
Способ отображения содержимого файла без разветвления
while read -r line; do
echo "$line"
done </path/to/file
Вы можете убить много процессов одновременно, передав их всем для kill
. Если вы определили процесс, который принадлежит вашему демону, попробуйте убить его группу процессов с помощью kill -9 -PGID
где PGID
- это идентификатор процесса лидера группы. Вы можете найти идентификатор группы процессов для процесса 123 с помощью параметра </proc/123/stat read pid tcomm state ppid pgrp sid more; echo $pgrp
. (Та же информация существует в более читаемой форме в /proc/123/
но вы не в хорошем состоянии ее читать.) Вы также можете попробовать отправить сигнал всем вашим процессам (включая исходную оболочку) с помощью
trap : NUM
kill -NUM -1
Выберите значения NUM, отличные от KILL
(9), чтобы команда trap
заставляла вашу оболочку игнорировать сигнал (KILL
не может быть перехвачен).
Следующая информация была найдена в http://www.cyberciti.biz/faq/kill-process-in-linux-or-terminate-a-process-in-unix-or-linux-systems/
Убить процесс с помощью команды kill в Linux/UNIX
Команда kill работает как в Linux, так и в UNIX/BSD-подобных операционных системах.
Шаг № 1: Во-первых, вам нужно узнать PID процесса (идентификатор процесса)
Используйте команду ps или команду pidof, чтобы узнать идентификатор процесса (PID). Синтаксис: ps aux | grep имя процесса pidof имя процесса
Например, если имя процесса - lighttpd, вы можете использовать любую из следующих команд для получения идентификатора процесса:
ps aux | grep lighttpdOutput
lighttpd 3486 0.0 0.1 4248 1432 ? S Jul31 0:00 /usr/sbin/lighttpd -f /etc/lighttpd/lighttpd.conf
lighttpd 3492 0.0 0.5 13752 3936 ? Ss Jul31 0:00 /usr/bin/php5-cg
ИЛИ используйте команду pidof, которая используется для поиска идентификатора процесса работающей программы:
pidof lighttpd
Выход
3486
Шаг № 2: убить процесс, используя PID (идентификатор процесса)
Выше команды говорят вам PID (3486) процесса lighttpd. Теперь убейте процесс, используя этот PID:
# kill 3486
ИЛИ ЖЕ
# kill -9 3486
Где, -9 - специальный сигнал Kill, который убивает процесс.
примеры команд killall
НЕ ИСПОЛЬЗУЙТЕ команду killall в системе UNIX (только для Linux). Вы также можете использовать команду killall. Команда killall уничтожает процессы по имени (не нужно искать PID):
# killall -9 lighttpd
Убить процесс Firefox:
# killall -9 firefox-bin
Как я уже говорил ранее, killall в системе UNIX делает что-то еще. Это убивает весь процесс, а не только конкретный процесс. Не используйте killall в системе UNIX (используйте kill -9).
Как вы сказали в своем комментарии, администратор - единственный человек, который может помочь вам в этом. Я предлагаю вам получить поваренную книгу Perl и прочитать раздел 16.19, чтобы узнать, как правильно обращаться с зомби.