Как определить, что сценарий bash запускается на «консоли», а не в сеансе удаленного терминала?

Если я правильно понял ваши требования, это похоже на работу, с которой sedможет справиться хорошо благодаря своей способности разграничивать «подпотоки -» в своем входном потоке.

Это должно быть POSIX:

sed -n "/^define service/,/^}/{/^[[:blank:]]\\{1,\}host_name[[:blank:]]\\{1,\\}${V_MAQUINA}/,/^}/{\\%^[[:blank:]]\\{1,\\}check_command[[:blank:]]\\{1,\\}${V_NAGIOS_COMMAND}%{p;q}}}" file

или, если вы можете использовать GNU sed, для меньшего экранирования в строке:

sed -En "/^define service/,/^\\}/{/^[[:blank:]]+host_name[[:blank:]]+${V_MAQUINA}/,/^\\}/{\\%^[[:blank:]]+check_command[[:blank:]]+${V_NAGIOS_COMMAND}%{p;q}}}" file

Объяснение:

sed -En  # use Extended Regular Expressions, and don't print by default

# main `sed` script for entire stream
/^define service/,/^\\}/  # between 'define service' and '}'
{  # sub-stream: between specified 'host_name' and '}'
/^[[:blank:]]+host_name[[:blank:]]+${V_MAQUINA}/,/^\\}/
{  # look for specified 'check_command', using '%' because '/' can be in command
\\%^[[:blank:]]+check_command[[:blank:]]+${V_NAGIOS_COMMAND}%
{p;q}  # if found, print line and quit `sed`
}
}

Это печатает строку check_command, если она найдена в «фрагменте» file, разделенном регулярными выражениями, или вообще ничего, если не найдена.

Таким образом, вы можете просто проверить наличие или отсутствие возвращаемой строки.

Не проверяйте статус выхода, потому что sedвозвращает 0 даже тогда, когда ничего не печатается.

Несколько дополнительных замечаний:

  • нам нужно \\для выражения одного \, потому что мы находимся внутри двойных -кавычек оболочки
  • мы используем двойные -кавычки, чтобы иметь возможность использовать переменные вашей оболочки $V_MAQUINAи$V_NAGIOS_COMMAND
  • Я выбрал %в качестве разделителя регулярного выражения в последнем регулярном выражении, но вы можете выбрать любой символ, который не будет присутствовать в вашей $V_NAGIOS_COMMANDпеременной
0
25.05.2021, 03:42
3 ответа

Изучите вместе с diffрезультаты env | sortв двух средах. $DISPLAYнужно проверить.

Также читайте man isatty.

-1
28.07.2021, 11:29

Если вы запускаете ps axu, найдите в столбце TTY корневую «консоль», которую использует процесс.

У каждого процесса есть родитель, работающий до корневого процесса инициализации

0
28.07.2021, 11:29

Это похоже на возможную проблему XY.

Старая команда Unix ttyможет сообщить вам, на каком устройстве работает ваш терминал. Так что что-то вроде этого может сделать то, что вы просите:

if [ $(tty) = "/dev/console" ]; then
    echo "Yes, I am on the console."
else
    echo "No, I am not on the console."
fi

Однако программа, запущенная в сеансе входа в виртуальную консоль Linux, вместо этого может увидеть /dev/tty1или подобное. Если используется последовательная консоль, вы можете увидеть /dev/ttyS0или другое устройство последовательного порта. Единственный раз, когда вы можете увидеть литерал /dev/console, может быть при работе в режиме аварийной оболочки/однопользовательском режиме -. Знать, какие устройства (и )могут быть допустимыми консолями, непросто; это одна из причин, почему /etc/securettyсуществует и настраивается системным администратором.

(Если вы решили отказаться от последовательных портов, системный администратор, пытающийся где-то использовать последовательное -соединение по -локальной сети для исправления очень удаленной системы, может вас ненавидеть.)

Если процесс или сценарий запускается как служба systemd, он может вообще не иметь TTY в традиционном смысле; вместо этого его стандартный вывод и стандартная ошибка будут подключены к средству журналирования systemd, которое может передавать или не передавать их на консоль во время загрузки в зависимости от того, как настроена служба.

Пожалуйста, отредактируйте свой вопрос, чтобы указать почему вы хотите знать, используете ли вы «консоль» или нет, чтобы мы могли попытаться найти способ получить ответ на ваш вопрос в некотором смысле это соответствует вашим реальным потребностям.

6
28.07.2021, 11:29

Теги

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