Primer cliente que me trae un sistema HTML + js y almacenamiento local, contraseñas expuestas, etc,etc.
Quiere que se pueda ver lo que otros usuarios capturan.
Será que ahora sí ganaré mi primer millón.
#vibecoding
Cubren todo lo esencial para empezar en la nube y en IA con AWS 👇
🔹 Cloud Practitioner: fundamentos de la nube, servicios clave, conceptos básicos y terminología AWS
🔹 AI Practitioner: IA, machine learning e IA generativa aplicados a casos reales
🔹 Material oficial: rutas de estudio, ejercicios prácticos y simuladores de examen
➡️ Disponible gratis hasta el 6 de enero
https://t.co/3zqXOSdONx
¡Ey, México! ¿Cansado de OS gringos espiando tu soberanía? 🌵📷No más dependencia; cadena de suministro local, bibliotecas críticas hechas en casa.
¿Listo para unirte?
Sitio: https://t.co/q19SIjU1Gk
Proyecto: https://t.co/53T116AC7e
#SoberaníaTecnológica#LinuxMX
Abrimos nuevas vacantes en Purple Security y he tenido varias entrevistas últimamente. Esta mañana, una pregunta me hizo clic con muchos de los perfiles que vi:
¿Estás acumulando horas… o construyendo un valor que nadie más puede replicar?
Si estás en la segunda, hablemos. 🚀
𝐆𝐮𝐢́𝐚 𝐑𝐚́𝐩𝐢𝐝𝐚 𝐝𝐞 𝐁𝐚𝐬𝐡 𝐒𝐜𝐫𝐢𝐩𝐭𝐢𝐧𝐠
Bash (acrónimo de Bourne Again SHell) es un intérprete de línea de comandos muy popular en sistemas operativos basados en Unix, como GNU/Linux y macOS.
Es la “consola” o “terminal” que utilizamos para interactuar con el sistema operativo a través de comandos de texto.
Cuando hablamos de Bash Scripting, nos referimos a la escritura de pequeños (o grandes) programas, llamados scripts, para automatizar tareas dentro de un entorno Bash.
Aprender Bash Scripting es muy útil para cualquier persona que trabaje con Linux o macOS: desde desarrolladores y administradores de sistemas, hasta científicos de datos o entusiastas de la informática.
¿𝐂𝐨́𝐦𝐨 𝐟𝐮𝐧𝐜𝐢𝐨𝐧𝐚 𝐁𝐚𝐬𝐡 𝐒𝐜𝐫𝐢𝐩𝐭𝐢𝐧𝐠?
𝟏. 𝐒𝐡𝐞𝐛𝐚𝐧𝐠 𝐋𝐢𝐧𝐞
La primera línea de muchos scripts de Bash es la llamada shebang:
#!/𝒃𝒊𝒏/𝒃𝒂𝒔𝒉
El #! indica al sistema que el archivo debe ser interpretado por el intérprete de comandos que se especifica a continuación (en este caso, /bin/bash).
Es fundamental poner esta línea al inicio de tu script para asegurar que se ejecute con Bash (o con el intérprete que prefieras).
𝟐. 𝐕𝐚𝐫𝐢𝐚𝐛𝐥𝐞𝐬
En Bash, para asignar valores a variables basta con usar el signo = sin espacios alrededor:
𝒖𝒔𝒆𝒓𝒏𝒂𝒎𝒆="𝑱𝒂𝒚"
𝒇𝒊𝒍𝒆𝒏𝒂𝒎𝒆=$3
username="Jay" almacena una cadena en la variable username.
filename=$3 toma el tercer argumento pasado al script y lo asigna a filename.
Para acceder al contenido de la variable, usamos "$username" o "$filename".
𝟑. 𝐄𝐧𝐭𝐫𝐚𝐝𝐚 𝐝𝐞 𝐔𝐬𝐮𝐚𝐫𝐢𝐨 (𝐔𝐬𝐞𝐫 𝐈𝐧𝐩𝐮𝐭)
Para solicitar datos al usuario, se emplea el comando read:
𝒓𝒆𝒂𝒅 -𝒑 "𝑬𝒏𝒕𝒆𝒓 𝒚𝒐𝒖𝒓 𝒖𝒔𝒆𝒓𝒏𝒂𝒎𝒆: " 𝒖𝒔𝒆𝒓
𝒆𝒄𝒉𝒐 "𝑼𝒔𝒆𝒓𝒏𝒂𝒎𝒆: $𝒖𝒔𝒆𝒓"
read -p "Mensaje" mostrará el mensaje y luego aguardará a que el usuario introduzca un valor.
El valor ingresado se almacenará en la variable especificada (user en este ejemplo).
𝟒. 𝐂𝐨𝐧𝐝𝐢𝐜𝐢𝐨𝐧𝐚𝐥 𝐢𝐟
Los scripts de Bash permiten ejecutar distintas instrucciones según condiciones definidas:
𝒊𝒇 [ "$𝑬𝑼𝑰𝑫" -𝒏𝒆 0 ]; 𝒕𝒉𝒆𝒏
𝒆𝒄𝒉𝒐 "𝒀𝒐𝒖 𝒂𝒓𝒆 𝒏𝒐𝒕 𝒓𝒖𝒏𝒏𝒊𝒏𝒈 𝒕𝒉𝒊𝒔 𝒔𝒄𝒓𝒊𝒑𝒕 𝒂𝒔 𝒕𝒉𝒆 𝒓𝒐𝒐𝒕 𝒖𝒔𝒆𝒓."
𝒆𝒍𝒔𝒆
𝒆𝒄𝒉𝒐 "𝒀𝒐𝒖 𝒂𝒓𝒆 𝒓𝒖𝒏𝒏𝒊𝒏𝒈 𝒕𝒉𝒊𝒔 𝒔𝒄𝒓𝒊𝒑𝒕 𝒂𝒔 𝒕𝒉𝒆 𝒓𝒐𝒐𝒕 𝒖𝒔𝒆𝒓."
𝒇𝒊
[ "$EUID" -ne 0 ] comprueba si el identificador de usuario efectivo (EUID) no es 0, lo que implica que el script no se está ejecutando como root.
Si la condición es verdadera, se ejecuta el primer bloque de código; de lo contrario, se ejecuta la cláusula else.
𝟓. 𝐁𝐮𝐜𝐥𝐞𝐬 (𝐅𝐨𝐫 𝐋𝐨𝐨𝐩)
Los bucles permiten repetir un bloque de instrucciones varias veces. Por ejemplo, para contar hasta 5:
𝒆𝒄𝒉𝒐 "𝑪𝒐𝒖𝒏𝒕𝒊𝒏𝒈 𝒕𝒐 5:"
𝒇𝒐𝒓 𝒊 𝒊𝒏 {1..5}; 𝒅𝒐
𝒆𝒄𝒉𝒐 "$𝒊"
𝒅𝒐𝒏𝒆
{1..5} es una forma de generar una secuencia de números del 1 al 5.
Cada vez que el bucle itera, la variable i toma uno de esos valores.
𝟔. 𝐅𝐮𝐧𝐜𝐢𝐨𝐧𝐞𝐬
En Bash, las funciones se definen para agrupar y reutilizar código:
𝒇𝒖𝒏𝒄𝒕𝒊𝒐𝒏 𝒈𝒓𝒆𝒆𝒕() {
𝒆𝒄𝒉𝒐 "𝑯𝒆𝒍𝒍𝒐, $1!"
}
𝒈𝒓𝒆𝒆𝒕 "𝑨𝒍𝒊𝒄𝒆"
function greet() { ... } declara la función greet.
$1 se refiere al primer parámetro que se le pasa a la función al invocarla.
Aquí, al ejecutar greet "Alice", la función imprimirá "Hello, Alice!".
𝟕. 𝐄𝐬𝐭𝐫𝐮𝐜𝐭𝐮𝐫𝐚 𝐂𝐨𝐧𝐝𝐢𝐜𝐢𝐨𝐧𝐚𝐥 𝐂𝐚𝐬𝐞
El comando case es útil para decidir entre varias opciones:
𝒆𝒄𝒉𝒐 "𝑬𝒏𝒕𝒆𝒓 𝒂 𝒏𝒖𝒎𝒃𝒆𝒓 𝒃𝒆𝒕𝒘𝒆𝒆𝒏 1 𝒂𝒏𝒅 2: "
𝒓𝒆𝒂𝒅 𝒏𝒖𝒎
𝒄𝒂𝒔𝒆 $𝒏𝒖𝒎 𝒊𝒏
1) 𝒆𝒄𝒉𝒐 "𝒀𝒐𝒖 𝒄𝒉𝒐𝒔𝒆 𝒐𝒏𝒆." ;;
2) 𝒆𝒄𝒉𝒐 "𝒀𝒐𝒖 𝒄𝒉𝒐𝒔𝒆 𝒕𝒘𝒐." ;;
*) 𝒆𝒄𝒉𝒐 "𝑰𝒏𝒗𝒂𝒍𝒊𝒅 𝒄𝒉𝒐𝒊𝒄𝒆." ;;
𝒆𝒔𝒂𝒄
Se evalúa la variable num contra cada patrón.
Si coincide con 1, se ejecuta el primer bloque; si coincide con 2, el segundo; de lo contrario, se muestra "Invalid choice."
𝟖. 𝐎𝐩𝐞𝐫𝐚𝐜𝐢𝐨𝐧𝐞𝐬 𝐜𝐨𝐧 𝐀𝐫𝐜𝐡𝐢𝐯𝐨𝐬
Podemos verificar si un archivo existe y si es un directorio con expresiones como -e y -d:
𝒊𝒇 [ -𝒆 "$𝒇𝒊𝒍𝒆𝒏𝒂𝒎𝒆" ] && [ -𝒅 "$𝒇𝒊𝒍𝒆𝒏𝒂𝒎𝒆" ]; 𝒕𝒉𝒆𝒏
𝒆𝒄𝒉𝒐 "𝑭𝒊𝒍𝒆 𝒆𝒙𝒊𝒔𝒕𝒔 𝒂𝒏𝒅 𝒊𝒔 𝒂 𝒅𝒊𝒓𝒆𝒄𝒕𝒐𝒓𝒚."
𝒆𝒍𝒔𝒆
𝒆𝒄𝒉𝒐 "𝑭𝒊𝒍𝒆 𝒅𝒐𝒆𝒔 𝒏𝒐𝒕 𝒆𝒙𝒊𝒔𝒕 𝒐𝒓 𝒊𝒔 𝒏𝒐𝒕 𝒂 𝒅𝒊𝒓𝒆𝒄𝒕𝒐𝒓𝒚."
𝒇𝒊
-e verifica si el archivo existe.
-d comprueba si es un directorio.
𝟗. 𝐀𝐫𝐠𝐮𝐦𝐞𝐧𝐭𝐨𝐬 𝐞𝐧 𝐋𝐢́𝐧𝐞𝐚 𝐝𝐞 𝐂𝐨𝐦𝐚𝐧𝐝𝐨𝐬
Al llamar a un script de Bash, se pueden pasar argumentos adicionales que se capturan con $1, $2, $3, etc.:
𝒆𝒄𝒉𝒐 "𝑭𝒊𝒓𝒔𝒕 𝒂𝒓𝒈𝒖𝒎𝒆𝒏𝒕: $1"
𝒆𝒄𝒉𝒐 "𝑺𝒆𝒄𝒐𝒏𝒅 𝒂𝒓𝒈𝒖𝒎𝒆𝒏𝒕: $2"
𝒆𝒄𝒉𝒐 "𝑬𝒙𝒊𝒕 𝒔𝒕𝒂𝒕𝒖𝒔: $?"
$1 se refiere al primer argumento, $2 al segundo, etc.
$? representa el exit status del último comando ejecutado.
𝟏𝟎. 𝐂𝐨́𝐝𝐢𝐠𝐨𝐬 𝐝𝐞 𝐒𝐚𝐥𝐢𝐝𝐚 (𝐄𝐱𝐢𝐭 𝐒𝐭𝐚𝐭𝐮𝐬 𝐂𝐨𝐝𝐞𝐬)
En Bash, cada comando devuelve un código de salida (exit status) para indicar éxito o error:
𝒄𝒂𝒕 𝒏𝒐𝒏𝒆𝒙𝒊𝒔𝒕𝒆𝒏𝒕-𝒇𝒊𝒍𝒆.𝒕𝒙𝒕 2> /𝒅𝒆𝒗/𝒏𝒖𝒍𝒍
𝒆𝒄𝒉𝒐 "𝑬𝒙𝒊𝒕 𝒔𝒕𝒂𝒕𝒖𝒔: $?"
Si cat no encuentra el archivo, devolverá un código distinto de 0.
$? ayuda a comprobar el resultado inmediatamente después de un comando.
𝟏𝟏. 𝐀𝐫𝐫𝐚𝐲𝐬 𝐈𝐧𝐝𝐞𝐱𝐚𝐝𝐨𝐬 (𝐈𝐧𝐝𝐞𝐱𝐞𝐝 𝐀𝐫𝐫𝐚𝐲𝐬)
Bash permite trabajar con arrays indexados:
𝒇𝒓𝒖𝒊𝒕𝒔=("𝑨𝒑𝒑𝒍𝒆" "𝑶𝒓𝒂𝒏𝒈𝒆" "𝑩𝒂𝒏𝒂𝒏𝒂")
𝒆𝒄𝒉𝒐 "𝑭𝒓𝒖𝒊𝒕𝒔: ${𝒇𝒓𝒖𝒊𝒕𝒔[0]}"
fruits[0] es "Apple", fruits[1] es "Orange", y así sucesivamente.
Para imprimir un elemento específico, se usa ${fruits[indice]}.
𝟏𝟐. 𝐀𝐫𝐫𝐚𝐲𝐬 𝐀𝐬𝐨𝐜𝐢𝐚𝐭𝐢𝐯𝐨𝐬 (𝐀𝐬𝐬𝐨𝐜𝐢𝐚𝐭𝐢𝐯𝐞 𝐀𝐫𝐫𝐚𝐲𝐬)
Los arrays asociativos permiten usar cadenas como índices:
𝒅𝒆𝒄𝒍𝒂𝒓𝒆 -𝑨 𝒄𝒂𝒑𝒊𝒕𝒂𝒍𝒔
𝒄𝒂𝒑𝒊𝒕𝒂𝒍𝒔[𝑼𝑺𝑨]="𝑾𝒂𝒔𝒉𝒊𝒏𝒈𝒕𝒐𝒏 𝑫.𝑪"
𝒄𝒂𝒑𝒊𝒕𝒂𝒍𝒔[𝑭𝒓𝒂𝒏𝒄𝒆]="𝑷𝒂𝒓𝒊𝒔"
𝒆𝒄𝒉𝒐 "𝑪𝒂𝒑𝒊𝒕𝒂𝒍 𝒐𝒇 𝑭𝒓𝒂𝒏𝒄𝒆: ${𝒄𝒂𝒑𝒊𝒕𝒂𝒍𝒔[𝑭𝒓𝒂𝒏𝒄𝒆]}"
Gracias a declare -A, capitals es un array asociativo.
Asignamos valores a través de claves como capitals[USA], capitals[France], etc.
𝟏𝟑. 𝐒𝐮𝐬𝐭𝐢𝐭𝐮𝐜𝐢𝐨́𝐧 𝐝𝐞 𝐂𝐨𝐦𝐚𝐧𝐝𝐨𝐬 (𝐂𝐨𝐦𝐦𝐚𝐧𝐝 𝐒𝐮𝐛𝐬𝐭𝐢𝐭𝐮𝐭𝐢𝐨𝐧)
Para capturar la salida de un comando y guardarla en una variable, se utiliza la sintaxis $(comando):
𝒄𝒖𝒓𝒓𝒆𝒏𝒕_𝒅𝒂𝒕𝒆=$(𝒅𝒂𝒕𝒆)
𝒆𝒄𝒉𝒐 "𝑻𝒐𝒅𝒂𝒚'𝒔 𝒅𝒂𝒕𝒆 𝒊𝒔: $𝒄𝒖𝒓𝒓𝒆𝒏𝒕_𝒅𝒂𝒕𝒆"
$(date) se sustituye por la salida del comando date, asignándola a current_date.
𝟏𝟒. 𝐑𝐞𝐝𝐢𝐫𝐞𝐜𝐜𝐢𝐨𝐧𝐞𝐬 𝐞𝐧 𝐋𝐢́𝐧𝐞𝐚 𝐝𝐞 𝐂𝐨𝐦𝐚𝐧𝐝𝐨𝐬
Bash permite redirigir la entrada y salida de los procesos:
𝒆𝒄𝒉𝒐 "𝑻𝒉𝒊𝒔 𝒊𝒔 𝒂 𝒔𝒂𝒎𝒑𝒍𝒆 𝒕𝒆𝒙𝒕." > 𝒆𝒙𝒂𝒎𝒑𝒍𝒆.𝒕𝒙𝒕
𝒇𝒊𝒏𝒅 / -𝒏𝒂𝒎𝒆 𝒉𝒆𝒍𝒍𝒐.𝒕𝒙𝒕 2> /𝒅𝒆𝒗/𝒏𝒖𝒍𝒍
> redirige la salida estándar (stdout) a un archivo, sobreescribiéndolo.
2> redirige la salida de errores (stderr) a un archivo o dispositivo (en el ejemplo, /dev/null para desecharla).
𝟏𝟓. 𝐎𝐩𝐞𝐫𝐚𝐜𝐢𝐨𝐧𝐞𝐬 𝐀𝐫𝐢𝐭𝐦𝐞́𝐭𝐢𝐜𝐚𝐬
Puedes realizar operaciones matemáticas usando (( )) o $(( )):
𝒓𝒆𝒔𝒖𝒍𝒕=$(( 15 * 2 ))
𝒆𝒄𝒉𝒐 $𝒓𝒆𝒔𝒖𝒍𝒕
$(( 15 * 2 )) evalúa la expresión y asigna el resultado a result.
𝟏𝟔. 𝐄𝐱𝐩𝐚𝐧𝐬𝐢𝐨́𝐧 𝐝𝐞 𝐏𝐚𝐫𝐚́𝐦𝐞𝐭𝐫𝐨𝐬 (𝐏𝐚𝐫𝐚𝐦𝐞𝐭𝐞𝐫 𝐄𝐱𝐩𝐚𝐧𝐬𝐢𝐨𝐧)
La expansión de parámetros se basa en distintas expresiones para manipular variables. Por ejemplo:
𝑺𝑹𝑪="𝒑𝒂𝒕𝒉/𝒕𝒐/𝒇𝒐𝒐.𝒄𝒑𝒑"
𝑩𝑨𝑺𝑬𝑷𝑨𝑻𝑯=${𝑺𝑹𝑪%%/*}
𝒆𝒄𝒉𝒐 $𝑩𝑨𝑺𝑬𝑷𝑨𝑻𝑯
${variable%%patrón} elimina lo que coincide con el patrón más extenso a la derecha.
Aquí, ${SRC%%/*} cortaría la ruta path/to/foo.cpp quedándose con path.
𝟏𝟕. 𝐌𝐚𝐧𝐞𝐣𝐨 𝐝𝐞 𝐒𝐞𝐧̃𝐚𝐥𝐞𝐬 (𝐏𝐫𝐨𝐜𝐞𝐬𝐬 𝐒𝐢𝐠𝐧𝐚𝐥 𝐇𝐚𝐧𝐝𝐥𝐢𝐧𝐠)
Bash provee la función trap para capturar señales y ejecutar acciones específicas cuando sucedan:
𝒕𝒓𝒂𝒑 '𝒆𝒄𝒉𝒐 "𝑹𝒆𝒄𝒆𝒊𝒗𝒆𝒅 𝑺𝑰𝑮𝑻𝑬𝑹𝑴 𝒔𝒊𝒈𝒏𝒂𝒍. 𝑪𝒍𝒆𝒂𝒏𝒊𝒏𝒈 𝒖𝒑..."; 𝒆𝒙𝒊𝒕' 𝑺𝑰𝑮𝑻𝑬𝑹𝑴
Cuando el script reciba una señal SIGTERM (por ejemplo, si se intenta detener el proceso), este comando ejecutará el mensaje y luego finalizará el script.
𝟏𝟖. 𝐂𝐨𝐦𝐞𝐧𝐭𝐚𝐫𝐢𝐨𝐬
Finalmente, en Bash podemos usar:
# para comentarios de una sola línea.
: ' ... ' o <<COMMENT ... COMMENT para comentarios de varias líneas.
# 𝑬𝒔𝒕𝒐 𝒆𝒔 𝒖𝒏 𝒄𝒐𝒎𝒆𝒏𝒕𝒂𝒓𝒊𝒐 𝒅𝒆 𝒖𝒏𝒂 𝒔𝒐𝒍𝒂 𝒍𝒊́𝒏𝒆𝒂
: '
𝑬𝒔𝒕𝒐 𝒆𝒔 𝒖𝒏 𝒄𝒐𝒎𝒆𝒏𝒕𝒂𝒓𝒊𝒐
𝒅𝒆 𝒎𝒖́𝒍𝒕𝒊𝒑𝒍𝒆𝒔 𝒍𝒊́𝒏𝒆𝒂𝒔
'