Это помогает в debian gsettings set org.gnome.settings-daemon.plugins.rfkill active false
Если у вас есть учетные данные другого пользователя и учетные данные целевого пользователя можно использовать для изменения файловой системы, вы можете скомпилировать следующую программу, установите бит s и использовать учетные данные другого пользователя для его выполнения.
ПРИМЕЧАНИЕ: исполняемый файл должен принадлежать целевому пользователю, чтобы иметь возможность установить seteuid
на uid
целевого пользователя.
Первым аргументом программы является uid
целевого пользователя.
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <signal.h>
#include <errno.h>
int main(int argc, char**argv) {
if(seteuid(atoi(argv[1])) != 0) {
printf("seteuid failed... %d", errno);
}
if(kill(-1, SIGTERM) != 0) {
printf("kill failed...%d", errno);
}
return 0;
}
Когда я вижу теги nproc и "ulimit", я добавляю 2 балла к этому механизму ulimit:
Я ожидаю, что ваш системный администратор установил мягкое ограничение немного ниже, чем жесткое ограничение, точно чтобы избежать дела, в котором вы находитесь. Таким образом, вы можете увеличить мягкое значение, чтобы запустить su
из другой учетной записи и использовать это для уничтожения.
Также имейте в виду, что ulimit устанавливается PAM ( grep -r pam_limits.so /etc/pam.d/
), поэтому, если у вас есть метод / программа аутентификации, которая не используйте этот модуль PAM, вы можете избежать этого ulimit и сгенерировать kill.
Помимо этих двух решений, которые требуют действий до возникновения проблемы, действительно нет способа отправить сигнал существующей программе без правильного доступа (тот же пользователь, root, setuid или возможность CAP_KILL
).
Если nproc
достигнуто, ядро не позволит другим процессам работать с учетными данными этого пользователя, как вы узнали. Это означает, что нет удаленного сеанса по SSH, нет su
или sudo
, даже программы, установленной для их учетной записи.
Это оставляет вас либо с корнем, либо с пользователем, если у него все еще есть рабочий интерактивный сеанс. Поскольку вы исключили root, вам придется надеяться, что у вашего пользователя все еще запущена оболочка. Если это так, в их оболочку должно быть встроено достаточно функциональности, чтобы убить некоторые из оскорбительных процессов. Вам нужно будет использовать встроенные оболочки для итерации через /proc
.
Например, если бы я хотел убить все свои оболочки bash
, я мог бы сделать что-то вроде этого, в котором используются только встроенные оболочки Bash:
pushd /proc && for pid in *; do
test "$pid" = "self" && continue # skip /proc/self
test -d "$pid" || continue # skip if not a directory
test -O "$pid" || continue # skip if we don't own it
read cmd < "${pid}/cmdline"
case "$cmd" in
*bash*) kill -9 $pid ;; # or whatever you want to do to it
esac
done && popd
Это страдает от нескольких ограничений, поэтому это не надежно, но это должно быть полезно в большинстве случаев.
Если лот обработки запущен, расширение *
в верхней части цикла может привести к строке, превышающей максимальную длину команды . Если вы столкнетесь с этим, вы можете сократить расширение подстановочного знака с несколькими запусками, используя 1*
, 2*
, {1..3}*
или что-то в этом роде.
/proc/${pid}/cmdline
содержит список с разделителями NULL, из которых фактическая команда является лишь одним элементом. Я не знаю способа чистого разбора такой строки, используя только сборки Bash. Поскольку строки обычно завершаются значением NULL, read
получит только первый элемент, который может быть или не быть именем команды. Альтернативным подходом было бы итерация по /proc/${pid}/stat
или /proc/${pid}/status
.