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 ¬¬
Cazzo sono fantastici O_O ... aiuterà molto le mie piccole cose che faccio a Bash 😀
Le sceneggiature sono super! Che grande contributo sul serio, proprio quello che stavo cercando.
PS: il forum è inattivo.
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.
Ah beh, speriamo non sia niente di grave.
Quella "pula" era inclusa anche in Code Ninja? XD
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.
Grazie, mi è davvero piaciuto
La convalida dei parametri di input è molto utile. Non sapevo come fare i menu =)
Brillante…. ora posso dare un po 'di "durezza" al mio script churros lol
Un grande piacere vedere come il nostro umile lavoro in CodeNinja serve la comunità internazionale di Linux
Sicuro! 🙂
Tutto è per aiutare e contribuire insieme, e non per creare fiamme, giusto? 😉
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"
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?
Installa il seguente programma
aptitude installa l'autolog
E il file di configurazione che hai in /etc/autolog.conf
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 ? 🙁
Scrivi alla mia email (kzkggaara[at]desdelinux[dot]net) per parlare con più calma, sarò felice di aiutarti :)
Grande grazie amico, sei passato!
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
eccellente ... penso che sia molto bello entrare nel guscio
grazie
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 😀
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
Perché usi read foo quando crei un menu? risposte rapide di cui ho bisogno