Можно использовать команду вставки, чтобы добавить правила перед правилами блокировки. Однако только 1 или, возможно, 2 сервера должны отправлять электронную почту в Интернет. При необходимости добавьте правила брандмауэра на свои хосты, чтобы разрешить отправку электронной почты только их почтовому серверу. Это должно отключить ботов или, по крайней мере, дать возможность регистрировать и отслеживать проблему.
Я бы порекомендовал вам настроить один сервер исходящей почты и заблокировать все остальные серверы, отправляющие электронную почту в Интернет. Используйте этот почтовый сервер в качестве исходящего MTA (агента пересылки почты) для всех хостов в вашей сети. Настройте его должным образом с помощью rDNS, SPF и т. Д. Домены, которые не отправляют электронную почту, должны иметь записи SPF, содержащие политику «-все». См. Мои заметки о Защита репутации электронной почты с помощью SPF.
Настройте свой почтовый сервер, чтобы ограничить количество доменов, от имени которых вы будете отправлять сообщения. Я считаю, что для этого хорошо работают возможности ACL Exim. Вы также можете установить правила ограничения, чтобы предотвратить большие объемы исходящей электронной почты.
Вы можете запустить команду в подоболочке и trap
на SIGINT
, запустив kill 0
, чтобы убить только группу процессов подоболочки.
select opt in a b; do
case $REPLY in
1)
(
trap "kill -SIGINT 0" SIGINT
sleep 10
)
;;
2)
sleep 10
;;
esac
done
Вы можете запустить команду в другом окне терминала (, если у вас есть графическая среда рабочего стола ).
В следующем сценарии оболочки используется xterm
,который можно установить с помощью
sudo apt update
sudo apt install xterm
, но вы можете использовать и другие эмуляторы окна терминала, например gnome-terminal
или lxterminal
.
Шеллскрипт:
#!/bin/bash
select opt in "dbus-monitor --system" htop exit; do
case $REPLY in
1)
xterm -e dbus-monitor --system 2>/dev/null
;;
2)
htop
;;
3)
exit
;;
esac
done
Вы можете использовать метод ловушки в ответе @RoVo.
Важно запустить команду trap
до запуска команды, которую вы должны прервать с помощью ctrl + c .
Поэтому, если вы хотите, чтобы это было во всем сценарии меню, поместите его в начало.
Если вам это нужно только тогда, когда это абсолютно необходимо, запустите подоболочку и поместите команду trap
внутри подоболочки, как показано @RoVo, или с
bash -c 'trap "kill -SIGINT 0" SIGINT; dbus-monitor --system';;
Шеллскрипт:
#!/bin/bash
echo "Press the Enter key to print out the menu again"
trap "kill -SIGINT 0" SIGINT
select opt in "dbus-monitor --system" "option 2" "Quit"
do
case $opt in
"dbus-monitor --system")
dbus-monitor --system;;
"option 2")
echo "Hello World";;
"Quit")
exit;;
esac
done
Комментарий
Ваша командная строка curl
у меня не сработала, поэтому я вызываю свой локальный dbus-monitor
, чтобы проверить, работает ли шелл-скрипт при использовании ctrl + c .
Чтобы добавить к превосходному ответу @pLumo , вы можете определить подобную функцию, чтобы сократить количество кода, необходимого в каждомcase
:
run_in_subshell () {
command="$@"
(
trap "kill -INT 0" INT
$command
)
}
Затем вcase
:
select opt in a b; do
case $REPLY in
1) run_in_subshell sleep 10 ;;
2) sleep 10 ;;
esac
done