Como ver os comandos executados em outro shell?


9

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

Situação: estou conectado remotamente a uma máquina Linux, e também um colega de trabalho. Eu gostaria de ver os comandos que ela está executando em seu shell. Eu sei que eu poderia usar alguma combinação de watche psver quaisquer comandos que demoram mais de um segundo para serem executados, mas não acredito que ajudaria com comandos muito curtos.


5
comandos internos como kill, e cdnão geram subprocessos e nunca apareceriam na saída ps.
Jordanm #

@ Jordanm Obrigado, esse é um bom ponto. Mesmo com apenas os comandos que causam um fork / exec, isso provavelmente seria bom o suficiente.
22630 Tom Tom Panning

Respostas:


7

Desde que você é root, você poderia sempre strace -f -e execve -p her_bash_pid. O -fé necessário porque sua concha vai desembolsar um novo processo antes do exec, mas isso também significa que você vai ver qualquer coisa que os processos filhos executar bem.


Obrigado, grepping a saída de strace para exec torna bastante legível. Tenho certeza de que o fato de continuar seguindo filhos de crianças vai me confundir um dia, mas por enquanto acho que estarei seguro. É uma pena que não haja como desanexar automaticamente de um processo depois que ele chama exec.
Tom Panning #

É de código aberto; você sempre pode adicionar esse recurso se realmente precisar dele. :) Ou adicione um script um pouco mais inteligente que analise a saída strace que ignora um PID, uma vez que ele execé.
Jim Paris

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 necessária para que o .bash_history seja gravado após cada comando, em vez da saída do shell:

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

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


5

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

  • leia sua bash_history. Mas geralmente é escrito apenas no logout. O askubuntu.com tem um post sobre como mudar esse comportamento ( edit : @jordanm aparentemente teve a mesma idéia e foi mais rápido para postar ...).
  • Se ela estivesse em um terminal físico (/ dev / ttyX), você poderia usar o programa conspy.
  • Faça-a usar screen. Se você quiser apenas ajudá-lo e não espioná-la, ela poderá executar sua sessão na tela. Você pode simplesmente anexar à sua sessãosudo -u herUsername screen -x
  • Você pode escrever um script de invólucro de shell que registra os comandos em um arquivo de log de sua escolha. Você teria que definir o shell dela para esse script (isso é apenas uma ideia, pode ou não funcionar).
  • Usar cat /dev/pts/X | tee /dev/pts/Xfoi 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 também é o motivo da chamada tee). Ao experimentar, eu podia espionar cada segundo personagem. Com um pouco de imaginação, você poderia adivinhar o que ela está fazendo ...

errado: conspy não funciona com ttys
Zibri

3

A tela GNU é o melhor elogio da IMO até agora. Se a tela GNU (ou tmux) não estiver disponível, faça com que seu colega de trabalho execute script -f.

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


0

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

  1. Você e o colega efetuam login como o mesmo usuário Unix no ssh
  2. Você digita o comando

    screen -d -m -S myscreenname

    screen -x myscreenname

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

  3. O colega de trabalho digita o comando

    screen -x myscreenname

  4. Para terminar de compartilhar 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 a colega de trabalho pode ver a saída na tela dela. É uma excelente maneira de administrar pares e orientar administradores juniores do Unix.


0

Para completar a resposta do @ jordanm ... 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 chamados em um terminal esteja instantaneamente disponível em outro

Se você invocar historyno seu terminal, verá os comandos anteriores. Por padrão, o bash grava seu histórico no final de cada sessão em um ~/.bash_history file, substituindo o arquivo existente por uma versão atualizada. Isso significa que, se você estiver conectado com várias sessões do bash, apenas a última a sair terá seu histórico salvo.

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

Edite seu ~/.bashrce adicione a ele

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

Onde

history -aanexa ao ~/.bash_historyarquivo imediatamente em vez de no final da sessão

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

history -rlê o ~/.bash_historyarquivo ao qual anexamos, de volta ao nosso histórico de sessões

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

Você também pode adicionar um carimbo de data / hora ao lado de cada comando por conveniência ao visualizar o histórico. Novamente, edite seu ~/.bashrce adicione

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

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

Mais informações

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.