A la part 1 d'aquesta sèrie recordem sobre com implementar un:
I en altres anteriors, ens Empapem de les millors pràctiques a seguir a l'hora de crear un espai ideal Script de Shell a Bash per a Linux, i molt específicament pel que fa a dissenyar un Shebang i un BSM (Bash Strict Mode / Mode Bash Estricte).
Índex
Millors pràctiques per crear un Script de Shell a GNU / Linux - Part 1
Millors pràctiques per crear un Script de Shell a GNU / Linux - Part 2
En aquesta entrada veurem com implementar un Mòdul de Variables d'Entorn per a un Script de Shell a Bash per a Linux, Prenent com a exemple un dels meus programes (aplicacions) fets en un Script de Shell anomenat Linux Post Install - Script Bicentenari 8.0, Però abans un petit resum de les millors pràctiques perquè les tinguis presents:
- Indente seu codi,
- Afegiu espais de separació entre seccions de codi,
- Comenteu el més que pugui el codi,
- Crear variables amb noms descriptius de les seves funcions,
- Utilitzeu la sintaxi VARIABLE = $ (comandament) per a la substitució d'ordres
- Utilitzeu mòduls i / o variables de: Validació de superusuari i Usuari Autoritzat amb o sense contrasenyes establertes.
- Utilitzeu mòduls i / o variables de: Validació de el Sistema Operatiu (Distro, Versió, Arquitectura, entre d'altres.),
- Utilitzeu mòduls (procediments / seccions) de confirmació d'execució d'accions (activitats / funcions) critiques o per lots,
- Proveeixi Interfícies Amigables a l'usuari (Userfriendly): Per Terminal (amb Menús i Colors usant Dialog) i / o Per Escriptori (amb Finestres usant Zenity i Gxmessage),
- Inclogui mòduls de (missatges) de Benvinguda i Comiat a l'usuari, en cas de ser necessaris,
- Inclogui un mòdul de verificació de doble execució,
- Racionalitzi la mida de l'script amb Funcions i / o Mòduls externs,
- Invoqui de forma clara i evident els cridats a altres intèrprets,
- Apliqui qualsevol altra recomanació lògica i racional que consideri necessària.
A continuació un exemple d'un Mòdul de Variables d'Entorn per a un Script de Shell a Bash per a Linux. Aquest hauria de ser el mòdul (secció) que contingui totes aquelles segures o probables variables que el Script de Shell necessita o necessitarà per a la seva execució. Jo personalment afegeixo les següents:
###############################################################################
# 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
###############################################################################
===============
Nota: Depenent que els seus requeriments o implementacions pot afegir l'ordre de comandament export meu_variable sota de cadascuna de les anteriors variables creades o crear i exportar les seves pròpies variables creades directament amb l'ordre de comanda export mi_variable = mis_parámetros
Més endavant, en futures entrades continuarem veient exemple de mòduls (seccions) que realitzin funcions com ara:
- MÒDUL DE DETECCIÓ DE DOBLE EXECUCIÓ o EXECUCIONS FALLIDES
- MÒDUL D'OPTIMITZACIÓ
- MÒDUL D'AUTORITZACIÓ D'USUARI AMB CONTRASENYA
- MÒDUL DE DETECCIÓ D'ARQUITECTURA DEL SISTEMA OPERATIU
- MÒDUL DE CONFIGURACIÓ DEL LLENGUATGE DE CODIFICACIÓ
- MÒDUL DE CONFIGURACIÓ DE PROXY PER L'AMBIENT D'EXECUCIÓ
Entre molts d'altres!
Poden anar aprenent de forma autodidacta sobre les ordres: gksu, dialog, gxmessage, zenity, espeak, play, Entre molts altres més per crear interfícies gràfiques per Terminal o per l'escriptori de l'Usuari, amb alertes sòniques o multimèdia, I anar avançant coneixements que faran servir més endavant.
Recordin que aquestes i qualsevol altres recomanacions sobre algun mòdul, funció, variable, comanda o acció en general pot dur a terme de moltes maneres, I ho aquí mostrat no és més que una senzilla manera, De les moltes maneres possibles i probables en la qual aquesta acció pot o podria ser duta a terme!
Només per a finalitzar els deixo, XNUMX Screencast realitzat per mi, Per demostrar-se que serien capaços vostès mateix, després de finalitzat aquest Curs en línia de Shell Scripting en DesdeLinux:
Screencast de Test de l'LPI-SB8
(LINUX POST INSTALL - SCRIPT BICENTENARI 8.0.0) - Part 2
2 comentaris, deixa el teu
Dóna't for humans:
echo -e «\ i [1; 32mFecha:» $ (date «+% d-% m-% Y») «\ i [1; 32m Hora:» $ (date «+% T»)
True «uname -s»:
cat / proc / sys / kernel / OSTYPE
Distro name:
cat / etc / * release | cut -F2 -d »| head -1
hostname:
cat / proc / sys / kernel / hostname
US Architecture:
[[-X / sbin / init]] && file / sbin / init | awk '{print $ 7}' | tr -d ',' || [[-X / lib / systemd / systemd]] && file / lib / systemd / systemd | awk '{print $ 7}' | tr -d ',' 2> / dev / null
Kernel Version:
cat / proc / sys / kernel / osrelease
Em va agradar molt la teva primera contribució «date for humans» ja que la sortida quedaria com a exemple:
Data: 11 Hora: 02:2016:16
La qual cosa efectivament en una finestra de dialog, zenity o gxmessage és molt digerible visualment!
Amb el teu segon suggeriment m'agradaria col·locar-la així:
if true «uname -s» && cat / proc / sys / kernel / OSTYPE; then echo «Sistema Operatiu validat»; fil | set 1d
I en fi, moltes gràcies per les teves enriquidors aportacions com sempre!