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:

  1. Buscar usuarios con shell bash:
    grep 'bash$' /etc/passwd
  2. Extraer nombre de usuario, UID y shell de /etc/passwd:
    cut -d":" -f1,3,7 /etc/passwd
  3. Contar cuántos usuarios tienen /bin/bash como shell:
    cut -d":" -f7 /etc/passwd | grep '/bin/bash' | wc -l
    Alternativa:
    grep -c '/bin/bash$' /etc/passwd
  4. Mostrar campos 2, 3 y 7 de /etc/passwd ordenados numéricamente por el campo 2 (UID):
    cut -d":" -f1,3,7 /etc/passwd | sort -t":" -k2 -n
    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ía -k2. Si se quiere el campo 1 (nombre), sería -k1. El comando original sort -n sobre cut -f2,3,7 es ambiguo.
  5. Añadir un nuevo usuario 'Javier' al grupo 'alumnos':
    sudo useradd -G alumnos Javier
    Nota: Requiere permisos de superusuario (sudo).
  6. Cambiar el nombre de login del usuario 'Javier' a 'javi':
    sudo usermod -l javi Javier
    Nota: Requiere permisos de superusuario (sudo).
  7. Eliminar al usuario 'javi' del grupo 'lp':
    sudo deluser javi lp
    Nota: Requiere permisos de superusuario (sudo). El comando `gpasswd -d javi lp` también es una opción.
  8. Guardar el listado largo del directorio /home/user en un archivo:
    ls -l /home/user > conectados.txt
    Nota: Reemplace `/home/user` con la ruta deseada.
  9. Contar las líneas del archivo 'conectados.txt':
    wc -l conectados.txt
  10. Ver el manual del comando 'ifconfig' página por página:
    man ifconfig | less
    Nota: En sistemas modernos, `ip addr` es el comando preferido sobre `ifconfig`.

Entradas relacionadas: