С помощью оболочки 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-файлы не будут загружены, что позволит обойти ваше логирование.