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 ¬¬
La naiba sunt grozavi O_O ... va ajuta foarte mult lucrurile mele mici pe care le fac în Bash 😀
Scripturile sunt super! Ce contribuție grozavă în serios, exact ceea ce căutam.
PS: Forumul a căzut.
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.
Ei bine, să sperăm că nu este nimic grav.
Acea „pleavă” a fost inclusă și în Code Ninja? XD
Îmi place puterea lui bash 😉 și mi-au spus la ce servea limba C ... pentru că în scriptul shell există multe comenzi familiare.
Mulțumesc, mi-a plăcut foarte mult
Validarea parametrilor de intrare este foarte utilă. Nu stiam sa fac meniurile =)
Grozav…. acum pot să dau o „duritate” scenariului meu churros hehehe
O mare plăcere să văd cum munca noastră umilă la CodeNinja servește comunității internaționale linux
Clar! 🙂
Totul este să ajute și să contribuim împreună, și nu să creăm flăcări, nu? 😉
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”
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?
Instalați următorul program
aptitude instalează autolog
Și fișierul de configurare pe care îl aveți în /etc/autolog.conf
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 ? 🙁
Scrie-mi pe e-mail (kzkggaara[at]desdelinux[dot]net) pentru a vorbi mai calm, o să vă ajut cu plăcere :)
Mulțumesc prieten, ai trecut!
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
excelent ... Cred că este foarte bine să intri în cochilie
Gracias
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 😀
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
De ce folosiți read foo atunci când creați un meniu? răspunsuri rapide de care am nevoie