Scripturi shell utile în orice program

Bash Este un program de calculator a cărui funcție este interpretarea comenzilor. Se bazează pe coaja de Unix și a fost scris pentru proiect GNU fiind shell-ul implicit în majoritatea distribuțiilor de GNU / Linux. Numele său este un acronim pentru Bourne – Din nou Shell (un alt shell bourne), făcând un joc de cuvinte (născut din nou înseamnă renaștere) pe coajă Bourne (sh), care a fost unul dintre primii interpreți majori ai Unix.

Astăzi vom prezenta câteva scripturi shell care pot fi foarte utile pentru dezvoltatori. Majoritatea funcționează în orice coajă Unix, deși unii cer ca acestea să fie executate în mod specific de către Bash.

Împiedicați utilizatorii fără privilegii să ruleze scriptul

Unele scripturi efectuează sarcini administrative, deci este posibil să ne dorim doar ca utilizatorul root să ruleze scriptul. În acest caz, putem folosi așa ceva:

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

Permiteți executarea scriptului numai unui anumit utilizator

Similar codului de mai sus, ne-am putea dori doar un anumit utilizator să ruleze scriptul. O facem astfel:

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

Verificați dacă se execută un serviciu / proces

Dacă vrem să știm dacă există procese ale unui serviciu sau program care rulează, am putea folosi acest script (în acest caz verifică faptul că demonul de Apache rulează):

#!/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ți un fișier de blocare

Uneori trebuie să ne asigurăm că scriptul nu rulează de două sau mai multe ori simultan. Pentru aceasta putem folosi fișierele de blocare. Aceasta este o versiune simplă a unui script care ne permite să facem acest lucru:

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

În acest caz, se verifică dacă fișierul orice.blocați exista. În cazul în care există, scriptul NU își execută sarcinile. Dacă nu există, creează fișierul, rulează sarcinile pe care trebuie să le ruleze și îl elimină. Dar acest lucru nu este pe deplin de încredere. Ce s-ar întâmpla dacă, în timp ce scriptul nostru rulează, acesta este închis brusc?

În acest caz, fișierul de blocare nu va fi șters și, prin urmare, nu ne va permite să rulăm din nou scriptul. Pentru a acoperi aceste cazuri, am putea folosi comanda trap care ne permite să executăm comenzi în cazul în care scriptul nostru se termină în mod neașteptat. Aceasta este o versiune mai avansată, care salvează și PID-ul scriptului care îl execută în fișierul de blocare:

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

Să înțelegem comanda puțin mai bine capcană. Sintaxa sa este în esență aceasta: trap command signal [signal ...]; unde semnal este semnalul de terminare pe care doriți să-l prindeți. Dacă doriți să vedeți o listă a semnalelor disponibile, puteți rula comanda kill -l. Pentru cazul anterior, au fost utilizate semnalele INT (captează terminarea produsă de un Ctrl + c), TERMEN (încetarea produsă prin comanda kill) și EXIT (terminarea normală a unui script, fie pentru că nu mai există linii de rulat, fie pentru că vine peste comanda de ieșire).

Meniu Opțiuni

Pentru a crea un meniu în care permitem utilizatorului să selecteze o serie de opțiuni, putem folosi următoarea schemă:

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

Solicitați confirmarea înainte de a rula un script

Uneori este util ca utilizatorul să confirme execuția unui lot de instrucțiuni, adică mesajul tipic care cere utilizatorului să introducă da sau nu. Putem face acest lucru astfel:

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

Sfârșitul articolului. Pur și simplu minunat 😀

Editați | ×: Trebuie să fii atent cu spațiile și filele, care, dintr-un anumit motiv, nu ies ¬¬


Lasă comentariul tău

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *

*

