Scripts shell útils en qualsevol programa

Bash és un programa informàtic que té la funció interpretar ordres. Està basat en la shell de Unix i va ser escrit per al projecte GNU sent l'intèrpret d'ordres per defecte en la majoria de les distribucions de GNU / Linux. El seu nom és un acrònim de Bourne-Again Shell (Un altre shell bourne), Fent un joc de paraules (Born-again significa renaixement) sobre el Bourne shell (sh), Que va ser un dels primers intèrprets importants d'Unix.

Avui anem a mostrar alguns scripts de shell que poden ser de gran utilitat per als desenvolupadors. La majoria funcionen en qualsevol shell de Unix, Encara que alguns requereixen que siguin executats específicament per Bash.

Evitar que usuaris sense privilegis executin l'script

Alguns scripts realitzen tasques administratives per la qual cosa podríem voler que només l'usuari root executi l'script. En aquest cas podem fer servir alguna cosa com això:

#!/bin/bash
if [[ $EUID -ne 0 ]]; then
echo "Este script debe ser ejecutado por el usuario root" 1>&2
exit 1
fi

Permetre l'execució de l'script només a un usuari específic

De manera similar a el codi anterior, podríem voler que només un usuari específic executi l'script. Ho fem així:

#!/bin/bash
AUTHORIZED_USER="usuario_permitido"
if [ $USER != $AUTHORIZED_USER ]; then
echo "Este script debe ser ejecutado por el usuario $AUTHORIZED_USER" 1>&2
exit 1
fi

Verificar que un servei / procés s'està executant

Si volem saber si hi ha processos d'algun servei o programa executant-podríem fer servir aquest script (En aquest cas verifica que el dimoni de Apache estigui corrent):

#!/bin/sh
SERVICE='httpd'
if ps ax | grep -v grep | grep $SERVICE > /dev/null
then
echo "El servicio $SERVICE esta ejecutandose"
else
echo "Chanfle! El servicio $SERVICE esta detenido"
fi

Crear un arxiu de bloqueig

A vegades hem d'assegurar que l'script no s'executi dues o més vegades simultànies. Per a això podem fer ús dels arxius de bloqueig. Aquesta és una versió senzilla d'un script que ens permet fer això:

#!/bin/bash
lockfile=/var/lock/loquesea.lock
if [ ! -e $lockfile ]; then
touch $lockfile
echo "hago muchas cosas importantes aqui"
rm $lockfile
else
echo "ya hay otro proceso corriendo"
fi

En aquest cas, es verifica que l'arxiu loquesea.lock existeixi. En el cas que existeixi, l'script NO executa les seves tasques. Si no existeix, crea l'arxiu, executa les tasques que hagi d'executar i l'elimina. Però, això no és d'el tot fiable. Què passaria si mentre el nostre script s'està executant és tancat abruptament?

En aquest cas l'arxiu de bloqueig no s'esborraria, i per tant, no ens permetria executar l'script de nou. Per cobrir aquests casos, podríem fer ús de la comanda trap que ens permet executar ordres en cas que el nostre script acabi de manera inesperada. Aquesta és una versió més avançada que a més guarda dins de l'arxiu de bloqueig el PID de l'script que l'executa:

#!/bin/bash
lockfile=/var/lock/loquesea.lock
if ( set -o noclobber; echo "$$" > "$lockfile") 2> /dev/null;
then
trap 'rm -f "$lockfile"; exit $?' INT TERM EXIT
echo "hago muchas cosas aqui tranquilamente"
rm -f "$lockfile"
trap - INT TERM EXIT
else
echo "Ya hay otro proceso de este script ejecutandose"
echo "corriendo con el PID: $(cat $lockfile)"
fi

