Construisez votre programme étape par étape en utilisant Shell Scripting - Partie 2

Sur partie 1 de cette série, nous nous rappelons comment implémenter un:

Et dans les précédents, nous nous sommes trempés les meilleures pratiques à suivre lors de la création d'un excellent Script Shell dans Bash pour Linux, et très spécifiquement en termes de conception d'un Shebang et un BSM (Bash Strict Mode / Strict Bash Mode).

Meilleures pratiques pour créer un script Shell sous GNU / Linux - Partie 1

Meilleures pratiques pour créer un script Shell sous GNU / Linux - Partie 2

Shell Scripting

Dans cet article, nous verrons comment implémenter un Module de variables d'environnement pour un script Shell dans Bash pour Linux, prenant comme exemple l'un de mes programmes (applications) faits dans un Script shell appelé Post-installation Linux - Script du bicentenaire 8.0, mais d'abord un petit résumé de la les meilleures pratiques pour que vous les gardiez à l'esprit:

  • Indente votre code,
  • Ajouter des espaces de séparation entre les sections de code,
  • Commentez autant que vous le pouvez sur le code,
  • Créer des variables avec des noms descriptifs de leurs fonctions,
  • Utilisez la syntaxe VARIABLE = $ (commande) pour la substitution de commande
  • Utilisez des modules et / ou des variables de: Superutilisateur et validation d'utilisateur autorisé avec ou sans mots de passe établis.
  • Utiliser des modules et / ou des variables de: Validation du système d'exploitation (Distro, Version, Architecture, entre autres.),
  • Utiliser des modules (procédures / sections) pour confirmer l'exécution d'actions critiques ou batch (activités / fonctions),
  • Fournir des interfaces conviviales (conviviales): par terminal (avec menus et couleurs utilisant Dialog) et / ou par bureau (avec Windows utilisant Zenity et Gxmessage),
  • Inclure des modules de bienvenue et d'adieu (messages) à l'utilisateur, si nécessaire,
  • Inclure un module de vérification de la double exécution,
  • Rationaliser la taille du script avec des fonctions externes et / ou des modules,
  • Invoquer de manière claire et évidente les appels à d'autres interprètes,
  • Appliquez toute autre recommandation logique et rationnelle que vous jugez nécessaire.

Voici un exemple de Module de variables d'environnement pour un script Shell dans Bash pour Linux. Ce doit être le module (section) qui contient toutes ces variables certaines ou probables que le Script shell a besoin ou aura besoin pour son exécution. J'ajoute personnellement ce qui suit:


###############################################################################
# INICIO DEL MODULO DE VARIABLES DE ENTORNO DEL SCRIPT
###############################################################################

NOM_SCRIPT=lpi_sb8_inicio_2016.sh
# echo $NOM_SCRIPT
# Almacenar como una variable predeterminada el Nombre real del Script

USR1_VALID=sysadmin
# echo $USR1_VALID
# Almacenar como una variable predeterminada el Nombre de Usuario valido que podrá ejecutar el Script.
# Haga una variable por cada Usuario Autorizado.

PASSWD_VALID=lpi*sb8
# echo $PASSWD_VALID
# Almacenar como una variable predeterminada el Nombre de la contraseña valida que permitirá ejecutar el Script.
# Haga una variable por cada contraseña de cada Usuario Autorizado.

S_O_VALID=kali
# echo $S_O_VALID
# Almacenar como una variable predeterminada el tipo de Sistema operativo valido para donde debe ser ejecutado el Script.

HOST_VALID=hostmovil-sysadmin
# echo $HOST_VALID
# Almacenar como una variable predeterminada el nombre del host valido donde debe ser ejecutado el Script.

IP_VALID=192.168.1.107
# echo $IP_VALID
# Almacenar como una variable predeterminada el nombre del host valido donde debe ser ejecutado el Script.

MAC_VALID=44:8a:5b:f0:3d:f3
# echo $MAC_VALID
# Almacenar como una variable predeterminada el nombre del host valido donde debe ser ejecutado el Script.

FILE_LOCK=lpi_sb_file_lock.txt
# echo $FILE_LOCK
# Almacenar el nombre de archivo predeterminada por el sistema para evitar doble ejecuciones ó detectar ejecuciones fallidas.

