Выходной скрипт вызывал из меню, не выходя из меню

Можно использовать команду вставки, чтобы добавить правила перед правилами блокировки. Однако только 1 или, возможно, 2 сервера должны отправлять электронную почту в Интернет. При необходимости добавьте правила брандмауэра на свои хосты, чтобы разрешить отправку электронной почты только их почтовому серверу. Это должно отключить ботов или, по крайней мере, дать возможность регистрировать и отслеживать проблему.

Я бы порекомендовал вам настроить один сервер исходящей почты и заблокировать все остальные серверы, отправляющие электронную почту в Интернет. Используйте этот почтовый сервер в качестве исходящего MTA (агента пересылки почты) для всех хостов в вашей сети. Настройте его должным образом с помощью rDNS, SPF и т. Д. Домены, которые не отправляют электронную почту, должны иметь записи SPF, содержащие политику «-все». См. Мои заметки о Защита репутации электронной почты с помощью SPF.

Настройте свой почтовый сервер, чтобы ограничить количество доменов, от имени которых вы будете отправлять сообщения. Я считаю, что для этого хорошо работают возможности ACL Exim. Вы также можете установить правила ограничения, чтобы предотвратить большие объемы исходящей электронной почты.

4
21.12.2018, 12:07
3 ответа

Вы можете запустить команду в подоболочке и 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
  • Выбор (1 )позволит вам использовать Ctrl + c , не закрывая меню.
  • Выбор (2 )и нажатие Ctrl + c также закрывает меню.
7
27.01.2020, 20:48

Графическая среда рабочего стола

Вы можете запустить команду в другом окне терминала (, если у вас есть графическая среда рабочего стола ).

В следующем сценарии оболочки используется 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 .

4
27.01.2020, 20:48

Чтобы добавить к превосходному ответу @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
0
26.08.2021, 19:32

Теги

Похожие вопросы