reconstruindo a sessão shell a partir de um datilografado

3

Existe um monte de ferramentas como 'script', 'screen', 'ttyrec' que permitem o registro de conteúdo das sessões de shell. Por design, essa ferramenta registra tudo exibido em pty, incluindo caracteres de controle. No entanto, parece não haver solução para remover os caracteres de controle e exibir a transcrição da sessão gravada que foi vista pelo usuário. Mesmo programas de repetição parecem não funcionar corretamente com comandos de várias linhas.

Eu gastei algum tempo tentando fazer um parser adequado para os typescript, e cheguei à conclusão de que é de fato impossível no caso geral. O problema é emuladores de terminal modernos (terminator, xterm, rxvt) recurso de quebra de linha automática e shells (bash, zsh) fazer uso dele. As coisas funcionam bem para o processo de shell interativo porque ele é capaz de se manter em sincronia com a largura do terminal e ajustar as posições do cursor conforme necessário. Infelizmente, o 'script' (nem outras ferramentas, até onde eu posso ver) não rastreia os eventos de mudança de tamanho do pty, e essa informação simplesmente se perde. Como resultado, uma ferramenta que renderiza o texto datilografado não tem informações suficientes e não pode reconstruir a aparência de comandos com várias linhas.

Eu perdi alguma coisa? Existe uma solução?

Eu vejo as seguintes possíveis soluções, mas nenhuma delas é fácil nem completa:

  • Use o shell sem um editor de linha de comando sofisticado (como o shell bourne)
  • Sempre execute com 'set -x' ativado (gera muita confusão com o preenchimento automático de comandos no bash)
  • Ferramenta 'script' (e 'tela') do patch para gravar alterações de tamanho pty (no Linux ele pode alimentar informações de tempo para stderr já, seria lógico adicionar eventos de mudança de tamanho pty lá)
  • Invente algum algoritmo astuto para analisar o texto datilografado bagunçado. Por exemplo, o shell envia o CR quando ele precisa ir para outra linha durante a edição do comando de várias linhas. Ele envia CR + NL quando o usuário envia o comando. Infelizmente o bash também envia CR ao manusear alguns comandos Ctrl-U do usuário.
  • Obtenha o texto do comando (que está sendo confuso no texto datilografado) de outra fonte, por exemplo, do histórico do shell. Mas isso exigiria a personalização dos scripts de perfil do shell, etc.
por abb 21.07.2011 / 17:37

1 resposta

0

No caso geral, você precisa reproduzir em um terminal do mesmo tamanho.

  • Você pode decidir ignorá-lo completamente. Como mencionado por sendmoreinfo, você pode declarar um TERMO que não suporta nenhum desses recursos. Não espere que vim ou readline se comporte de maneira agradável com a qual você se acostumou.

  • Você pode armazená-lo junto com sua transcrição e recriar o tamanho correto ao reproduzir novamente ( por exemplo, xterm -geometry [...] -e [...] ), mas o redimensionamento quebrará tudo.

  • Se você se importa muito com isso e quer a solução perfeita , você mesmo pode implementá-la!

    • Você pode ter seu ttyrec registrando o tamanho do terminal e suas alterações manipulando o sinal SIGWINCH e usando ioctl(STDIN_FILENO, TIOCGWINSZ, [...]) .

    • Seu ttyplay teria que se encarregar de emular um terminal e representá-lo em um terminal. Isso é complicado, mas felizmente existem alguns projetos que já estão fazendo isso, então você pode reutilizar uma base de código bem estabelecida. tmux vem à mente, por exemplo.

por 04.07.2012 / 05:38