Sokratica Análisis de malware - DFIR - Writeups - Herramientas

Herramienta lxcreate

Not Found Not Found Not Found

Esta herramienta está pensada para automatizar la creación de ficheros con extensión .tex para tus documentos editados en cualquier editor de textos para LaTex.

Actualizado con opción para crear un fichero .bib para tu bibliografía - 12/08/2022.


Índice

  1. Código 1.1. Librerías necesarias 1.2. Definiendo los argumentos
  2. Código python
  3. Función creator
  4. Código py completo
  5. Entorno LaTex completo

Te dejo el script completo así como el entorno de LaTex aquí mismo para que puedas, simplemente, copiar y pegar en tu pc. Asegúrate de que tu fichero .py y el .txt donde está el entorno LaTex estén en el mismo directorio desde donde se ejecuta tu programa.


Objetivos

  • Crear un script en python de dos argumentos obligatorios .
    • Los argumentos serán simplemente la ruta donde se creará el fichero .tex y el nombre de fichero.
  • El comando de ejecución tendrá que verse de la siguiente manera: python3 lxcreate.py -p Escritorio -n Nombre
    • Y que nos devuelva un fichero con nombre Nombre.tex en el escritorio.
  • Asimismo, deseamos que el fichero .tex que se cree esté listo para su uso, es decir, que ya tenga todos los entornos requeridos en LaTex para empezar a escribir tu documento.
  • Adicionalmente, queremos que haya una opción para crear un directorio donde se almacene nuestro fichero.

Código

* Librerías necesarias

El código es simple pero útil en función del objetivo para lo que fue pensado. Yo lo escribí todo en VSCode. Las librerías que vamos a necesitar son:

  • from ast import parse
  • import os
  • import argparse

La librería os es necesaria para poder ejecutar comandos desde el emulador de la terminal. La vamos a necesitar para poder crear el fichero y directorio desde el emulador.

La librería argparse es sumamente interesante y es la que nos va a ayudar a definir los argumentos que deberán introducirse a nivel comando desde la terminal. Te dejo una referencias sobre el uso completo de esta librería.1

* Definiendo los argumentos

La definición de los argumentos que deberemos introducir para ejecutar nuestro script lxcreate se definen de acuerdo con los requerimientos de la librería (para más información puedes consultar el primer link de la nota el pie 1).

parser.add_argument('-p','--path',
                    required=True,
                    help='Crea el fichero en el directorio que especifiques.',
                    type=str,
                    dest='path'
)

En la primera línea estamos definiendo el comando del argumento. El campo required sirve para especificar que éste es un argumento obligatorio del comando. En el campo help se puede añadir una descripción del argumento. Dentro de type definimos el tipo de dato que se debe introducir y en dest el nombre del argumento. Este campo es importante para poder llamar este campo dentro de nuestro código. Con este array ya hemos definido cómo se deberá especificar y lo que deberá ir después de este comando cuando ejecutemos el programa. Así, pues, ya podríamos introducir dónde queremos crear nuestro fichero cuando ejecutemos el programa. Es decir, ya podríamos meter lo siguiente en el comando:

python3 lxcreate.py -p Escritorio

Ahora necesitamos especificar el comando para poder meter el nombre de nuestro fichero. La estructurá será la misma, sólo cambiaremos algunos campos como la descripción y el nombre. Entonces te dejo todos argumentos que vamos a necesitar para el script, que son el path, name y uno de usage por si hay dudas:

parser.add_argument('-u','--usage',
                    action='store_true'                   ,
                    help='Necesitas dos argumentos: -p para especificar la ruta\n'
                    '-n para especificar el nombre del fichero.\n'
                    'Ejemplo: python3 lxcreate -p Escritorio -n Tarea_1\n'
                    'Crea un fichero Tarea_1.tex en tu Escritorio.'
)
parser.add_argument('-p','--path',
                    required=True,
                    help='Crea el fichero en el directorio que especifiques.',
                    type=str,
                    dest='path'
)
parser.add_argument('-n','--name',
                    required=True,
                    help='Crea el fichero con el nombre que espcifiques.',
                    type=str,
                    dest='name'
)

Con esto ya podríamos ejecutar el comando completo como lo queríamos:

python3 lxcreate.py -p Escritorio -n Nombre

Sin embargo, aun nos falta escribir el código que haga la magia.

* Código python

Antes de meternos de lleno con el código debemos especificar algunas cuestiones. La primera de ellas es una variable necesaria para poder usar correctamente la librería argparse:

parser=argparse.ArgumentParser(
    description="Crea un fichero de extensión .tex en la ruta que especifiques."
)

