Utili script di shell in qualsiasi programma

Bash È un programma per computer la cui funzione è interpretare gli ordini. Si basa sulla shell di Unix ed è stato scritto per il progetto GNU essendo la shell predefinita nella maggior parte delle distribuzioni di GNU / Linux. Il suo nome è l'acronimo di Bourne-Ancora Shell (un altro Shell Bourne), facendo un gioco di parole (nato di nuovo significa rinascita) su Guscio Bourne (sh), che è stato uno dei primi grandi interpreti di Unix.

Oggi mostreremo alcuni script di shell che possono essere molto utili per gli sviluppatori. La maggior parte funziona in qualsiasi shell Unix, sebbene alcuni richiedano che vengano eseguiti specificamente da Bash.

Impedisci agli utenti non privilegiati di eseguire lo script

Alcuni script eseguono attività amministrative, quindi potremmo desiderare che solo l'utente root esegua lo script. In tal caso possiamo usare qualcosa del genere:

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

Consenti l'esecuzione dello script solo a un utente specifico

Simile al codice sopra, potremmo desiderare che solo un utente specifico esegua lo script. Lo facciamo così:

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

Verificare che un servizio / processo sia in esecuzione

Se vogliamo sapere se ci sono processi di qualsiasi servizio o programma in esecuzione, potremmo usare questo script (in questo caso verifica che il demone di Apache sta correndo):

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

Crea un file di blocco

A volte dobbiamo assicurarci che lo script non venga eseguito due o più volte contemporaneamente. Per questo possiamo utilizzare i file di blocco. Questa è una semplice versione di uno script che ci permette di fare questo:

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

In questo caso, viene verificato che il file qualunque. blocco esistere. Nel caso esista, lo script NON esegue i suoi compiti. Se non esiste, crea il file, esegue le attività che deve eseguire e lo rimuove. Ma questo non è del tutto affidabile. Cosa succederebbe se mentre il nostro script è in esecuzione, viene chiuso bruscamente?

In tal caso il file di blocco non verrebbe cancellato e quindi non ci consentirebbe di eseguire nuovamente lo script. Per coprire questi casi, potremmo utilizzare il comando trap che ci consente di eseguire comandi nel caso in cui il nostro script termini in modo imprevisto. Questa è una versione più avanzata che salva anche il PID dello script che lo esegue all'interno del file di blocco:

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

Comprendiamo un po 'meglio il comando trappola. La sua sintassi è fondamentalmente questa: trap command signal [signal…]; dove signal è il segnale di terminazione che si desidera catturare. Se vuoi vedere un elenco di segnali disponibili puoi eseguire il comando kill -l. Per il caso precedente sono stati utilizzati i segnali INT (cattura la terminazione prodotta da un Ctrl + c), TERMINE (terminazione prodotta dal comando kill) ed ESCI (normale terminazione di uno script, o perché non ci sono più righe da eseguire o perché incontra il comando exit).

Menu Opzioni

Per creare un menu in cui permettiamo all'utente di selezionare una serie di opzioni possiamo utilizzare il seguente schema:

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

Chiedi conferma prima di eseguire uno script

A volte è utile che l'utente confermi l'esecuzione di un batch di istruzioni, ovvero il tipico messaggio che chiede all'utente di digitare sì o no. Possiamo farlo in questo modo:

#!/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"

Fine dell'articolo. Semplicemente fantastico?

Editoriale: Devi stare attento a spazi e tabulazioni, che per qualche motivo non escono ¬¬


Lascia un tuo commento

L'indirizzo email non verrà pubblicato. I campi obbligatori sono contrassegnati con *

*

