Я разрабатываю демон, который барахлит, и теперь я не могу создавать новые процессы (т. е. я не могу запустить новый процесс, чтобы завершить другие вредоносные процессы). Поэтому мне нужно иметь возможность завершать процессы с удаленной машины. Как мне выполнить «завершение» удаленно без прав администратора? Если я не могу завершить свой собственный процесс с удаленной машины как обычный пользователь, то сообщите мне, чтобы я мог отметить это как правильный ответ.
решение1
Чтобы завершить процесс, работающий на машине, какой-то локальный процесс (или ядро) должен выдать сигнал завершения. Поэтому вам нужен способ заставить процесс выдать этот сигнал, и поскольку вы не можете создать новый процесс, вам нужно найти способ, который опирается исключительно на уже запущенные процессы.
Нет стандартного демона, который мог бы вам помочь. Они все обрабатывают вашу аутентификацию, а затем создают новый процесс (например, оболочку), работающий от вашего имени. Так что если у вас нет доступа к консоли и нет существующего взаимодействия с машиной, вам не повезло.
Из ваших комментариев следует, что у вас все еще есть оболочка на машине. Затем есть вещи, которые вы можете сделать. Вы не можете запустить какой-либо внешний процесс, например 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
невозможность перехвата).
решение2
Следующая информация была найдена на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).
решение3
Как вы сказали в своем комментарии, администратор — единственный человек, который может вам помочь в этом вопросе. Я предлагаю вам получитькулинарная книга Perlи прочитайте раздел 16.19, чтобы узнать о правильном методе обращения с зомби.