¿Alguna vez ha intentado abrir un archivo en un editor sólo para descubrir que contiene contenido binario ilegible?
El comando «strings» de Linux permite ver los caracteres legibles para humanos dentro de cualquier archivo.
El propósito principal de usar el comando «strings» es averiguar qué tipo de archivo es el que está buscando, pero también puede usarlo para extraer texto. Por ejemplo, si tiene un archivo de un programa propietario que guarda archivos en un formato binario extraño, puede usar «strings» para extraer el texto que puso en el archivo.
Índice de contenidos
Ejemplo de uso del comando Strings
Una buena manera de demostrar el poder del comando strings es crear un documento usando LibreOffice Writer.
Simplemente abra LibreOffice Writer e introduzca algo de texto y guárdelo en el formato ODT estándar.
Ahora abra una ventana de terminal (presione CTRL, ALT y T al mismo tiempo) y luego use el comando cat para mostrar el archivo de la siguiente manera:
cat yourfilename.odt | más
(Reemplace el nombre de archivo.odt por el nombre del archivo que ha creado)
Lo que verás es todo un muro de texto ilegible.
Presione la barra espaciadora para desplazarse por el archivo. Esporádicamente a lo largo del archivo verá parte del texto que ha introducido.
El comando strings se puede utilizar para mostrar sólo las partes que son legibles para el ser humano.
En su forma más simple puede ejecutar el siguiente comando:
strings yourfilename.odt | más
Como antes, aparecerá un muro de texto, pero sólo texto que puedas leer como humano. Si tienes suerte, podrás ver tu texto.
Lo que podrá ver que es clave, sin embargo, está en la primera línea:
mimetypeapplication/vnd.oasis.opendocument.text
Sabemos que el tipo de archivo es un archivo LibreOffice Writer ODT por 2 razones:
- Creamos el archivo
- La extensión es.ODT
Imagine que no creó el archivo o que lo encontró en un disco recuperado y que el archivo no tenía una extensión.
La recuperación de Windows a menudo recupera archivos con nombres como 0001, 0002, 0003, etc. El hecho de que los archivos fueron recuperados es genial, pero tratar de averiguar cuáles eran los tipos de esos archivos fue una pesadilla.
Mediante el uso de cadenas de texto tiene la posibilidad de resolver el tipo de archivo. Saber que un archivo es un archivo opendocument.text significa que puede guardarlo con la extensión ODT y abrirlo en LibreOffice writer.
En caso de que no lo supiera, un archivo ODT es básicamente un archivo comprimido. Si renombra su nombre de archivo.odt a su nombre de archivo.zip puede abrirlo en una herramienta de archivo e incluso descomprimir el archivo.
Comportamientos alternativos
Por defecto, el comando strings devuelve todas las cadenas dentro de un archivo, pero puede cambiar el comportamiento para que devuelva las cadenas de las secciones de datos inicializadas y cargadas en un archivo.
¿Qué significa esto exactamente? Nadie parece saberlo.
Tiene sentido asumir que está usando cadenas para intentar averiguar el tipo de archivo o para buscar texto específico en un archivo.
Si al ejecutar el comando strings usando el comportamiento por defecto no obtienes la salida que esperabas, entonces intenta ejecutar uno de los siguientes comandos para ver si hace alguna diferencia:
strings -d yourfilename
strings –data yourfilename
La página del manual indica que el comando anterior puede ayudar a reducir la cantidad de basura devuelta por las cadenas.
El comando «strings» puede configurarse para que funcione al revés, de modo que el interruptor menos d sea el comportamiento predeterminado. Si este es el caso en su sistema, puede devolver todos los datos utilizando el siguiente comando:
strings -a su nombre de archivo
Formateo de la salida
Puede obtener el texto dentro de la salida para mostrar el nombre del archivo junto a cada línea de texto.
Para ello, ejecute uno de los siguientes comandos:
strings -f yourfilename
strings –print-file-name su nombre de archivo
La salida tendrá ahora un aspecto parecido a este:
yourfilename: un trozo de texto
yourfilename: otro trozo de texto
Como parte de la salida, también puede mostrar el desplazamiento del lugar donde aparece ese texto en un archivo. Para ello ejecute el siguiente comando:
strings -o sunombredearchivo
La salida se verá algo así:
16573 su
17024 texto
El offset es en realidad el offset octal, aunque dependiendo de cómo se han compilado las cadenas para su sistema, podría ser fácilmente el offset hexadecimal o el decimal también.
Una forma más precisa de obtener el offset que desea es utilizar los siguientes comandos:
strings -t d yourfilename
strings -t o yourfilename
strings -t h yourfilename
La t menos significa devolver el offset y el carácter que sigue determina el tipo de offset. (es decir, d = decimal, o = octal, h = hexadecimal).
Por defecto, el comando strings imprime cada nueva cadena en una nueva línea, pero puede establecer el delimitador de su elección. Por ejemplo, para usar un símbolo de tubería («|») como delimitador, ejecute el siguiente comando:
strings -s «|» yourfilename
Ajustar el límite de la cadena
El comando strings por defecto busca una cadena de 4 caracteres imprimibles en una fila. Puede ajustar el valor predeterminado para que sólo devuelva una cadena con 8 caracteres imprimibles o 12 caracteres imprimibles.
Ajustando este límite puede ajustar la salida para obtener el mejor resultado posible. Al buscar una cadena que es demasiado larga, se corre el riesgo de omitir texto útil, pero al hacerlo demasiado corto, es posible que se devuelva mucha más basura.
Para ajustar el límite de la cadena ejecute el siguiente comando:
strings -n 8 sunombredearchivo
En el ejemplo anterior he cambiado el límite a 8. Puede reemplazar 8 por el número de su elección.
También puede usar el siguiente comando para hacer lo mismo:
strings –bytes=8 sunombredearchivo
Incluir espacio en blanco
De forma predeterminada, el comando strings incluye espacios en blanco como, por ejemplo, una ficha o un espacio como carácter imprimible. Por lo tanto, si tiene una cadena que dice «el gato se sentó en la alfombra», entonces el comando de cadenas devolverá todo el texto.
Los nuevos caracteres de línea y los retornos de carro no se consideran caracteres imprimibles por defecto.
Para que las cadenas reconozcan nuevos caracteres de línea y retornos de carro como cadenas de caracteres imprimibles de la siguiente manera:
strings -w sunombredearchivo
Cambiar la codificación
Hay 5 opciones de codificación disponibles para su uso con cadenas:
- s = 7 bit byte (utilizado para ASCII, ISO 8859)
- S = 8 bit byte
- b = 16 bit bigendian
- l = 16 bit littleendian
El valor por defecto es de 7 bytes de bits.
Para cambiar la codificación ejecute el siguiente comando:
strings -e s yourfilename
strings –encoding=s yourfilename
En el comando anterior, he especificado la «s» por defecto, que significa byte de 7 bits. Simplemente reemplace la «s» por la letra de codificación de su elección.
Cambiar el nombre de la descripción del archivo binario
Puede cambiar el comportamiento de las cadenas para que utilicen una biblioteca de descriptores de archivos binarios diferente a la que se proporciona para su sistema.
Este interruptor es uno para los expertos. Si tiene otra librería que usar, puede hacerlo ejecutando el siguiente comando strings:
strings -T bfdname
Opciones de lectura desde un archivo
Si va a utilizar las mismas opciones cada vez, no querrá tener que especificar todos los conmutadores cada vez que ejecute el comando porque lleva tiempo.
Lo que puede hacer es crear un archivo de texto usando nano y especificar las opciones dentro de ese archivo.
Para probar esto dentro de una terminal ejecute el siguiente comando:
nano stringsopts
En el archivo, introduzca el siguiente texto:
-f -o -n 3 -s «|»
Guarde el archivo pulsando CTRL y O y salga pulsando CTRL y X.
Para ejecutar los comandos de cadenas con estas opciones, ejecute el siguiente comando:
strings @stringsopta su nombre de archivo
Las opciones se leerán desde las opciones de cadena de ficheros y debería ver el nombre del fichero antes de cada cadena, el offset y el «|» como separador.
Cómo obtener ayuda
Si quieres leer más sobre las cadenas, puedes ejecutar el siguiente comando para obtener ayuda.
strings –help
Alternativamente, también puede leer la página del manual:
cadenas man
Averigüe qué versión de las cadenas está ejecutando
Para encontrar la versión de las cadenas que está ejecutando, ejecute uno de los siguientes comandos:
cuerdas -v
cuerdas -V
strings –versión