IDSUPERUSER=$(id -u | awk '{print $1}')
# IDSUPERUSER=$(echo $UID)
# IDSUPERUSER=$(getent passwd $USER | cut -d: -f3)
# echo $IDSUPERUSER
# Almacenar IUD del Superusuario root

USER_NAME_1=$(cat /etc/passwd | grep 1000 | cut -d: -f1 | awk '{print $1}')
HOME_USER_NAME_1=/home/$USER_NAME_1
# echo $USER_NAME_1 $HOME_USER_NAME_1
# Almacenar el nombre del usuario 1000 y su /home. Probable unico y primer Usuario del Sistema.

USER_NAME_2=$(cat /etc/passwd | grep 1001 | cut -d: -f1 | sed -n '2p' | awk '{print $1}')
HOME_USER_NAME_2=/home/$USER_NAME_2
# echo $USER_NAME_2 $HOME_USER_NAME_2
# Almacenar el nombre del usuario 1001 y su /home. Probable segundo Usuario del Sistema.

ID_USERNAME_SESSION=$(for i in $(who | sed 1q | cut -c 1-8); do grep $i /etc/passwd | awk '{print "\t" $1}' | tr -d '[A-Za-z]' | sed 's/::x*//' | cut -c 1-5 | awk '{print $1}' ; done | sed 1q)
# echo $ID_USERNAME_SESSION
# Almacenar el ID del Nombre del primer usuario (alfabeticamente) detectado conectado (con sesión abierta) en el sistema.

USERNAME_ID_SESSION=$(for i in $(who | sed 1q | cut -c 1-8); do grep $i /etc/passwd | awk '{print "\t" $1}' | tr -d '[A-Za-z]' | sed 's/::x*//' | cut -c 1-5 | awk '{print $2}' ; done ; echo $i)
# echo $USERNAME_ID_SESSION
# Almacenar el Nombre del primer usuario (alfabeticamente) detectado conectado (con sesión abierta) en el sistema.

# ID_FIRST_USERNAME=$(for i in 1000 1001 1002 1003 1004; do grep $i /etc/passwd | awk '{print "\t" $1}' | tr -d '[A-Za-z]' | sed 's/::x*//' | cut -c 1-5 | awk '{print $1}' ; done | sed -n '1p')
# echo $ID_FIRST_USERNAME
# Almacenar el ID del Nombre del primer usuario creado en el sistema entre los ID del 1000 al 1005.
# Nota: Solo funciona con la opción -o desactivada del MODO BASH ESTRICTO ó SEGURO (Bash Strict Mode / BSM)

# ID_FIRST_USERNAME=$(for i in $(seq 1000 1999); do grep $i /etc/passwd | awk '{print "\t" $1}' | tr -d '[A-Za-z]' | sed 's/::x*//' | cut -c 1-5 | awk '{print $1}' ; done | sed -n '1p')
# echo $ID_FIRST_USERNAME
# Almacenar el ID del Nombre del primer usuario creado en el sistema.
# Nota: Solo funciona con la opción -o desactivada del MODO BASH ESTRICTO ó SEGURO (Bash Strict Mode / BSM)

UBICACION=$(echo $PWD)
# UBICACION=$(pwd)
# echo $UBICACION
# Almacenar ruta de ejecución del Script LPI-SB

FECHA_SISTEMA_AN=$(date +"%d %b %y")
# echo $FECHA_SISTEMA_AN
# Almacenar la fecha  Alfanumerica actual del Equipo

FECHA_SISTEMA_N=$(date +"%d %m %y")
# echo $FECHA_SISTEMA_N
# Almacenar la fecha Numerica actual del Equipo

DIA_ACTUAL=$(date +"%d")
# echo $DIA_ACTUAL
# Almacenar el día actual del Equipo

MES_ACTUAL_A=$(date +"%b")
# echo $MES_ACTUAL_A
# Almacenar el mes alfabetico actual del Equipo

MES_ACTUAL_N=$(date +"%m")
# echo $MES_ACTUAL_N
# Almacenarel mes numerico actual del Equipo