La segunda cuestión es una variable global auxiliar que usaremos en nuestro código para poder especificar rápidamente una ruta básica para crear nuestros ficheros y directorios;

basePath=”/home/tu_nombre_de_usuario/”

Nota: Ten en cuenta que esta ruta parcial es de un sistema operativo Linux, en Windows ésta será diferente. La finalidad de esta variable es facilitarnos la tarea a la hora de poder crear el fichero, es decir, queremos poder crear rápidamente el fichero en, por ejemplo, basePath/Escritorio.

Otra variable para facilitaros la vida será meter todas los argumentos con sus especificaciones que hemos creado arriba en una variable que podamos invocar de manera fácil:

args=parser.parse_args()

Con esto ya podemos escribir nuestro código.

Función creator

Vamos a crear una función que hará todo. Lo que haremos es lo siguiente:

  • Preguntarle al usuario si también quiere crear un directorio donde se pueda almacenar el fichero.
    • La interacción será tan sencilla como recibir como input un “S” para sí o un “N” para no.
  • Desviaremos el flujo del programa con in if / else dependiendo de la respuesta del usuario.
  • Al margen de la respuesta del usuario, ejecutaremos la creación del archivo con extensión .tex.
    • Sin embargo, como definimos en los objetivos del programa, queremos que el fichero que se cree sea ya usable. Esto nos obliga a meterle contenido al fichero nuevo desde un read y un for que meta las líneas de un fichero externo donde esté todo el entorno para nuestro LaTex.
      • Hay que recordar que si el usuario quiso también crear un directorio, hay que crearlo.
  • Finalmente, vamos a imprimir un mensaje que indique dónde y bajo qué nombre se ha creado los ficheros.

Función creator - código

Nuestra función se llamará “creator” y lo primero que meteremos será la opción de crear o no un directorio para nuestro nuevo fichero.

def creator():
    q=input("¿Quieres crear un subdirectorio para tu fichero? [S/N]\n")

