Pesquisa de site

Como gravar e reproduzir sessões de terminal Linux usando comandos ‘script’ e ‘scriptreplay’


Neste guia, veremos como usar comandos script e scriptreplay no Linux que podem ajudá-lo a gravar comandos e sua saída impressa em seu terminal durante um determinado sessão.

O comando histórico é um ótimo utilitário de linha de comando que ajuda os usuários a armazenar comandos anteriores usados, embora não armazene a saída de um comando.

Não perca: Showterm.io – uma ferramenta de gravação de terminal Linux

Não perca: 8 melhores gravadores de tela de desktop para Linux

Portanto, o comando script é útil para fornecer uma funcionalidade poderosa que ajuda você a registrar tudo o que é impresso em seu terminal em um arquivo de log. Você pode então consultar esse arquivo mais tarde caso queira visualizar a saída de um comando no histórico do log_file.

Você também pode reproduzir comandos gravados usando o comando scriptreplay usando informações de tempo.

Como gravar o terminal Linux usando o comando script

O comando script armazena atividades do terminal em um arquivo de log que pode ser nomeado por um usuário. Quando um nome não é fornecido por um usuário, o nome de arquivo padrão, typescript é usado .

Sintaxe básica do comando de script

script [options] - -timing=timing_file log_filename

Para iniciar a gravação do terminal Linux, digite script e adicione o log nome do arquivo conforme mostrado.


tecmint@tecmint ~ $ script history_log.txt

Script started, file is history_log.txt

Para parar o script, digite exit e pressione [Enter].


tecmint@tecmint ~ $ exit

Script done, file is history_log.txt

Se o script não puder gravar no arquivo de log nomeado, ele mostrará um erro.

Por exemplo, na saída abaixo, as permissões do arquivo typescript não permitem a leitura, gravação e execução do arquivo por nenhum usuário ou grupo. Quando você executa o comando de script sem um nome de arquivo de log, ele tenta gravar no arquivo padrão, typescript, mostrando, portanto, um erro.


tecmint@tecmint ~ $ ls -l typescript

--------- 1 ubuntu ubuntu 144 Sep 15 00:00 typescript

tecmint@tecmint ~ $ script

script: open failed: typescript: Permission denied
Terminated

Exemplos de uso do comando de script

Nomeei meu arquivo de log como script.log no exemplo abaixo, você pode dar um nome diferente ao seu arquivo.


tecmint@tecmint ~ $ script script.log

Agora tente executar alguns comandos para permitir que o script registre os comandos executados no terminal.


tecmint@tecmint ~ $ cal

   September 2015     
Su Mo Tu We Th Fr Sa  
       1  2  3  4  5  
 6  7  8  9 10 11 12  
13 14 15 16 17 18 19  
20 21 22 23 24 25 26  
27 28 29 30           
                      
tecmint@tecmint ~ $ w

 14:49:40 up  4:06,  2 users,  load average: 1.37, 1.56, 1.62
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
tecmint  tty8     :0               10:45    4:06m  7:40   0.36s x-session-manager
tecmint  pts/5    :0               13:42    4.00s  0.07s  0.00s script script.log

tecmint@tecmint ~ $ uptime

 14:49:43 up  4:06,  2 users,  load average: 1.37, 1.56, 1.62

tecmint@tecmint ~ $ whoami

tecmint

tecmint@tecmint ~ $ echo 'using script'

using script
tecmint@tecmint ~ $ exit
exit
Script done, file is script.log

Agora tente visualizar o arquivo de log ‘script.log’ para todos os comandos gravados, enquanto você visualiza o log você percebe que o script também armazena feeds de linha e backspaces.


tecmint@tecmint ~ $ vi script.log
Saída de amostra

