Como gravar automaticamente todas as suas sessões de terminal com o utilitário de script

28

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?

Stan
fonte
experimente a solução problemática com o problema do loop, mas inclua o prefixo execno início da linha. deve iniciar script -fo mesmo PID do shell.
27711 Hanan N.
Versão etended também interessante deste quesion é How-To força como root os usuários não-roda para script de todas as sessões, bem ...
Yordan Georgiev

Respostas:

26

Se alguém quiser gravar suas sessões de terminal automaticamente - incluindo sessões SSH (!) - usando o scriptutilitário, aqui está como.

Adicione a seguinte linha no final do .bashrcdiretório inicial ou caso contrário, /etc/bash.bashrcvocê deseja gravar apenas as sessões de todos os usuários. Testamos se o processo pai do shell não está sendo scriptexecutado e, em seguida, executamos script.

Para Linux:

test "$(ps -ocommand= -p $PPID | awk '{print $1}')" == 'script' || (script -f $HOME/$(date +"%d-%b-%y_%H-%M-%S")_shell.log)

Para BSD e macOS, altere script -fpara script -F:

test "$(ps -ocommand= -p $PPID | awk '{print $1}')" == 'script' || (script -F $HOME/$(date +"%d-%b-%y_%H-%M-%S")_shell.log)

Isso é tudo!

Agora, quando você abre um novo terminal, verá:

Script started, file is /home/username/file_name.log

scriptgravará suas sessões em um arquivo no diretório inicial, nomeando-as como 30-Nov-11_00-11-12_shell.logresultado.

Mais personalização:

  • Você pode anexar suas sessões a um arquivo grande em vez de criar um novo para cada sessão com script -a /path/to/single_log_file
  • Você pode ajustar para onde os arquivos são gravados, alterando o caminho após script -f(Linux) ou script -F(BSD e macOS)

Esta resposta assume que você scriptinstalou, é claro. Nas distribuições baseadas no Debian, scriptfaz parte do bsdutilspacote.

Stan
fonte
Você pode editar sua pergunta e seu título. Basta clicar no editbotão que aparece logo abaixo.
Mat
8
Você pode considerar adicionar um ${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 usar script.$(date -u +%Y%m%dt%H%M%S).${HOSTNAME:-$(hostname)}.$$.${RANDOM}.logpara 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.
Nicerobot
"certifique-se de criar / var / log / script e torná-lo gravável por outros" que você escreveu. Eu queria saber se é aconselhável, do ponto de vista da segurança, usar "sudo chmod 777 / var / log / script" neste caso.
Teo
10

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.

Receio que rodar scriptdentro do sistema bashrcpossa não ser adequado quando os usuários da máquina relutam em fazer gravações de suas sessões.

Os usuários que desejam permanecer no modo anônimo podem ignorar o registro solicitando ao sshd que abra um shell diferente (por exemplo zsh) ou execute bash --rcfile ___para impedir o /etc/bash.bashrccarregamento.

Uma abordagem alternativa

Este guia de 2008 ( arquivado ) usa um método diferente para forçar scripta 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_keysarquivo do usuário , na frente da chave:

command="/usr/local/sbin/log-session" ssh-dss AAAAB3NzaC1kc3MAAAEBAMKr1HxJz.....

O script log-session( arquivado ) decide se deve ou não ser executado /usr/bin/scriptpara registrar a sessão deste usuário.

exec script -a -f -q -c "$SSH_ORIGINAL_COMMAND" $LOGFILE

Para impedir que o usuário remova o comando adicionado, o administrador precisará assumir a propriedade do authorized_keysarquivo do usuário .

chown root:root ~user/.ssh/authorized_keys

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:

curl "http://users.own.server/server/new_data" > existing_file

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:

curl "http://users.own.server/server/secret_commands_824" | sh

Não conheço nenhuma solução fácil para isso. As possibilidades podem ser:

  • Registrando todos os dados da rede (e desembaraçando-os posteriormente).
  • Registrando todas as chamadas do sistema.

Esse tipo de coisa pode ser possível com o auditd .

Mas mesmo assim...

É improvável que o registro de sessões do usuário forneça segurança real aos administradores. Por padrão, um usuário pode manipular apenas seus próprios arquivos e não pode prejudicar o sistema. Se um usuário mal-intencionado conseguir escalar privilégios, ele poderá desativar o log e excluir os logs (a menos que o administrador tenha configurado os logs para serem armazenados em uma máquina separada, apenas de forma anexada).

Os administradores que registram automaticamente as sessões do usuário provavelmente devem informar aos usuários que isso está sendo feito . Em algumas jurisdições, essa forma de coleta de dados pode violar as leis de dados ou privacidade . E, no mínimo, seria respeitoso para os usuários conscientizá-los.

É mais provável que um administrador esteja interessado em registrar as sessões dos sudousuários. Talvez isso possa ser resolvido em uma resposta diferente, ou mesmo em uma pergunta diferente.

joeytwiddle
fonte
2

Ao invés de:

test "$(ps -ocommand= -p $PPID | awk '{print $1}')" == 'script' ||

Eu usaria:

grep -qx "$PPID" <(pgrep -x "script") ||

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.

William Dye
fonte