Com o shell bash, você pode instalar uma armadilha no DEBUG
sinal sintético. Isso é útil e executará sua função ou trecho de código em cada comando do shell. Por exemplo:
$ trap 'logger -t shell "${BASH_COMMAND}"' DEBUG
A ideia aqui é instalar o trap em um arquivo inserido, por exemplo, /etc/profile.d/bash-logger
e fazer com que todos os comandos de sessão do shell do usuário sejam registrados automaticamente no syslog sempre que ocorrerem. Isto também é útil pararastrear facilmente comandos remotos.
Olhando para o código-fonte do shell do painel, parece que entendo que não existe tal DEBUG
sinal disponível.
Existem soluções alternativas ou alternativas para obter o mesmo resultado com o shell do painel?
Responder1
A abordagem mais completa seria recompilar o shell com suporte a syslog habilitado. Isso também contorna shells que (por qualquer motivo) não carregam ~/.qualquer que seja-perfil ou ~/.qualquer que seja-rc.
Isso está incluído como uma opção na fonte padrão do Bash, mas para outros shells você pode precisar encontrar ou escrever um patch.
Eu hesitaria em recomendar a leitura eval
linha por linha, porque os comandos podem abranger várias linhas e eval
metade de um comando falhará ou fará a coisa errada. Os tipos de comandos afetados incluem: pipelines e comandos condicionais (onde cada linha termina com &&
, ||
ou |
), comandos compostos (incluindo grupos entre colchetes), linhas continuadas com barras invertidas, strings entre aspas de várias linhas e <<
documentos aqui. (Provavelmente há mais do que eu não pensei.)
Para casos limitados, você pode achar set -v
útil set -x
, combinado com o redirecionamento do stderr para um canal para o logger. No entanto, é imperfeito, pois também redireciona o stderr dos programas que você executa. (No Bash você pode escolher um descritor de arquivo diferente para set -x
escrever, o que resolve esse problema.)
Eu gostaria de salientar que, se você for,
ssh host some_command
não haverá nenhum shell interativo ou de login envolvido, portanto, seus arquivos rc não serão carregados, o que ignoraria seu registro.