Os arquivos de texto contêm apenas caracteres, enquanto os arquivos binários contêm todos os valores de caracteres possíveis, incluindo o control characters
O comando od
com o sinalizador -c
(od significa octal dump
) exibe arquivos contendo caracteres de controle.
Ao exibir um arquivo binário na tela, os caracteres de controle dentro do arquivo podem definir modos indesejáveis para a estação de trabalho e podem fazer com que a saída não fique nítida (ou seja, sem sentido) e até mesmo fazer com que a estação pare de responder. Para encontrar pistas no arquivo binário (ou seja, exibi-lo de maneira segura), podemos usar os comandos cat
, od
ou hexdump
.
O comando cat -v
que tornará os caracteres de controle visíveis de maneira segura e não colocará a tela em nenhum modo estranho. Este comando representa cada caractere de controle por um Careta (^) e o caractere imprimível correspondente.
O comando od
significa octal dump e exibe cada palavra de um arquivo ou pipeline em octal usando the base eight numbering system
. Por exemplo, o comando od
mostraria o arquivo do sistema /var/run/utmp
da seguinte forma:
$ od /var/run/utmp
0000000 000002 000000 000000 000000 000176 000000 000000 000000
0000020 000000 000000 000000 000000 000000 000000 000000 000000
0000040 000000 000000 000000 000000 077176 000000 062562 067542
0000060 072157 000000 000000 000000 000000 000000 000000 000000
0000100 000000 000000 000000 000000 000000 000000 027063 030061
0000120 030056 033055 031471 030456 027061 027061 066145 027067
0000140 034170 057466 032066 000000 000000 000000 000000 000000
0000160 000000 000000 000000 000000 000000 000000 000000 000000
. . . .
. . . .
. . . .
. . . .
Agora, adicionar o sinalizador -b
(-b significa selecionar bytes octal) ao comando od
dividirá cada palavra em dois bytes ou caracteres. Por exemplo, o texto anterior mostrará o seguinte:
$ od -b /var/run/utmp
0000000 002 000 000 000 000 000 000 000 176 000 000 000 000 000 000 000
0000020 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000
0000040 000 000 000 000 000 000 000 000 176 176 000 000 162 145 142 157
0000060 157 164 000 000 000 000 000 000 000 000 000 000 000 000 000 000
0000100 000 000 000 000 000 000 000 000 000 000 000 000 063 056 061 060
0000120 056 060 055 066 071 063 056 061 061 056 061 056 145 154 067 056
0000140 170 070 066 137 066 064 000 000 000 000 000 000 000 000 000 000
0000160 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000
. . . .
. . . .
. . . .
. . . .
De acordo com ASCII(7)
man, vamos combinar os números da tabela anterior com o ASCII:
-
000
significanull
. -
002
significastart of text
- na primeira linha, o número
176
representa o caractere~
e assim por diante, cada número é codificado em ASCII(7)
table.
Por outro lado, adicionar o sinalizador -c
(significa selecionar caracteres imprimíveis ou escapes de contrabarra ao comando od
mostrará qualquer caractere imprimível na saída. O mesmo exemplo anterior terá a seguinte aparência:
$ od -c /var/run/utmp
0000000 002 $ strings /var/run/utmp
reboot
3.10.0-693.11.1.el7.x86_64
. . . .
. . . .
. . . .
. . . .
$ od /var/run/utmp
0000000 000002 000000 000000 000000 000176 000000 000000 000000
0000020 000000 000000 000000 000000 000000 000000 000000 000000
0000040 000000 000000 000000 000000 077176 000000 062562 067542
0000060 072157 000000 000000 000000 000000 000000 000000 000000
0000100 000000 000000 000000 000000 000000 000000 027063 030061
0000120 030056 033055 031471 030456 027061 027061 066145 027067
0000140 034170 057466 032066 000000 000000 000000 000000 000000
0000160 000000 000000 000000 000000 000000 000000 000000 000000
. . . .
. . . .
. . . .
. . . .
$ od -b /var/run/utmp
0000000 002 000 000 000 000 000 000 000 176 000 000 000 000 000 000 000
0000020 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000
0000040 000 000 000 000 000 000 000 000 176 176 000 000 162 145 142 157
0000060 157 164 000 000 000 000 000 000 000 000 000 000 000 000 000 000
0000100 000 000 000 000 000 000 000 000 000 000 000 000 063 056 061 060
0000120 056 060 055 066 071 063 056 061 061 056 061 056 145 154 067 056
0000140 170 070 066 137 066 064 000 000 000 000 000 000 000 000 000 000
0000160 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000
. . . .
. . . .
. . . .
. . . .
$ od -c /var/run/utmp
0000000 002 $ strings /var/run/utmp
reboot
3.10.0-693.11.1.el7.x86_64
. . . .
. . . .
. . . .
. . . .
%pre% %pre% %pre% %pre% %pre% %pre% ~ %pre% %pre% %pre% %pre% %pre% %pre% %pre%
0000020 %pre% %pre% %pre% %pre% %pre% %pre% %pre% %pre% %pre% %pre% %pre% %pre% %pre% %pre% %pre% %pre%
0000040 %pre% %pre% %pre% %pre% %pre% %pre% %pre% %pre% ~ ~ %pre% %pre% r e b o
0000060 o t %pre% %pre% %pre% %pre% %pre% %pre% %pre% %pre% %pre% %pre% %pre% %pre% %pre% %pre%
0000100 %pre% %pre% %pre% %pre% %pre% %pre% %pre% %pre% %pre% %pre% %pre% %pre% 3 . 1 0
0000120 . 0 - 6 9 3 . 1 1 . 1 . e l 7 .
0000140 x 8 6 _ 6 4 %pre% %pre% %pre% %pre% %pre% %pre% %pre% %pre% %pre% %pre%
0000160 %pre% %pre% %pre% %pre% %pre% %pre% %pre% %pre% %pre% %pre% %pre% %pre% %pre% %pre% %pre% %pre%
. . . .
. . . .
. . . .
. . . .
%pre% %pre% %pre% ~ %pre% %pre% %pre% %pre% %pre% %pre% %pre%
0000020 %pre% %pre% %pre% %pre% %pre% %pre% %pre% %pre% %pre% %pre% %pre% %pre% %pre% %pre% %pre% %pre%
0000040 %pre% %pre% %pre% %pre% %pre% %pre% %pre% %pre% ~ ~ %pre% %pre% r e b o
0000060 o t %pre% %pre% %pre% %pre% %pre% %pre% %pre% %pre% %pre% %pre% %pre% %pre% %pre% %pre%
0000100 %pre% %pre% %pre% %pre% %pre% %pre% %pre% %pre% %pre% %pre% %pre% %pre% 3 . 1 0
0000120 . 0 - 6 9 3 . 1 1 . 1 . e l 7 .
0000140 x 8 6 _ 6 4 %pre% %pre% %pre% %pre% %pre% %pre% %pre% %pre% %pre% %pre%
0000160 %pre% %pre% %pre% %pre% %pre% %pre% %pre% %pre% %pre% %pre% %pre% %pre% %pre% %pre% %pre% %pre%
. . . .
. . . .
. . . .
. . . .
Para traduzir a tabela anterior para um texto significativo, podemos usar
o comando strings
que encontrará todas as seqüências de caracteres imprimíveis com um comprimento de cerca de quatro caracteres ou mais. Por exemplo, na tabela anterior:
-
A linha < 0000040 > contém as letras
r e b o
. -
A linha < 0000060 > contém as letras
o t
. Como resultado, o comandostrings
traduziria essas letras para a palavra"reboot".
Da mesma forma,
-
Linha <0000> > contém
3 . 1 0
. -
Linha < 0000120 > contém
. 0 - 6 9 3 . 1 1 . 1 . e l 7 .
. -
Linha < 0000140 > contém
x 8 6 _ 6 4
.
O comando string
traduziria essas três linhas para "3.10.0-693.11.1.el7.x86_64"