Перехват сигнала DEBUG для оболочки панели приборов?

Перехват сигнала DEBUG для оболочки панели приборов?

С помощью оболочки bash вы можете установить ловушку на синтетический DEBUGсигнал. Это полезно и будет выполнять вашу функцию или часть кода при каждой команде оболочки. Например:

$ trap 'logger -t shell "${BASH_COMMAND}"' DEBUG

Идея здесь заключается в том, чтобы установить ловушку в файле, например, /etc/profile.d/bash-loggerи иметь любые команды сеанса оболочки пользователя, автоматически регистрируемые в syslog, когда бы они ни происходили. Это также полезно длялегко отслеживать удаленные команды.

Глядя на исходный код оболочки Dash, я, кажется, понимаю, что такого DEBUGсигнала нет.

Существуют ли какие-либо обходные пути или альтернативы для достижения того же результата с помощью оболочки Dash?

решение1

Наиболее основательным подходом будет перекомпиляция оболочки с включенной поддержкой syslog. Это также позволяет обойти оболочки, которые (по какой-либо причине) не загружают ~/.что бы ни-profile или ~/.что бы ни-rc.

Это включено как опция в стандартный исходный код Bash, но для других оболочек вам может потребоваться найти или написать патч.

Я бы не советовал читать и evalписать построчно, потому что команды могут занимать несколько строк, и evalполовина команды либо не сработает, либо сделает что-то неправильно. Затронутые типы команд включают: конвейеры и условные команды (где каждая строка заканчивается на &&, ||или |), составные команды (включая группы в скобках), строки, продолженные обратными косыми чертами, многострочные строки в кавычках и <<here-docs. (Возможно, их больше, чем я не придумал.)

В ограниченных случаях вы можете найти set -vили set -xполезным, в сочетании с перенаправлением stderr в канал для logger. Однако это несовершенно, так как также перенаправляет stderr из программ, которые вы запускаете. (В Bash вы можете выбрать другой файловый дескриптор для set -xзаписи, что решает эту проблему.)

Я хотел бы отметить, что если вы это сделаете ssh host some_command , то не будет задействована интерактивная или входная оболочка, поэтому ваши rc-файлы не будут загружены, что позволит обойти ваше логирование.

Связанный контент