*

  1. Responsabil pentru date: Miguel Ángel Gatón
  2. Scopul datelor: Control SPAM, gestionarea comentariilor.
  3. Legitimare: consimțământul dvs.
  4. Comunicarea datelor: datele nu vor fi comunicate terților decât prin obligație legală.
  5. Stocarea datelor: bază de date găzduită de Occentus Networks (UE)
  6. Drepturi: în orice moment vă puteți limita, recupera și șterge informațiile.

  1.   KZKG ^ Gaara el a spus

    La naiba sunt grozavi O_O ... va ajuta foarte mult lucrurile mele mici pe care le fac în Bash 😀

  2.   ren434 el a spus

    Scripturile sunt super! Ce contribuție grozavă în serios, exact ceea ce căutam.

    PS: Forumul a căzut.

    1.    KZKG ^ Gaara el a spus

      Da, serverul pe care este montat forumul este offline, nici o idee de ce ... i-am scris un e-mail prietenului care se ocupă de el, pentru a vedea ce ne răspunde el 🙂

      Salutări.

  3.   ren434 el a spus

    Ei bine, să sperăm că nu este nimic grav.

  4.   stangaci el a spus

    Acea „pleavă” a fost inclusă și în Code Ninja? XD

  5.   taregon el a spus

    Îmi place puterea lui bash 😉 și mi-au spus la ce servea limba C ... pentru că în scriptul shell există multe comenzi familiare.

  6.   Christopher el a spus

    Mulțumesc, mi-a plăcut foarte mult

  7.   lame de înger el a spus

    Validarea parametrilor de intrare este foarte utilă. Nu stiam sa fac meniurile =)

  8.   Hyuuga_Neji el a spus

    Grozav…. acum pot să dau o „duritate” scenariului meu churros hehehe

  9.   corb el a spus

    O mare plăcere să văd cum munca noastră umilă la CodeNinja servește comunității internaționale linux

    1.    KZKG ^ Gaara el a spus

      Clar! 🙂
      Totul este să ajute și să contribuim împreună, și nu să creăm flăcări, nu? 😉

  10.   Diego el a spus

    Scriptul de proces care se execută ar putea fi îmbunătățit puțin, oferind opțiunea de a alege procesul despre care doriți să știți, ar arăta cam așa:

    #! / Bin / bash
    ecou „Alegeți un serviciu”
    citiți SERVICE
    # SERVICE = 'mysql'
    dacă ps ax | grep -v grep | grep $ SERVICE> / dev / null
    apoi
    ecou „Serviciul $ SERVICE rulează”
    altfel
    ecou „Serviciul $ SERVICE este oprit”

  11.   Juan Carlos C el a spus

    Sunt foarte practic cu scripturile dvs., dar caut un script special pentru a rezolva o problemă pe care o am, care este următoarea: Avem un server de aplicații în companie care utilizatorii interni îl accesează prin telnet și execută o aplicație specială aceasta este limitată Pentru licențe, utilizatorii abuzează și deschid mai multe telnet pentru a prelua 2 sau mai multe licențe, așa că scriptul pe care l-am crezut este că, printr-o metodă, verifică care proces telnet este inactiv mai mult de 2 ore și, prin urmare, trimite un kill la acel pid, m-ai putea ajuta?

    1.    Diego el a spus

      Instalați următorul program

      aptitude instalează autolog

      Și fișierul de configurare pe care îl aveți în /etc/autolog.conf

  12.   Tito el a spus

    Excelent, prietene, îți pot pune o întrebare, am nevoie de un script shell cu opțiuni și l-am bazat pe al tău și funcționează excelent, dar una dintre opțiuni trebuie să trimită e-mailuri (folosind postifix), cere subiect, text și destinatarii de pe ecran și ce trimit și verific că este trimis corect, cu mailq Pot vedea coada și a vedea dacă a fost trimis, dar cum trimit e-mailurile prin comandă folosind variabilele care au primit subiect, text și destinatari ? 🙁

    1.    KZKG ^ Gaara el a spus

      Scrie-mi pe e-mail (kzkggaara[at]desdelinux[dot]net) pentru a vorbi mai calm, o să vă ajut cu plăcere :)

      1.    Tito el a spus

        Mulțumesc prieten, ai trecut!

  13.   Fer el a spus

    Buna bine.
    Am dat peste aceste exemple excelente chiar când aveam nevoie de un meniu.
    Am început să o fac și nu reușesc să funcționeze (în pașii anteriori).
    Am 247 de elemente, care se referă la diferitele domenii teritoriale.
    Ceea ce am nevoie este un meniu de unde să aleg țara:
    #! / Bin / bash
    clar
    in timp ce:
    do
    ecou »Alegeți țara de încercat»
    ecou «1. Afganistan (AF) »
    ecou «2. Albania (AL) »
    ecou «3. Germania (DE) »
    ecou «5. Angola (AO) »
    ecou «6. Anguilla (AI) »
    .. și continuă până la 247

    echo -n "Selectați o opțiune [1 - 247]"
    opțiunea de citire
    caz $ opțiune în
    1) ecou „acesta ești:”; whoami ;;
    2) ecou „ai asta”; df ;;
    3) ecou ""; uname -r ;;
    4) ecou „pa”; ieșirea 1 ;;
    5) ecou „acesta ești:”; whoami ;;
    6) ecou „acesta ești:”; whoami ;;
    … Și continuă până la 247
    *) echo «$ opc este o opțiune nevalidă. Este atât de dificil? ";
    ecou „Apăsați o tastă pentru a continua ...”;
    citeste foo ;;
    ESAC
    făcut

    Comportamentul este după cum urmează:
    Orice opțiune cu excepția 4, care este ieșirea, șterge numărul introdus și așteaptă un număr nou.
    Intrarea 4 iese.
    Dacă pun codul 4 în orice altă linie (să zicem 150) iese la fel fără probleme.
    De asemenea, am încercat să pun codul în acest format:
    151) ecou „acesta ești:”;
    cine sunt ;;
    cu același rezultat.
    Mă întreb dacă există opțiuni mai bune pentru un meniu atât de lung și bineînțeles că și eu greșesc.
    Un ajutor ar fi foarte apreciat, mulțumesc

  14.   Doar Raul el a spus

    excelent ... Cred că este foarte bine să intri în cochilie

    Gracias

  15.   marcos el a spus

    foarte bine, cum pot face ca bashul meu să funcționeze cu un fișier
    exemplu:

    upload.sh fotodelavecina.jpg

    gândindu-mă că scriptul meu bash „upload.sh” are informațiile de acces la ftp-ul meu

    salutări și mulțumiri 😀

  16.   netzulo ntx el a spus

    Om bun, mulțumesc foarte mult pentru toate scripturile, am configurat un server CentOS și nu știi cât de bine îmi vin aceste șabloane, te rog să mă contactezi prin e-mail. Vreau să vă propun ceva

  17.   gabriel balderramos el a spus

    De ce folosiți read foo atunci când creați un meniu? răspunsuri rapide de care am nevoie