Ejemplos Prácticos de Scripting en Bash para Tareas de Sistema Linux
Enviado por Programa Chuletas y clasificado en Informática y Telecomunicaciones
Escrito el en español con un tamaño de 10,84 KB
1. Script para Borrar un Directorio con Opción de Backup
Este script elimina un directorio especificado como parámetro. Antes de borrarlo, pregunta al usuario si desea realizar una copia de seguridad en el directorio $HOME/backup
.
#!/bin/bash
# Comprobar si se ha pasado un parámetro
if [ $# -ne 1 ]; then
echo "Uso: $0 <directorio_a_borrar>"
exit 1
fi
TARGET_DIR="$1"
BACKUP_DIR="$HOME/backup"
# Comprobar si el parámetro es un directorio válido
if [ -d "$TARGET_DIR" ]; then
# Crear el directorio de backup si no existe
if [ ! -d "$BACKUP_DIR" ]; then
mkdir -p "$BACKUP_DIR"
echo "Directorio de backup creado en $BACKUP_DIR"
fi
# Preguntar al usuario si desea hacer una copia de seguridad
read -p "¿Desea realizar una copia de seguridad del directorio '$TARGET_DIR'? (S/N): " comprob
# Realizar la copia si la respuesta es 's' o 'S'
if [[ "$comprob" == "s" || "$comprob" == "S" ]]; then
echo "Realizando copia de seguridad en $BACKUP_DIR ..."
cp -r "$TARGET_DIR" "$BACKUP_DIR"
if [ $? -eq 0 ]; then
echo "Copia de seguridad realizada con éxito."
# Proceder a borrar el directorio original
echo "Borrando el directorio original '$TARGET_DIR' ..."
rm -r "$TARGET_DIR"
if [ $? -eq 0 ]; then
echo "Directorio '$TARGET_DIR' borrado con éxito."
else
echo "Error al borrar el directorio '$TARGET_DIR'."
fi
else
echo "Error al realizar la copia de seguridad. No se borrará el directorio original."
fi
else
# Borrar directamente si no se quiere copia
echo "No se realizará copia de seguridad."
read -p "¿Está seguro de que desea borrar el directorio '$TARGET_DIR' sin copia de seguridad? (S/N): " confirm_delete
if [[ "$confirm_delete" == "s" || "$confirm_delete" == "S" ]]; then
echo "Borrando el directorio '$TARGET_DIR' ..."
rm -r "$TARGET_DIR"
if [ $? -eq 0 ]; then
echo "Directorio '$TARGET_DIR' borrado con éxito."
else
echo "Error al borrar el directorio '$TARGET_DIR'."
fi
else
echo "Operación cancelada. El directorio '$TARGET_DIR' no ha sido borrado."
fi
fi
else
echo "Error: '$TARGET_DIR' no es un directorio válido."
exit 1
fi
2. Script para Crear Estructura de Gestión y Extraer Usuarios
Este script crea un directorio llamado gestion
en /root
(Nota: requiere permisos de superusuario), se posiciona en él y crea un archivo usuarios
con los nombres de usuario y sus shells extraídos de /etc/passwd
.
#!/bin/bash
GESTION_DIR="/root/gestion"
# Comprobar si el directorio gestion ya existe
if [ -d "$GESTION_DIR" ]; then
echo "El directorio '$GESTION_DIR' ya existe."
else
# Crear el directorio si no existe
mkdir "$GESTION_DIR"
if [ $? -eq 0 ]; then
echo "Directorio '$GESTION_DIR' creado con éxito."
else
echo "Error al crear el directorio '$GESTION_DIR'. ¿Tiene permisos suficientes?"
exit 1
fi
fi
# Cambiar al directorio de gestión
cd "$GESTION_DIR" || exit 1
# Crear el archivo usuarios y volcar la información
OUTPUT_FILE="usuarios"
echo "Extrayendo nombres de usuario y shells a $OUTPUT_FILE ..."
touch "$OUTPUT_FILE"
cut -d":" -f1,7 /etc/passwd > "$OUTPUT_FILE"
echo "Archivo '$OUTPUT_FILE' creado/actualizado en '$GESTION_DIR'."
3. Script para Copiar Archivos con Control de Argumentos y Sobrescritura
Copia el contenido de un fichero origen a un fichero destino. Verifica que se proporcionen exactamente dos argumentos (origen y destino). Si el destino existe, pregunta si se desea sobrescribir.
#!/bin/bash
# Comprobar el número de argumentos
if [ $# -ne 2 ]; then
echo "Error: Se requieren exactamente dos argumentos."
echo "Uso: $0 <archivo_origen> <archivo_destino>"
exit 1
fi
SOURCE_FILE="$1"
DEST_FILE="$2"
# Comprobar si el origen es un archivo regular
if [ -f "$SOURCE_FILE" ]; then
# Comprobar si el destino existe
if [ -e "$DEST_FILE" ]; then
# Si el destino existe, preguntar si sobrescribir
if [ -f "$DEST_FILE" ]; then
read -p "El archivo destino '$DEST_FILE' ya existe. ¿Desea sobrescribirlo? (S/N): " sobresc
if [[ "$sobresc" == "s" || "$sobresc" == "S" ]]; then
echo "Sobrescribiendo '$DEST_FILE' con el contenido de '$SOURCE_FILE'..."
cat "$SOURCE_FILE" > "$DEST_FILE"
echo "Archivo copiado con éxito."
# Si no se quiere sobrescribir, preguntar si añadir al final (append)
# else
# read -p "¿Desea añadir el contenido de '$SOURCE_FILE' al final de '$DEST_FILE'? (S/N): " append
# if [[ "$append" == "s" || "$append" == "S" ]]; then
# echo "Añadiendo contenido a '$DEST_FILE'..."
# cat "$SOURCE_FILE" >> "$DEST_FILE"
# echo "Contenido añadido con éxito."
# else
# echo "Operación cancelada."
# fi
else
echo "Operación cancelada. No se ha modificado '$DEST_FILE'."
fi
else
# Si el destino existe pero no es un archivo regular (ej. directorio)
echo "Error: El destino '$DEST_FILE' existe pero no es un archivo regular."
exit 1
fi
else
# Si el destino no existe, copiar directamente
echo "Copiando '$SOURCE_FILE' a '$DEST_FILE'..."
cat "$SOURCE_FILE" > "$DEST_FILE"
echo "Archivo copiado con éxito."
fi
else
echo "Error: El origen '$SOURCE_FILE' no es un archivo regular o no existe."
exit 1
fi
4. Script de Menú Interactivo para Tareas Comunes
Presenta un menú con varias opciones para realizar tareas administrativas comunes.
#!/bin/bash
salir=0
while [ "$salir" -ne 5 ]; do
# Mostrar Menú
echo "---------------------------------"
echo " MENÚ PRINCIPAL "
echo "---------------------------------"
echo "1. Mostrar permisos de un archivo"
echo "2. Listar directorio actual (orden inverso)"
echo "3. Modificar contraseña de usuario"
echo "4. Crear enlace simbólico"
echo "5. Limpiar pantalla y salir"
echo "---------------------------------"
read -p "Indique su opción [1-5]: " salir
case $salir in
1)
read -p "Indique la ruta del archivo: " arch
if [ -e "$arch" ]; then
if [ -f "$arch" ]; then
echo "Permisos de '$arch':"
if [ -r "$arch" ]; then echo " - Lectura: Sí"; else echo " - Lectura: No"; fi
if [ -w "$arch" ]; then echo " - Escritura: Sí"; else echo " - Escritura: No"; fi
if [ -x "$arch" ]; then echo " - Ejecución: Sí"; else echo " - Ejecución: No"; fi
else
echo "'$arch' existe pero no es un archivo regular."
fi
else
echo "Error: El archivo o directorio '$arch' no existe."
fi
read -p "Pulse Enter para continuar..."
;;
2)
echo "Contenido del directorio actual (ordenado inversamente):"
ls -l | sort -r
read -p "Pulse Enter para continuar..."
;;
3)
read -p "Indique el nombre de usuario: " usu
# Comprobar si el usuario existe en /etc/passwd
if grep -q "^${usu}:" /etc/passwd; then
echo "Intentando cambiar la contraseña para el usuario '$usu'..."
passwd "$usu"
# Nota: 'passwd' requerirá interacción y posiblemente permisos de root.
else
echo "Error: El usuario '$usu' no existe."
fi
read -p "Pulse Enter para continuar..."
;;
4)
read -p "Indique el directorio o archivo original (destino del enlace): " target
read -p "Indique el nombre para el enlace simbólico: " link_name
# Comprobar si el origen existe
if [ -e "$target" ]; then
# Comprobar si el nombre del enlace ya existe
if [ -e "$link_name" ]; then
echo "Error: Ya existe un archivo o directorio llamado '$link_name'."
else
echo "Creando enlace simbólico '$link_name' apuntando a '$target'..."
ln -s "$target" "$link_name"
if [ $? -eq 0 ]; then
echo "Enlace simbólico creado con éxito."
else
echo "Error al crear el enlace simbólico."
fi
fi
else
echo "Error: El directorio o archivo original '$target' no existe."
fi
read -p "Pulse Enter para continuar..."
;;
5)
clear
echo "Saliendo del script."
;;
*)
echo "Opción no válida. Por favor, elija una opción del 1 al 5."
read -p "Pulse Enter para continuar..."
;;
esac
done
5. Ejemplos de Comandos Útiles en Linux
A continuación, se muestra una lista de comandos de ejemplo para realizar diversas tareas en la línea de comandos de Linux:
- Buscar usuarios con shell bash:
grep 'bash$' /etc/passwd
- Extraer nombre de usuario, UID y shell de /etc/passwd:
cut -d":" -f1,3,7 /etc/passwd
- Contar cuántos usuarios tienen /bin/bash como shell:
Alternativa:cut -d":" -f7 /etc/passwd | grep '/bin/bash' | wc -l
grep -c '/bin/bash$' /etc/passwd
- Mostrar campos 2, 3 y 7 de /etc/passwd ordenados numéricamente por el campo 2 (UID):
Nota: El comando original pedía campos 2,3,7 y ordenaba por el primer campo numérico encontrado. Esta versión ordena específicamente por UID (campo 3). Si se quiere el campo 2 (contraseña encriptada, usualmente 'x'), seríacut -d":" -f1,3,7 /etc/passwd | sort -t":" -k2 -n
-k2
. Si se quiere el campo 1 (nombre), sería-k1
. El comando originalsort -n
sobrecut -f2,3,7
es ambiguo. - Añadir un nuevo usuario 'Javier' al grupo 'alumnos':
Nota: Requiere permisos de superusuario (sudo).sudo useradd -G alumnos Javier
- Cambiar el nombre de login del usuario 'Javier' a 'javi':
Nota: Requiere permisos de superusuario (sudo).sudo usermod -l javi Javier
- Eliminar al usuario 'javi' del grupo 'lp':
Nota: Requiere permisos de superusuario (sudo). El comando `gpasswd -d javi lp` también es una opción.sudo deluser javi lp
- Guardar el listado largo del directorio /home/user en un archivo:
Nota: Reemplace `/home/user` con la ruta deseada.ls -l /home/user > conectados.txt
- Contar las líneas del archivo 'conectados.txt':
wc -l conectados.txt
- Ver el manual del comando 'ifconfig' página por página:
Nota: En sistemas modernos, `ip addr` es el comando preferido sobre `ifconfig`.man ifconfig | less