Я наконец нашел решение, которое искал. Iptables
имеет модуль rateest
, который делает именно это. Например:
# collects all ingress traffic to RATEEST target
iptables -A INPUT -j RATEEST --rateest-name RE1 --rateest-interval 500.0ms --rateest-ewmalog 1s
# creates a log entry(jumps to LOG target) if rate is greater than 10Mbps
iptables -A INPUT -m rateest --rateest RE1 --rateest-gt --rateest-bps 10Mbps -j LOG --log-prefix "Ingress bandwidth >10Mbps "
-121--86053- Вот ответы:
root
всегда имеет полный доступ к файлам и каталогам. Они обычно тоже есть у владельца файла, но это не всегда так. Например:
-r-xr- --- 1 пользователь 1 пользователи 199 Окт 14 18:42 otherfile.bin
user1
является владельцем ; однако они могут только читать и выполнять , но root
по-прежнему имеет полный доступ ( rwx ) к файлу.
RUID является реальным идентификатором пользователя и никогда (почти) не изменяется. Если user2
входит в систему, оболочка запускается с реальным идентификатором user2
. Все процессы, которые они начинают с оболочки, наследуют действительный идентификатор user2
в качестве их действительного идентификатора.
EUID - это эффективный идентификатор пользователя , который изменяется для процессов (не для пользователя), выполняемых пользователем, для которых установлен бит setuid .
Если user2
выполняет file.bin
, RUID будет user2
, а EUID запущенного процесса будет user1
.
Давайте воспользуемся случаем passwd
:
-rwsr-xr-x 1 root root 45396 may 25 2012 /usr/bin/passwd
Когда user2
хочет изменить свой пароль , они выполняют /usr/bin/passwd
.
RUID будет user2
, но EUID этого процесса будет root
.
user2
может использовать passwd
для изменения только собственного пароля, поскольку внутренний passwd
проверяет RUID и, если он не является root
, его действия будут ограничены реальным паролем пользователя.
Необходимо, чтобы EUID стал корневым
в случае passwd
, потому что процессу необходимо записать в /etc/passwd
и/или /etc/shadow
.
Вы можете попробовать вещи с помощью сценария, такого как
#!/bin/sh
for fd in 0 1 2; do
if [ -t $fd ]; then echo $fd is a TTY; fi
done
Запуск этого я вижу, что:
stdin
и stderr
являются TTE stderr
является TTY stdout
и stderr
являются TTY . Все это кажется логичным. Очевидно, что если конвейер перенаправляет stderr
, то поведение будет другим.
Чтобы полностью ответить на ваш вопрос, я не думаю, что можно определить характеристики терминала во всех случаях, но если вы можете найти FD (изучить все записи в /dev/fd
), который является TTY, вы можете запустить stty
на этом...Но с середины трубопровода невозможно определить, куда идет конец трубопровода.
Как упомянуто Янис , если вы хотите узнать информацию о управляющем терминале, независимо от конвейера, вы можете использовать /dev/tty
, например с stty -F/dev/tty
; но это приведет к сбою, если сценарий выполняется без управляющего терминала, например из задания cron
.