Bouw uw programma stap voor stap met Shell Scripting - Deel 2

In de deel 1 van deze serie onthouden we hoe we een:

En in vorige hebben we onszelf gedrenkt in de betere praktijken te volgen bij het maken van een excellent Shell-script in Bash voor Linux, en heel specifiek in termen van het ontwerpen van een Shebang en een BSM (Bash Strict Mode / Strict Bash Mode).

Best practices voor het maken van een Shell-script in GNU / Linux - Deel 1

Best practices voor het maken van een Shell-script in GNU / Linux - Deel 2

Shell-scripts

In dit bericht zullen we zien hoe we een Omgevingsvariabelenmodule voor een shellscript in Bash voor Linux, als voorbeeld een van mijn programma's (applicaties) feiten in een Shell-script riep Linux Post Install - Bicentennial Script 8.0, maar eerst een kleine samenvatting van de betere praktijken zodat u ze in gedachten houdt:

  • Indenteer uw code,
  • Voeg scheidingsruimten toe tussen secties code,
  • Geef zoveel mogelijk commentaar op de code,
  • Maak variabelen met beschrijvende namen van hun functies,
  • Gebruik de syntaxis VARIABLE = $ (opdracht) voor opdrachtvervanging
  • Gebruik modules en/of variabelen van: Validatie van Superuser en Authorized User met of zonder vastgestelde wachtwoorden.
  • Gebruik modules en/of variabelen van: Validatie van het besturingssysteem (o.a. Distro, Versie, Architectuur),
  • Gebruik modules (procedures / secties) om de uitvoering van kritieke of batch-acties (activiteiten / functies) te bevestigen,
  • Zorg voor gebruiksvriendelijke interfaces: via terminal (met menu's en kleuren via dialoogvenster) en/of via desktop (met Windows via Zenity en Gxmessage),
  • Voeg modules van Welkom en Afscheid (berichten) toe aan de gebruiker, indien nodig,
  • Voeg een verificatiemodule voor dubbele uitvoering toe,
  • Rationaliseer de scriptgrootte met externe functies en / of modules,
  • Roep op een duidelijke en duidelijke manier de oproepen op naar andere tolken,
  • Pas elke andere logische en rationele aanbeveling toe die u nodig acht.

Hier is een voorbeeld van een Omgevingsvariabelenmodule voor een shellscript in Bash voor Linux. Dit zou de module (sectie) moeten zijn die al die bepaalde of waarschijnlijke variabelen bevat die de Shell-script nodig heeft of zal nodig hebben voor de uitvoering ervan. Persoonlijk voeg ik het volgende toe:


###############################################################################
# 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
###############################################################################

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

Opmerking: Afhankelijk van uw vereisten of implementaties kunt u het commando commando toevoegen exporteer my_variable onder elk van de hierboven gemaakte variabelen of maak en exporteer uw eigen gemaakte variabelen rechtstreeks met de opdrachtopdracht exporteer my_variable = my_parameters

Later zullen we in toekomstige berichten een voorbeeld blijven zien van modules (secties) die functies uitvoeren zoals:

  • DUBBELE UITVOERINGSDETECTIEMODULE of MISLUKTE UITVOERING
  • OPTIMALISATIEMODULE
  • GEBRUIKERSAUTORISATIEMODULE MET WACHTWOORD
  • MODULE VOOR DETECTIE VAN DE ARCHITECTUUR VAN HET BESTURINGSSYSTEEM
  • CODERING TAALCONFIGURATIEMODULE
  • PROXY CONFIGURATIEMODULE VOOR DE UITVOERINGSOMGEVING

Onder vele anderen!

Ze kunnen autodidact worden over de commando's: gksu, dialoog, gxmessage, zenity, espeak, play, onder vele anderen om grafische interfaces te creëren per terminal of voor het bureaublad van de gebruiker, met sonische of multimedia-waarschuwingen, en voorkennis die ze later zullen gebruiken.

Onthoud dat deze en andere aanbevelingen voor sommige module, functie, variabele, commando of actie in het algemeen kan het worden uitgevoerd vele manieren, en wat hier wordt getoond is niets meer dan een simpele weg, Van de vele mogelijke en waarschijnlijke manieren waarin gezegd actie kan of zou kunnen worden uitgevoerd!

Om het af te maken verlaat ik je, a Screencast gemaakt door mij, om u te laten zien waartoe u in staat zou zijn, nadat u dit hebt voltooid Shell Scripting online cursus in DesdeLinux:

LPI-SB8 Test ScreenCast

(LINUX POST INSTALLEREN - BICENTENNIAL SCRIPT 8.0.0) - Deel 2


Laat je reactie achter

Uw e-mailadres wordt niet gepubliceerd. Verplichte velden zijn gemarkeerd met *

*

*

  1. Verantwoordelijk voor de gegevens: Miguel Ángel Gatón
  2. Doel van de gegevens: Controle SPAM, commentaarbeheer.
  3. Legitimatie: uw toestemming
  4. Mededeling van de gegevens: De gegevens worden niet aan derden meegedeeld, behalve op grond van wettelijke verplichting.
  5. Gegevensopslag: database gehost door Occentus Networks (EU)
  6. Rechten: u kunt uw gegevens op elk moment beperken, herstellen en verwijderen.

  1.   naamloos zei

    Datum voor mensen:
    echo -e "\e[1;32mDatum:" $(datum "+%d-%m-%Y") "\e[1;32m Tijd:" $(datum "+%T")

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

    Distro naam:
    cat / etc / * release | cut -f2 -d »| hoofd -1

    Hostnaam:
    cat / proc / sys / kernel / hostnaam

    OS-architectuur:
    [[ -x /sbin/init ]] && bestand /sbin/init | awk '{print $7}' | tr -d ',' || [[ -x /lib/systemd/systemd ]] && bestand /lib/systemd/systemd | awk '{print $7}' | tr -d ',' 2> /dev/null

    Kernel-versie:
    cat / proc / sys / kernel / osrelease

  2.   José Albert zei

    Ik vond je eerste bijdrage "date voor mensen" erg leuk, aangezien de output als voorbeeld zou zijn:

    Datum: 11-02-2016 Tijd: 16:04:10

    Wat effectief in een dialoogvenster, zenity of gxmessage-venster zeer visueel verteerbaar is!

    Met je tweede suggestie zou ik het als volgt willen plaatsen:

    indien waar "uname -s" && cat /proc/sys/kernel/ostype; echo dan "Gevalideerd besturingssysteem"; fi | dorst 1d

    En tot slot hartelijk dank voor uw verrijkende bijdragen, zoals altijd!