awk -F'|' '$1 > 20 { system("/path/to/another/script.sh "$2 }' < file.text
Это говорит awk разделить ввод на поля на основе символа вертикальной черты. Любое первое поле, значение которого больше 20, инициирует системный вызов... чего угодно. Имейте в виду, что аргумент (здесь $2, но это может быть $0 или любое другое вычисление, которое вы делаете в awk ), передается сценарию через вызов оболочки, поэтому, если эти значения могут содержать специальные символы оболочки -, внимательно цитируйте. Я сошлюсь на один из ответов Стефана для примера того, как это сделать:
awk 'function escape(s) { gsub(/'\''/,"&\\\\&&",s) return "'\''" s "'\''" } { system("/path/to/another/script.sh" escape($2)) }'
Вы также можете использовать ipset. Это немного сложнее, но тайм-аут будет полностью обрабатываться ядром. Одним из преимуществ является то, что вы можете продлить тайм-аут, не беспокоясь об отмене каких-либо команд в очереди.
Создайте набор и добавьте соответствующие правила iptables:
ipset create son_allowed hash:net timeout 3600
iptables -A OUTPUT -m owner --uid-owner son -m set --match-set son_allowed dst -j ACCEPT
iptables -A OUTPUT -m owner --uid-owner son -j REJECT
Сценарий разблокировки теперь должен только добавить все IP-адреса в набор:
ipset add son_allowed 0.0.0.0/1 -exist
ipset add son_allowed 128.0.0.0/1 -exist
(Примечание :К сожалению, 0.0.0.0/0
нельзя добавить к набору типа хэш :net, поэтому необходимы две записи. Вы также можете настроить время ожидания здесь, добавив опцию timeout SECONDS
.)
Если вы используете IPv6, создайте еще один ipset с флагом family inet6
, добавьте для него правило iptables и в сценарии разблокировки добавьте ::/1
и 8000::/1
в набор.
Вы можете использоватьat
:
sudo at next hour -f myiptablesscript
где myiptablescript
была команда для отключения доступа, или в одной строке как что-то вроде
sudo at next hour -f /dev/stdin <<< "iptables -A OUTPUT -m owner --uid-owner son -j REJECT"
Вы можете объединить разблокировку и блокировку в двухстрочный -скрипт:
#!/bin/bash
iptables -D OUTPUT -m owner --uid-owner son -j REJECT
at next hour -f /dev/stdin <<< "iptables -A OUTPUT -m owner --uid-owner son -j REJECT"
Если вы сохраните этот скрипт как unblockinternet
с разрешением на выполнение, вы вызовете его как
sudo./unblockinternet
что немедленно удалит блокирующее правило; и поставить в очередь его восстановление, чтобы оно произошло через час.
Если у вас есть systemd, вы можете написать небольшой файл модуля, скажем, /etc/systemd/system/unblockinternet.service
, содержащий
[Unit]
Description=unblock internet 1 hour
[Service]
Type=simple
ExecStartPre=/usr/sbin/iptables...
ExecStart=/usr/bin/sleep 3600
ExecStop=/usr/bin/iptables...
Чтобы запустить его, введите systemctl restart unblockinternet
, и он попросит вас пройти аутентификацию как root.