^[[0m^[[255D^[[01;32mtecmint@tecmint^[[01;34m ~ $^[[00m cal^M
   September 2015     ^M
Su Mo Tu We Th Fr Sa  ^M
       1  2  3  4  5  ^M
 6  7  8  9 10 11 12  ^M
13 14 15 ^[[7m16^[[27m 17 18 19  ^M
20 21 22 23 24 25 26  ^M
27 28 29 30           ^M
                      ^M
^[[01;32mtecmint@tecmint^[[01;34m ~ $^[[00m w^M
 14:49:40 up  4:06,  2 users,  load average: 1.37, 1.56, 1.62^M
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT^M
tecmint  tty8     :0               10:45    4:06m  7:40   0.36s x-session-manager^M
tecmint  pts/5    :0               13:42    4.00s  0.07s  0.00s script script.log^M
^[[01;32mtecmint@tecmint^[[01;34m ~ $^[[00m uptime^M
 14:49:43 up  4:06,  2 users,  load average: 1.37, 1.56, 1.62^M
^[[01;32mtecmint@tecmint^[[01;34m ~ $^[[00m whoami^M
tecmint^M
^[[01;32mtecmint@tecmint^[[01;34m ~ $^[[00m echo ''^Hu'^Hs'^Hi'^Hn'^Hg'^H '^Hs'^Hc'^Hr'^Hi'^Hp'^Ht'^H^M
using script^M
^[[01;32mtecmint@tecmint^[[01;34m ~ $^[[00m exit^M
exit^M

Script done on Wednesday 16 September 2015 02:49:59 PM IST
~                                                              

Você pode usar a opção -a para anexar o arquivo de log ou texto digitado, mantendo o conteúdo anterior.


tecmint@tecmint ~ $ script -a script.log
Script started, file is script.log

tecmint@tecmint ~ $ date
Wed Sep 16 14:59:36 IST 2015


tecmint@tecmint ~ $ pwd
/home/tecmint


tecmint@tecmint ~ $ whereis script
script: /usr/bin/script /usr/bin/X11/script /usr/share/man/man1/script.1.gz


tecmint@tecmint ~ $ whatis script
script (1)           - make typescript of terminal session

Visualize o conteúdo do script e registre-o após usar a opção -a para anexá-lo.


tecmint@tecmint ~ $ vi script.log
Saída de amostra

^[[0m^[[255D^[[01;32mtecmint@tecmint^[[01;34m ~ $^[[00m date^M
Wed Sep 16 14:59:36 IST 2015^M
^[[01;32mtecmint@tecmint^[[01;34m ~ $^[[00m pwd^M
/home/tecmint^M
^[[01;32mtecmint@tecmint^[[01;34m ~ $^[[00m whre^H^[[K^H^[[Kereis script^M
script: /usr/bin/script /usr/bin/X11/script /usr/share/man/man1/script.1.gz^M
^[[01;32mtecmint@tecmint^[[01;34m ~ $^[[00m whatis script^M
script (1)           - make typescript of terminal session^M
^[[01;32mtecmint@tecmint^[[01;34m ~ $^[[00m vi s^H^[[K^H^[[K^H^[[K^H^[[Kexit^M
exit^M

Para registrar os resultados de um único comando que não seja uma sessão de shell interativa, use a opção -c.


tecmint@tecmint ~ $ script -c 'hostname' script.log

Script started, file is script.log
linux-console.net
Script done, file is script.log

Se você deseja que o script seja executado em modo silencioso, você pode usar a opção -q. Você não verá uma mensagem mostrando que o script está sendo iniciado ou encerrado.


tecmint@tecmint ~ $ script -c 'who'  -q  script.log

tecmint  tty8         2015-09-16 10:45 (:0)
tecmint  pts/5        2015-09-16 13:42 (:0)

Para definir informações de tempo para erro padrão ou um arquivo, use a opção –timing. As informações de tempo são úteis quando você deseja exibir novamente a saída armazenada no log_file.

Vamos iniciar o script e executar os seguintes comandos w, uptime e cal para serem gravados.


tecmint@tecmint ~ $ script --timing=time.txt script.log
Script started, file is script.log

tecmint@tecmint ~ $ w
 15:09:31 up  4:26,  2 users,  load average: 1.38, 1.39, 1.47
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
tecmint  tty8     :0               10:45    4:26m  8:15   0.38s x-session-manager
tecmint  pts/5    :0               13:42    3.00s  0.09s  0.00s script --timing=time.txt script.log

tecmint@tecmint ~ $ uptime
 15:09:36 up  4:26,  2 users,  load average: 1.43, 1.40, 1.48

tecmint@tecmint ~ $ cal
   September 2015     
Su Mo Tu We Th Fr Sa  
       1  2  3  4  5  
 6  7  8  9 10 11 12  
13 14 15 16 17 18 19  
20 21 22 23 24 25 26  
27 28 29 30    

Você pode visualizar os arquivos script.log e time.txt do comando de tempo acima.


tecmint@tecmint ~ $ vi script.log
Saída de amostra

^[[0m^[[255D^[[01;32mtecmint@tecmint^[[01;34m ~ $^[[00m w^M
 15:12:05 up  4:28,  2 users,  load average: 1.31, 1.37, 1.45^M
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT^M
tecmint  tty8     :0               10:45    4:28m  8:20   0.38s x-session-manager^M
tecmint  pts/5    :0               13:42    5.00s  0.09s  0.00s script --timing=time.txt script.log^M
^[[01;32mtecmint@tecmint^[[01;34m ~ $^[[00m uptime^M
 15:12:07 up  4:28,  2 users,  load average: 1.29, 1.36, 1.45^M
^[[01;32mtecmint@tecmint^[[01;34m ~ $^[[00m cal^M
   September 2015     ^M
Su Mo Tu We Th Fr Sa  ^M
       1  2  3  4  5  ^M
 6  7  8  9 10 11 12  ^M
13 14 15 ^[[7m16^[[27m 17 18 19  ^M
20 21 22 23 24 25 26  ^M
27 28 29 30           ^M
                      ^M

Agora visualize o arquivo time.txt.


tecmint@tecmint ~ $ vi time.txt
Saída de amostra

0.259669 306
0.037680 829
0.000006 2
0.000002 100
0.000002 2
0.000002 102
0.000019 202
0.000004 2
0.000002 102
0.000015 100
0.000002 2
0.000003 2
0.000002 99
0.000011 2
0.000003 82
...

O arquivo time.txt possui duas colunas, a primeira coluna mostra quanto tempo passou desde a última exibição e a segunda coluna mostra o número de caracteres que foram exibidos desta vez.

Use a página man e –help para procurar mais opções e ajuda no uso do utilitário de linha de comando do script.

Usando scriptreplay para reproduzir scripts usando informações de tempo

O comando scriptreplay ajuda a reproduzir informações em seu log_file registradas pelo comando script.

As informações de tempo são definidas pela opção -timing=file usada com o comando script e arquivo neste caso é file.txt que foi usado com o comando de script.

Lembre-se de que você precisa especificar o log_file usado com o comando de script.

Vamos agora repetir os três últimos comandos w, uptime e cal que executamos da seguinte maneira.


tecmint@tecmint ~ $ scriptreplay --timing=time.txt script.log

Quando o log_file é reproduzido usando as informações de tempo, os comandos gravados são executados e sua saída é exibida ao mesmo tempo em que a saída original foi exibida durante a gravação.

Resumo

Esses dois comandos, script e scriptreplay são fáceis de usar e ajudam muito quando você precisa executar o mesmo lote de comandos várias vezes. Eles ajudam muito no gerenciamento de servidores que possuem apenas interface de linha de comando para interação com seu sistema. Espero que este guia tenha sido útil e se você tiver algo a acrescentar ou enfrentar um desafio ao usá-los, não hesite em postar um comentário.