Como ver os comandos executados em outro shell?

9

Existe uma maneira de observar quais comandos estão sendo executados em outro shell, já que estão sendo executados? Ambas as shells são bash e eu tenho acesso root, se é que isso importa. Não consigo instalar nenhum software extra e não quero que o outro shell tenha que fazer nada de especial como executar a tela.

Situação: Estou logado remotamente em uma máquina Linux e, portanto, é um colega de trabalho. Eu gostaria de ver os comandos que ela está executando em seu shell. Eu sei que eu poderia usar uma combinação de watch e ps para ver quaisquer comandos que demorassem mais de um segundo para serem executados, mas não acredito que isso ajudaria com comandos muito curtos.

    
por Tom Panning 08.11.2012 / 18:45

6 respostas

7

Como você é root, sempre pode usar strace -f -e execve -p her_bash_pid . O -f é necessário porque o shell dela aplicará um novo processo antes do exec , mas isso também significa que você verá qualquer coisa que o filho processe também.

    
por 08.11.2012 / 20:35
5

Se o seu colega de trabalho puder modificar algumas configurações de histórico para o shell bash, você poderá obter essas informações em tail -f /home/user/.bash_history. Aqui está a configuração que você precisará para .bash_history ser escrito após cada comando, ao invés de na saída do shell:

export PROMPT_COMMAND="history -a"
shopt -s histappend

Eu consideraria uma sessão de tela como uma solução "ideal".

    
por 08.11.2012 / 19:06
5

Após uma pesquisa rápida (e algumas reflexões), posso fornecer a seguinte lista de possíveis opções:

  • leia o bash_history dela. Mas geralmente é apenas escrito no logout. askubuntu.com tem um post sobre a mudança esse comportamento ( editar : @jordanm aparentemente teve a mesma ideia e foi mais rápido postar ...).
  • Se ela estivesse em um terminal físico (/ dev / ttyX), você poderia usar o programa conspy .
  • Faça com que ela use screen . Se você quer apenas ajudar e não espioná-la, ela pode estar disposta a executar sua sessão dentro da tela. Você pode simplesmente anexar a sua sessão por sudo -u herUsername screen -x
  • Você poderia escrever um script de invólucro de shell que registra os comandos em um arquivo de log de sua escolha. Você teria que definir seu shell para esse script (isso é apenas uma ideia, pode ou não funcionar).
  • Usar cat /dev/pts/X | tee /dev/pts/X foi a primeira coisa que me veio à mente. Mas depois de tentar realmente não funciona e é uma solução muito suja. Cada caractere é impresso apenas em um dos terminais conectados (que é o motivo para chamar tee também). Ao experimentá-lo, eu poderia espionar cada segundo personagem. Com um pouco de imaginação você pode adivinhar o que ela está fazendo ...
por 08.11.2012 / 19:23
3

A tela do GNU é a melhor recomendação até o momento. Se a tela GNU (ou tmux) não estiver disponível, execute seu colega de trabalho script -f .

E então você pode ver o que ela está fazendo fazendo tail -fn +0 /path/to/typescript .

    
por 08.11.2012 / 23:15
0

Para compartilhar um terminal de tela Unix, para que você possa ver as entradas e saídas de seu colega de trabalho em tempo real, use o comando Unix screen .

  1. Você e o colega de trabalho fazem login como o mesmo usuário do Unix em ssh
  2. Você digita o comando

    screen -d -m -S myscreenname

    screen -x myscreenname

    (É claro que substitua myscreenname pelo que você quiser que o nome da tela seja).

  3. O colega de trabalho digita o comando

    screen -x myscreenname

  4. Para finalizar com o compartilhamento de seus terminais Unix, qualquer pessoa pode digitar o comando

    exit

A grande característica da tela é que você pode digitar comandos do seu terminal Unix e o colega de trabalho pode ver a saída em sua tela. É uma excelente maneira de administrar pares e orientar administradores júniores do Unix.

    
por 20.11.2013 / 16:36
0

Para concluir @ jordanm answer ... se você estiver usando a mesma conta de usuário, ou seja, a saída de

echo $HOSTNAME
echo $USER 

é o mesmo para você e seu colega de trabalho, então podemos nos divertir.

Podemos permitir que a visualização de comandos invocados em um terminal fique instantaneamente disponível em outro

Se você invocar history em seu terminal, verá seus comandos anteriores. Por padrão, o bash escreve seu histórico no final de cada sessão para um ~/.bash_history file , sobrescrevendo o arquivo existente com uma versão atualizada. Isso significa que, se você estiver logado com várias sessões bash, apenas o último a sair terá seu histórico salvo.

-------------------------------------------- -----------

Edite seu ~/.bashrc e adicione a ele

export PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND"

onde

history -a é anexado ao arquivo ~/.bash_history imediatamente, em vez de no final da sessão

history -c limpa o histórico atual da sessão

history -r lê o arquivo ~/.bash_history que nós adicionamos, de volta ao nosso histórico de sessões

Observação: o parâmetro PROMPT_COMMAND contém comandos que são executados antes de cada novo prompt de comando. então command1 só será salvo no histórico quando command2 for executado

Você também pode querer colocar um carimbo de data e hora ao lado de cada comando para facilitar a visualização do histórico. Novamente, edite seu ~/.bashrc e anexe

export HISTTIMEFORMAT="%d/%m/%y %T "

Também é um bom hack se você gosta de usar vários terminais e gostaria de ter seu histórico de comandos disponíveis :)

Mais informações

    
por 26.09.2018 / 18:02