Entenguem una mica millor la comanda trampa. La sintaxi de la mateixa és bàsicament aquesta: trap comandament signal [signal ...]; on signal és el senyal de terminació que vols atrapar. Si vols veure una llista dels signals disponibles pots executar la comanda kill -l. Per al cas anterior es van usar els signals INT (Captura la terminació produïda per un Ctrl + c), TERM (Terminació produïda pel comando kill) i EXIT (Terminació normal d'un script, bé sigui perquè ja no hi ha més línies que executar o perquè es troba amb la comanda exit).

Menú d'opcions

Per fer un menú a on permetem a l'usuari seleccionar una sèrie d'opcions podem fer servir el següent esquema:

#!/bin/bash
clear
while :
do
echo " Escoja una opcion "
echo "1. quien soy?"
echo "2. cuanto espacio tengo"
echo "3. que es esto?"
echo "4. Salir"
echo -n "Seleccione una opcion [1 - 4]"
read opcion
case $opcion in
1) echo "este eres:";
whoami;;
2) echo "tienes esto";
df;;
3) uname -r;;
4) echo "chao";
exit 1;;
*) echo "$opc es una opcion invalida. Es tan dificil?";
echo "Presiona una tecla para continuar...";
read foo;;
esac
done

Demana confirmació abans d'executar un script

De vegades és útil fer que l'usuari confirmi l'execució d'un lot de sentències, és a dir, el típic missatge que demana a l'usuari escriure yes o no. Això ho podem fer així:

#!/bin/bash
while true; do
echo
read -p "esta seguro de hacer lo que sea que vaya a hacer " yn
case $yn in
yes ) break;;
no ) exit;;
* ) echo "por favor responda yes o no";;
esac
done
echo "si se ejecuta esto es que aceptaste"

Fi de l'article. Senzillament genial 😀

edito: Cal anar amb compte amb els espais i tabulacions, que per algun motiu, no m'estan sortint ¬¬


El contingut d'l'article s'adhereix als nostres principis de ètica editorial. Per notificar un error punxa http://secbcaixabank.info/SECB-COVIDXNUMX-DENUNCIA-INSPECCION-PROTOCOLO-.pdf.

22 comentaris, deixa el teu

Deixa el teu comentari

La seva adreça de correu electrònic no es publicarà. Els camps obligatoris estan marcats amb *

*