Ahora orientamos el flujo del programa mediante un if / else:

    if q=="S":
        os.mkdir(basePath+"/"+args.path+"/"+args.name)
        with open("input.txt", "r") as file, open(basePath+"/"+''.join(args.path)+"/"+args.name+"/"+''.join(args.name)+".tex","w") as sfile:
            for line in file:
                sfile.write(line)
        print("Tu fichero {}.tex se ha creado en {}.".format(args.name,args.path))
    elif q=="N":
        with open("input.txt", "r") as file, open(basePath+"/"+''.join(args.path)+"/"+''.join(args.name)+".tex","w") as sfile:
            for line in file:
                sfile.write(line)
  • El “os.mkdir” es para crear el directorio en caso de que se así se haya especificado.
  • Lo que está dentro del “with open…” es lo necesario para crear el fichero.
    • Como puedes ver, lo que viene después del “open(basePath…” es la invocación el argumento “-p” que se ha introducido desde la ejecución del programa (args.path).
    • Es el mismo caso para el contenido del argumento “-n” (args.name).

Lo realmente importante es fijarnos en que hay un bucle for que está leyendo algo y ese contenido metiéndolo en nuestro fichero. Se trata de las líneas del entorno para el documento para LaTex. Este fichero externo lo he nombrado “input.txt” y allí vienen todas las líneas del entorno.

*Nota:* al momento de la ejecución del lxcreate es de suma importancia que el fichero “input.txt” donde se encuentra el entorno de LaTex esté en el mismo directorio donde se encuentra nuestro programa .py.

Realmente eso es todo, sólo nos faltaría nuestro mensaje de que todo ha salido bien.

Opción para agregar fichero de bibliografía

Finalmente, agregamos un if para darle al usuario la opción de crear un fichero .bib, de nombre “bibliografía”, para que puedas meter allí tus referencias. El detalle es que está definido para que las citas sean en formato APA.

q2=input("¿Quieres crear un fichero para tu bibliografía? [S/N]\n")
    if q2=="S":
        with open("bibin.txt", "r") as file, open(basePath+"/"+''.join(args.path)+"/"+args.name+"/"+"bibliografía.bib","w") as bfile:
            for line in file:
                bfile.write(line)
    elif q2=="N":
        pass

Básicamente, estas líneas ejecutan lo mismo que la parte en que se crea el entorno para LaTex.

Nota: el fichero .bib trae dentro 3 ejemplos de cómo citar distintos formatos como: libros, artículos y artículos dentro de colecciones. Ésas, obviamente, las puedes o deber quitar.

A continuación te pongo todo el código completo y de una para que lo puedas copiar y pegar en un fichero .py en tu ordenador. También se pongo el .txt del fichero externo del entorno LaTex.

Código py completo

from ast import parse
import os
import argparse

basePath="/home/tu_nombre_de_usuario/" #Es importante que edites esta línea con la ruta de tu usuario

parser=argparse.ArgumentParser(
    description="Crea un fichero de extensión .tex en la ruta que especifiques."
)


parser.add_argument('-u','--usage',
                    action='store_true'                   ,
                    help='Necesitas dos argumentos: -p para especificar la ruta\n'
                    '-n para especificar el nombre del fichero.\n'
                    'Ejemplo: python3 lxcreate -p Escritorio -n Tarea_1\n'
                    'Crea un fichero Tarea_1.tex en tu Escritorio.'
)
parser.add_argument('-p','--path',
                    required=True,
                    help='Crea el fichero en el directorio que especifiques.',
                    type=str,
                    dest='path'
)
parser.add_argument('-n','--name',
                    required=True,
                    help='Crea el fichero con el nombre que espcifiques.',
                    type=str,
                    dest='name'
)

args=parser.parse_args()


def creator():
    q=input("¿Quieres crear un subdirectorio para tu fichero? [S/N]\n")
    if q=="S":
        os.mkdir(basePath+"/"+args.path+"/"+args.name)
        with open("input.txt", "r") as file, open(basePath+"/"+''.join(args.path)+"/"+args.name+"/"+''.join(args.name)+".tex","w") as sfile:
            for line in file:
                sfile.write(line)
        print("Tu fichero {}.tex se ha creado en {}.".format(args.name,args.path))
        q2=input("¿Quieres crear un fichero para tu bibliografía? [S/N]\n")
        if q2=="S":
            with open("bibin.txt", "r") as file, open(basePath+"/"+''.join(args.path)+"/"+args.name+"/"+"bibliografia.bib","w") as bfile:
                for line in file:
                    bfile.write(line)
        elif q2=="N":
            pass
    elif q=="N":
        with open("input.txt", "r") as file, open(basePath+"/"+''.join(args.path)+"/"+''.join(args.name)+".tex","w") as sfile:
            for line in file:
                sfile.write(line)
        print("Tu fichero {}.tex se ha creado en {}.".format(args.name,args.path))
        with open("bibin.txt", "r") as file, open(basePath+"/"+''.join(args.path)+"/"+"bibliografia.bib","w") as sfile:
            for line in file:
                sfile.write(line)


def main():
    creator()


if __name__=="__main__":
    main()

Entorno LaTex completo

% !TeX spellcheck = es_ES
% % % % % Preámbulo % % % % %

\documentclass[12pt, letterpaper]{article}
\usepackage[lmargin=2.5cm,rmargin=2.5cm,top=2cm,bottom=2cm]{geometry}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{url}
\usepackage{amsfonts}
\usepackage{amsmath}
\usepackage{amssymb}
\newtheorem{theorem}{}
\newtheorem{proof}{}
\usepackage{graphicx}
\usepackage{setspace}
\parindent = 1cm
\linespread{1.5}
\footnotesize
\usepackage{fancyhdr}
\usepackage{apacite}
\usepackage[english,french,main=spanish]{babel}

\pagestyle{fancy}
\fancyhead{}
\renewcommand{\headrulewidth}{0pt}
\fancyfoot{}
\fancyfoot[R]{\thepage}

% % % % % Fin del preámbulo % % % % %
% % % % % Título % % % % %

\author{\normalsize{TU_NOMBRE}\\[-0.5cm] \normalsize{SUBTÍTULO}\\[-0.5cm] \normalsize{NOMBRE_DEL_TRABAJO}}
\title{\large{\textbf{SUBTÍTULO_POR_SI_SE_NECESITA}}}
\date{}

% % % % % Fin del título % % % % %
% % % % % Cuerpo del texto % % % % %

\begin{document}
\maketitle
\thispagestyle{fancy}

\noindent Hola Mundo.

% % % % % Fin del cuerpo del texto % % % % %
% % % % % Bibliografía % % % % %

\newpage
\renewcommand{\refname}{\normalsize{Bibliografía}}
\bibliography{bibliografia}
\bibliographystyle{apacite}

% % % % % Fin de la bibliografía % % % % %
\end{document}

Si tienes dudas o hay algún problema en el código, por favor no dudes en contactarme.


  1. Documentación en inglés: https://docs.python.org/3/library/argparse.html , https://www.golinuxcloud.com/python-argparse/ . Ejemplo en español: https://es.code-paper.com/python/examples-argparse-argument