ANO_ACTUAL_2C=$(date +"%y")
# echo $ANO_ACTUAL_2C
# Almacenar el año (con 2 cifras) actual del Equipo

ANO_ACTUAL_4C=$(date +"%Y")
# echo $ANO_ACTUAL_4C
# Almacenar el año (con 4 cifras) actual del Equipo

HORA_SISTEMA=$(date +"%H:%M")
# echo $HORA_SISTEMA
# Almacenar la Hora actual del Equipo

HORA_ACTUAL=$(date +"%H")
# echo $HORA_ACTUAL
# Almacenar la Hora actual del Equipo

MINUTOS_ACTUAL=$(date +"%M")
# echo $MINUTOS_ACTUAL
# Almacenar la Hora actual del Equipo

TIPO_S_O_L=$(uname -o)
# echo $TIPO_S_O_L
# Almacena el nombre largo del tipo de Sistema Operativo encontrado.

TIPO_S_O_C=$(uname -s)
# echo $TIPO_S_O_C
# Almacena el nombre corto del tipo de Sistema Operativo encontrado.

NOM_DISTRO_L=$(cat /etc/os-release | grep NAME | grep -v "VERSION" | sed -n '2p' | cut -f2 -d\")
# NOM_DISTRO_L=$(lsb_release -d | sed 's/Description://')
# echo $NOM_DISTRO_L
# Almacena el nombre largo de la Distro detectada.

NOM_DISTRO_C=$(cat /etc/os-release | grep NAME | grep -v "VERSION" | sed -n '2p' | cut -f2 -d\" | awk '{print $1}')
# NOM_DISTRO_C=$(lsb_release -d | sed 's/Description://' | awk '{print $1}')
# echo $NOM_DISTRO_C
# Almacena el nombre corto de la Distro detectada.

ID_DISTRO=$(cat /etc/os-release | grep ID | grep -v "VERSION_ID" | grep -v "ID_LIKE" | sed 's/ID=//' | sed 's/"//g')
# ID_DISTRO=$(lsb_release -i | awk '{print $3}')
# echo $ID_DISTRO
# Almacena el ID de la Distro detectada.

VER_DISTRO=$(cat /etc/os-release | grep VERSION= | sed -n '1p' | sed 's/VERSION=//' | sed 's/"//g')
# VER_DISTRO=$(lsb_release -c | sed 's/Codename://')
# echo $VER_DISTRO
# Almacena el nombre de la versión de la Distro detectada.

ID_VER_DISTRO=$(cat /etc/os-release | grep VERSION_ID= | sed -n '1p' | sed 's/VERSION_ID=//' | sed 's/"//g')
# ID_VER_DISTRO=$(lsb_release -r | sed 's/Release://')
# echo $ID_VER_DISTRO
# Almacena el ID de la versión de la Distro detectada.

ARQ_DISTRO_COD=$(uname -m)
# echo $ARQ_DISTRO_COD
# Almacenar el Tipo de Arquitectura de la Distro detectada en forma codificada.

ARQ_DISTRO_COD=$(uname -m) ; if [[ "$ARQ_DISTRO_COD" = "x86" ]]; then ARQ_DISTRO_HUM=32; else ARQ_DISTRO_HUM=64; fi
# echo $ARQ_DISTRO_HUM
# Convertir el Tipo de Arquitectura de la Distro detectada en forma codificada a forma humana.

VER_KERNEL=$(uname -r)
# echo $VER_KERNEL
# Almacenar el Nombre del Arquitectura de la Distro detectada.

NOM_HOST=$(cat /etc/hostname)
# echo $NOM_HOST
# Almacenar el Nombre del Host donde se ejecuta el Script.

IP_ETH0=$(ifconfig eth0 | grep inet | grep -v inet6 | cut -d ":" -f 2 | cut -d " " -f 1)
MAC_ETH0=$(ifconfig eth0 | sed -n '1p' | awk '{print $5}')
# IP_INTERNA=$(hostname -I)
# echo $IP_ETH0 $MAC_ETH0
# Almacenar la IP / MAC del Host donde se ejecuta el Script.

echo "Variables de entorno cargadas sin errores, en 5 segundos la aplicación continuará ejecutandose"
sleep 5

###############################################################################
# FINAL DEL MODULO DE VARIABLES DE ENTORNO DEL SCRIPT
###############################################################################

===============

Observation: En fonction de vos besoins ou implémentations, vous pouvez ajouter la commande command exporter ma_variable sous chacune des variables précédentes créées ou créez et exportez vos propres variables créées directement avec la commande commande export ma_variable = mes_paramètres

Plus tard, dans les prochains articles, nous continuerons de voir un exemple de modules (sections) qui exécutent des fonctions telles que:

  • MODULE DE DETECTION DE DOUBLE EXECUTION ou ECHEC DE L'EXECUTION
  • MODULE D'OPTIMISATION
  • MODULE D'AUTORISATION D'UTILISATEUR AVEC MOT DE PASSE
  • MODULE DE DÉTECTION DE L'ARCHITECTURE DU SYSTÈME D'EXPLOITATION
  • MODULE DE CONFIGURATION DE LA LANGUE DE CODAGE
  • MODULE DE CONFIGURATION DE PROXY POUR L'ENVIRONNEMENT D'EXÉCUTION

Parmi beaucoup d'autres!

Ils peuvent devenir autodidactes sur les commandes: gksu, dialogue, gxmessage, zénité, espeak, jouer, parmi beaucoup d'autres pour créer des interfaces graphiques par Terminal ou pour le bureau de l'utilisateur, avec alertes sonores ou multimédia, et avancez les connaissances qu'ils utiliseront plus tard.

N'oubliez pas que ces recommandations et toutes les autres sur certains module, fonction, variable, commande ou action en général, il peut être effectué plusieurs façons, et ce qui est montré ici n'est qu'un façon simple, De l' de nombreuses façons possibles et probables dans lequel dit l'action peut ou pourrait être effectuée!

Juste pour finir je te laisse, un Screencast fait par moi, pour vous montrer de quoi vous seriez capable, après avoir terminé Cours en ligne sur les scripts Shell en DesdeLinux:

ScreenCast de test LPI-SB8

(LINUX POST INSTALL - BICENTENNIAL SCRIPT 8.0.0) - Partie 2


Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont marqués avec *

*

*

  1. Responsable des données: Miguel Ángel Gatón
  2. Finalité des données: Contrôle du SPAM, gestion des commentaires.
  3. Légitimation: votre consentement
  4. Communication des données: Les données ne seront pas communiquées à des tiers sauf obligation légale.
  5. Stockage des données: base de données hébergée par Occentus Networks (EU)
  6. Droits: à tout moment, vous pouvez limiter, récupérer et supprimer vos informations.

  1.   sans nom dit

    Date pour les humains:
    echo -e «\ e [1; 32mDate:» $ (date «+% d-% m-% Y») «\ e [1; 32m Heure:» $ (date «+% T»)

    Vrai "uname -s":
    cat / proc / sys / kernel / ostype

    Nom de la distribution:
    cat / etc / * release | couper -f2 -d »| tête -1

    Nom d'hôte:
    cat / proc / sys / kernel / nom d'hôte

    Architecture du système d'exploitation:
    [[-x / sbin / init]] && fichier / sbin / init | awk '{imprimer $ 7}' | tr -d ',' || [[-x / lib / systemd / systemd]] && fichier / lib / systemd / systemd | awk '{imprimer $ 7}' | tr -d ',' 2> / dev / null

    Version du noyau:
    cat / proc / sys / kernel / osrelease

  2.   Ing. José Albert dit

    J'ai beaucoup aimé votre première contribution "date pour les humains" puisque la sortie serait à titre d'exemple:

    Date: 11-02-2016 Heure: 16:04:10

    Ce qui effectivement dans une fenêtre de dialogue, zenity ou gxmessage est très digeste visuellement!

    Avec votre deuxième suggestion, je voudrais le placer comme ceci:

    si vrai "uname -s" && cat / proc / sys / kernel / ostype; puis echo "Système d'exploitation validé"; fi | soif 1j

    Et enfin, merci beaucoup pour vos contributions enrichissantes comme toujours!