O que eu quero alcançar é poder gravar minhas sessões de terminal em arquivos automaticamente sempre que eu usar o Yakuake / Konsole.
É fácil conseguir isso no início da minha sessão:
script -f /home/$USER/bin/shell_logs/$(date +"%d-%b-%y_%H-%M-%S")_shell.log
Mas quero executar o procedimento acima automaticamente sempre que iniciar o Yakuake ou abrir uma nova guia.
O uso do .bashrc não funciona porque cria um loop sem fim, já que o 'script' abre uma nova sessão, que lê .bashrc e inicia outro 'script' e assim por diante.
Então, presumivelmente, preciso criar um script para o Yakuake / Konsole de alguma forma para executar o 'script' uma vez que uma nova guia for aberta. A questão é como?
exec
no início da linha. deve iniciarscript -f
o mesmo PID do shell.Respostas:
Se alguém quiser gravar suas sessões de terminal automaticamente - incluindo sessões SSH (!) - usando o
script
utilitário, aqui está como.Adicione a seguinte linha no final do
.bashrc
diretório inicial ou caso contrário,/etc/bash.bashrc
você deseja gravar apenas as sessões de todos os usuários. Testamos se o processo pai do shell não está sendoscript
executado e, em seguida, executamosscript
.Para Linux:
Para BSD e macOS, altere
script -f
parascript -F
:Isso é tudo!
Agora, quando você abre um novo terminal, verá:
script
gravará suas sessões em um arquivo no diretório inicial, nomeando-as como30-Nov-11_00-11-12_shell.log
resultado.Mais personalização:
script -a /path/to/single_log_file
script -f
(Linux) ouscript -F
(BSD e macOS)Esta resposta assume que você
script
instalou, é claro. Nas distribuições baseadas no Debian,script
faz parte dobsdutils
pacote.fonte
edit
botão que aparece logo abaixo.${RANDOM}
e / ou$$
ao nome do arquivo, pois iniciar dois shells dentro de um segundo um do outro causará uma colisão de nome de arquivo. Pessoalmente, costumo usarscript.$(date -u +%Y%m%dt%H%M%S).${HOSTNAME:-$(hostname)}.$$.${RANDOM}.log
para garantir que os arquivos sejam classificados automaticamente por data / hora e que sejam consistentes em toda a TZ, conheço o host que o iniciou, conheço o processo de propriedade e não há colisões de nomes. Eu raramente uso${USER}
porque normalmente é algo apenas para mim.Embora essa pergunta tenha sido feita por um indivíduo que deseja gravar suas próprias sessões, um caso de uso alternativo pode ser um administrador de sistema que deseja acompanhar o que vários usuários estão fazendo.
Uma abordagem alternativa
Este guia de 2008 ( arquivado ) usa um método diferente para forçar
script
a execução quando um usuário efetua login com ssh, o que exige que os usuários efetuem login com uma chave pública / privada.Isso é feito adicionando um script ao
.ssh/authorized_keys
arquivo do usuário , na frente da chave:O script
log-session
( arquivado ) decide se deve ou não ser executado/usr/bin/script
para registrar a sessão deste usuário.Para impedir que o usuário remova o comando adicionado, o administrador precisará assumir a propriedade do
authorized_keys
arquivo do usuário .Infelizmente, isso significa que o usuário não poderá adicionar nenhuma chave adicional ou, mais importante, revogar a chave existente se ela estiver comprometida, o que está longe do ideal.
Ressalvas
É comum que a configuração padrão do sshd permita que os usuários executem o SFTP em seu login ssh. Isso oferece aos usuários uma maneira de editar arquivos sem que as alterações sejam registradas. Se o administrador não desejar que os usuários possam fazer isso, ele deverá ativar algum log para SFTP ou desativar o serviço. Embora, mesmo assim, os usuários ainda possam fazer alterações invisíveis nos arquivos executando algo parecido com isto em seus terminais:
Pode ser possível monitorar alterações como essa usando um sistema de arquivos copiar na gravação que registra todo o histórico de arquivos.
Mas um truque semelhante permitiria ao usuário executar comandos sem que eles fossem registrados:
Não conheço nenhuma solução fácil para isso. As possibilidades podem ser:
Esse tipo de coisa pode ser possível com o auditd .
Mas mesmo assim...
fonte
Ao invés de:
Eu usaria:
As aspas duplas não são necessárias neste caso, mas costumo usá-las de qualquer maneira como uma prática padrão. Definitivamente, recomendo usar a opção "x" para grep e pgrep, para evitar uma correspondência rara, mas problemática, de substrings.
fonte