*

  1. Responsabile dei dati: Miguel Ángel Gatón
  2. Scopo dei dati: controllo SPAM, gestione commenti.
  3. Legittimazione: il tuo consenso
  4. Comunicazione dei dati: I dati non saranno oggetto di comunicazione a terzi se non per obbligo di legge.
  5. Archiviazione dati: database ospitato da Occentus Networks (UE)
  6. Diritti: in qualsiasi momento puoi limitare, recuperare ed eliminare le tue informazioni.

  1.   KZKG ^ Gaara suddetto

    Cazzo sono fantastici O_O ... aiuterà molto le mie piccole cose che faccio a Bash 😀

  2.   ren434 suddetto

    Le sceneggiature sono super! Che grande contributo sul serio, proprio quello che stavo cercando.

    PS: il forum è inattivo.

    1.    KZKG ^ Gaara suddetto

      Sì, il server su cui è montato il forum è offline, non ho idea del perché ... abbiamo scritto una mail all'amico che se ne occupa, per vedere cosa ci risponde 🙂

      Saluti.

  3.   ren434 suddetto

    Ah beh, speriamo non sia niente di grave.

  4.   mancino suddetto

    Quella "pula" era inclusa anche in Code Ninja? XD

  5.   targon suddetto

    Mi piace la potenza di bash 😉 e mi hanno detto a cosa serviva il linguaggio C ... beh, nello script di shell ci sono molti comandi familiari.

  6.   Christopher suddetto

    Grazie, mi è davvero piaciuto

  7.   lama d'angelo suddetto

    La convalida dei parametri di input è molto utile. Non sapevo come fare i menu =)

  8.   Hyuga_Neji suddetto

    Brillante…. ora posso dare un po 'di "durezza" al mio script churros lol

  9.   Corvo suddetto

    Un grande piacere vedere come il nostro umile lavoro in CodeNinja serve la comunità internazionale di Linux

    1.    KZKG ^ Gaara suddetto

      Sicuro! 🙂
      Tutto è per aiutare e contribuire insieme, e non per creare fiamme, giusto? 😉

  10.   Diego suddetto

    Lo script di processo in esecuzione potrebbe essere migliorato un po 'mettendo l'opzione per scegliere il processo di cui vuoi sapere, sarebbe simile a questo:

    #! / Bin / bash
    echo "Scegli un servizio"
    leggi SERVIZIO
    # SERVICE = "mysql"
    se ps ascia | grep -v grep | grep $ SERVICE> / dev / null
    poi
    echo "Il servizio $ SERVICE è in esecuzione"
    altro
    echo "Il servizio $ SERVICE è stato interrotto"

  11.   Juan Carlos C suddetto

    Ho script molto pratici, ma sto cercando uno script speciale per risolvere un problema che ho, che è il seguente: Abbiamo un application server in azienda che gli utenti interni accedono tramite telnet ed eseguono un'applicazione speciale che è limitato Per le licenze, gli utenti abusano e aprono più di un telnet per prendere più di 2 o più licenze, quindi lo script che ho pensato è che con qualche metodo, controlla quale processo telnet è inattivo per più di 2 ore e quindi invia un kill a quello pid, potresti aiutarmi?

    1.    Diego suddetto

      Installa il seguente programma

      aptitude installa l'autolog

      E il file di configurazione che hai in /etc/autolog.conf

  12.   Tito suddetto

    Fantastico, amico, posso farti una domanda, ho bisogno di uno script di shell con opzioni e l'ho basato sul tuo e funziona benissimo, ma una delle opzioni deve inviare e-mail (usando postifix), richiede oggetto, testo e destinatari sullo schermo e cosa inviare e controllare che sia inviato correttamente, con mailq posso vedere la coda e vedere se è stato inviato, ma come faccio a inviare le mail a comando utilizzando le variabili che hanno ricevuto oggetto, testo e destinatari ? 🙁

    1.    KZKG ^ Gaara suddetto

      Scrivi alla mia email (kzkggaara[at]desdelinux[dot]net) per parlare con più calma, sarò felice di aiutarti :)

      1.    Tito suddetto

        Grande grazie amico, sei passato!

  13.   Fer suddetto

    Ciao buon.
    Mi sono imbattuto in questi eccellenti esempi proprio quando avevo bisogno di un menu.
    L'ho fatto e non riesco a farlo funzionare (nei passaggi precedenti).
    Ho 247 elementi, che si riferiscono ai diversi domini territoriali.
    Quello che mi serve è un menu da cui scegliere il paese:
    #! / Bin / bash
    pulire campo
    mentre:
    do
    echo »Scegli il paese in cui provare»
    eco «1. Afghanistan (AF) »
    eco «2. Albania (AL) »
    eco «3. Germania (DE) »
    eco «5. Angola (AO) »
    eco «6. Anguilla (AI) »
    .. e continua fino al 247

    echo -n "Seleziona un'opzione [1 - 247]"
    opzione di lettura
    case $ opzione in
    1) echo "questo sei tu:"; whoami ;;
    2) echo "hai questo"; df ;;
    3) echo ""; uname -r ;;
    4) echo "ciao"; uscita 1 ;;
    5) echo "questo sei tu:"; whoami ;;
    6) echo "questo sei tu:"; whoami ;;
    ... E continua fino al 247
    *) echo «$ opc è un'opzione non valida. È così difficile? ";
    echo "Premi un tasto per continuare ...";
    leggi pippo ;;
    che C
    fatto

    Il comportamento è il seguente:
    Qualsiasi opzione tranne 4, che è l'output, cancella il numero inserito e attende un nuovo numero.
    L'immissione di 4 viene fuori.
    Se metto il codice di 4 in un'altra riga (diciamo 150) ne esce ugualmente senza problemi.
    Ho anche provato a mettere il codice in questo formato:
    151) echo "this you are:";
    chi sono ;;
    con lo stesso risultato.
    Mi chiedo se ci siano opzioni migliori per un menu così lungo e ovviamente sto sbagliando anche.
    Un aiuto sarebbe molto apprezzato, grazie

  14.   solo raul suddetto

    eccellente ... penso che sia molto bello entrare nel guscio

    grazie

  15.   quadri suddetto

    fantastico, ehi come posso far funzionare la mia bash con un file
    esempio:

    upload.sh fotodelavecina.jpg

    pensando che il mio script bash "upload.sh" abbia le informazioni di accesso al mio ftp

    saluti e grazie 😀

  16.   netzulo ntx suddetto

    Brav'uomo, grazie mille per tutti gli script, ho configurato un server CentOS e non sai quanto bene questi modelli mi vengano in mente, per favore, contattami via email. Voglio proporvi qualcosa

  17.   Gabriele Balderramos suddetto

    Perché usi read foo quando crei un menu? risposte rapide di cui ho bisogno