*

  1. Responsable de les dades: Miguel Ángel Gatón
  2. Finalitat de les dades: Controlar l'SPAM, gestió de comentaris.
  3. Legitimació: El teu consentiment
  4. Comunicació de les dades: No es comunicaran les dades a tercers excepte per obligació legal.
  5. Emmagatzematge de les dades: Base de dades allotjada en Occentus Networks (UE)
  6. Drets: En qualsevol moment pots limitar, recuperar i esborrar la teva informació.

  1.   KZKG ^ Gaara va dir

    Fotre estan genials O_O ... ajudarà un munt als meus cosetes que faig en Bash 😀

  2.   ren434 va dir

    Estan super els scripts! Que gran aportació en serio¡ just el que estava buscant.

    PD: El fòrum aquesta caigut.

    1.    KZKG ^ Gaara va dir

      Sí, el servidor on està muntat el fòrum està offline, ni idea del per què ... li vam escriure un correu electrònic a l'amic que s'encarrega d'això, a veure què ens respon 🙂

      Salutacions.

  3.   ren434 va dir

    Ah bé esperem que no sigui res greu.

  4.   esquerrà va dir

    ¿Aquest «chanfle» també estava inclòs en Code Ninja? XD

  5.   taregon va dir

    M'agrada el poder de l'bash 😉 i això que em deien que perquè servia el llenguatge C ..., ja que en shell script hi ha molts ordres familiars.

  6.   Christopher va dir

    Gràcies, em van agradar molt

  7.   angelblade va dir

    La validació dels paràmetres d'entrada és molt útil. No sabia com fer els menús =)

  8.   Hyuuga_Neji va dir

    Genial .... ara puc donar-li una mica de «duresa» als meus xurros de scripts jejeje

  9.   corb va dir

    Un gran gust veure com el nostre humil treball en CodeNinja serveix d'alguna cosa a la comunitat internacional de linux

    1.    KZKG ^ Gaara va dir

      És clar! 🙂
      Tot sigui per ajudar i aportar entre tots, i no per crear flames o no? 😉

  10.   Diego va dir

    L'script de procés que aquesta corrent podries millorar-una mica posant l'opció per triar el procés de el qual queres saber, quedaria una cosa així:

    #! / Bin / bash
    trobo «Tria un servei»
    read SERVICE
    # SERVICE = 'mysql'
    if ps ax | grep -v grep | grep $ SERVICE> / dev / null
    llavors
    trobo «El servei $ SERVICE aquesta executant-»
    else
    trobo «El servei $ SERVICE aquesta detingut»

  11.   Jua Carlos C va dir

    Molt pràctic seus scripts, però estic buscant un script especialment per resoldre un problema que tinc que és el següent: Tenim a la Companyia un servidor d'aplicacions que els usuaris interns accedeixen a el per telnet, i executen una aplicació especialment que aquesta limitat per llicències, els usuaris abusen i obren mes d'un telnet per apoderar de 2 o mes llicències, llavors l'script que he pensat és que per algun mètode revisi que procés telnet aquesta inactiu per més de 2 hores i per tant envii un kill a aquest pid, em podria ajudar?

    1.    Diego va dir

      Instal·la el següent programa

      aptitude install Autolog

      I l'arxiu de configuració del tenes a /etc/autolog.conf

  12.   Tito va dir

    Genial, amic, puc fer-te una consulta, necessito un script shell amb opcions i ho he basat en el teu i va genial, però una de les opcions ha d'enviar correus (usant postifix), demana per pantalla assumpte, text i destinataris i el envia i comprova que s'enviï correctament, amb el mailq puc veure la cua i veure si es enviament, ¿però com enviament dels correus per comandament usant les variables que van rebre assumpte, text i destinataris? 🙁

    1.    KZKG ^ Gaara va dir

      Escriu-me al meu email (kzkggaara [at] desdelinux [dot] net) per parlar amb més calma, t'ajudo amb molt de gust 🙂

      1.    Tito va dir

        Genial gràcies amic, et vas passar!

  13.   Fer va dir

    Hola, bon.
    M'he encontardo amb aquests excel·lents exemples just quan necessitava un menú.
    M'he posat a això i no aconsegueixo fer-ho funcionar (en els passos previs).
    Tinc 247 elements, que es refiren als diferents dominis territorials.
    El que necessito és un menors des d'on escollir el pais:
    #! / Bin / bash
    clear
    while:
    do
    trobo »Esculli el país tractar»
    trobo «1. Afganistan (AF) »
    trobo «2. Albània (A EL) »
    trobo «3. Alemanya (DE) »
    trobo «5. Angola (AO) »
    trobo «6. Anguilla (AI) »
    .. i contínua fins a 247

    echo -n «Seleccioneu una opció [1 - 247]»
    read opcio
    casi $ opcio in
    1) trobo «aquest ets:»; whoami ;;
    2) trobo «tens això»; df ;;
    3) trobo «»; uname -r ;;
    4) trobo «chao»; exit 1 ;;
    5) trobo «aquest ets:»; whoami ;;
    6) trobo «aquest ets:»; whoami ;;
    ... i contínua fins a 247
    *) Echo "$ opc és una opció invàlida. És tan difícil? »;
    trobo «Prem una tecla per continuar ...»;
    read foo ;;
    esac
    fet

    El comportament és el següent:
    Qualsevol opció menys la 4, que és la sortida esborra el nombre introduït i es queda a l'espera d'un nou número.
    A l'ficar 4 surt.
    Si poso el codi de el 4 en qualsevol altra línia (diguem la 150) surt igualment sense problemes.
    També he provat a posar el codi amb aquest format:
    151) trobo «aquest ets:»;
    whoami ;;
    amb idèntic resultat.
    Em pregunto si per a un menu tan llarg hi ha millors opcions i per descomptat també que estic fent malament.
    Una ajuda seria molt agraïda, gràcies

  14.   només Raul va dir

    excel·lent ... em sembla molt bo per endinsar-se en les shell

    gràcies

  15.   marcs va dir

    genial, escolta com puc fer que el meu bash treballi amb un arxiu
    exemple:

    upload.sh fotodelavecina.jpg

    pensant que el meu script en bash «upload.sh» té la informació d'accés al meu ftp

    salutacions i gràcies 😀

  16.   Netzulo NTX va dir

    Bua tio, moltíssimes gràcies per tots els scripts, he muntat un servidor CentOS i no sabeslo bé que em vénen aquestes plantilles, si us plau, contacta amb mi per email. Que vull proposar-te una cosa

  17.   Gabriel Balderramos va dir

    Perquè fas servir read foo quan aquesta fent un menu? reposades ràpida necessito