Nyttige skallskript i ethvert program

Bash Det er et dataprogram hvis funksjon er å tolke ordrer. Den er basert på skallet av Unix og ble skrevet for prosjektet GNU er standard skallet i de fleste distribusjoner av GNU / Linux. Hans navn er et akronym for Bourne – Igjen Shell (et annet skall bourne), lage et ordspill (gjenfødt betyr gjenfødelse) om ham Bourne-skall (sh), som var en av de første store tolkerne til Unix.

I dag skal vi vise noen skallskript som kan være veldig nyttige for utviklere. De fleste jobber i et hvilket som helst skall Unix, selv om noen krever at de blir henrettet spesifikt av Bash.

Forhindre at ikke-privilegerte brukere kjører skriptet

Noen skript utfører administrative oppgaver, så vi vil kanskje bare at rotbrukeren skal kjøre skriptet. I så fall kan vi bruke noe slikt:

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

Tillat skriptutførelse bare til en bestemt bruker

I likhet med koden ovenfor, vil vi kanskje bare at en bestemt bruker skal kjøre skriptet. Vi gjør det slik:

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

Bekreft at en tjeneste / prosess kjører

Hvis vi vil vite om det er prosesser for en tjeneste eller et program som kjører, kan vi bruke dette skriptet (i dette tilfellet bekrefter det at demon av Apache løper):

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

Lag en låsefil

Noen ganger må vi sørge for at skriptet ikke kjører to eller flere ganger samtidig. For dette kan vi bruke låsefilene. Dette er en enkel versjon av et skript som lar oss gjøre dette:

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

I dette tilfellet er det bekreftet at filen uansett. lås eksistere. I tilfelle det eksisterer, utfører skriptet IKKE oppgavene. Hvis den ikke eksisterer, oppretter den filen, kjører oppgavene den trenger for å kjøre, og fjerner den. Men dette er ikke helt pålitelig. Hva ville skje hvis det mens skriptet vårt kjører, lukkes brått?

I så fall vil ikke låsefilen bli slettet, og derfor vil den ikke tillate oss å kjøre skriptet igjen. For å dekke disse sakene, kan vi bruke fellekommandoen som lar oss utføre kommandoer i tilfelle skriptet vårt ender uventet. Dette er en mer avansert versjon som også lagrer PID for skriptet som kjører det i låsefilen:

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

La oss forstå kommandoen litt bedre felle. Dens syntaks er i utgangspunktet dette: fellekommandosignal [signal ...]; hvor signal er avslutningssignalet du vil fange. Hvis du vil se en liste over tilgjengelige signaler, kan du kjøre kommandoen kill -l. I forrige tilfelle ble INT-signalene brukt (fanger oppsigelsen produsert av en Ctrl + c), BEGREP (avslutning produsert av drepekommandoen) og EXIT (normal avslutning av et skript, enten fordi det ikke er flere linjer å kjøre, eller fordi det kommer over exit-kommandoen).

Alternativmeny

For å lage en meny der vi lar brukeren velge en rekke alternativer, kan vi bruke følgende skjema:

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

Be om bekreftelse før du kjører et skript

Noen ganger er det nyttig å få brukeren til å bekrefte utførelsen av en gruppe utsagn, det vil si den typiske meldingen som ber brukeren om å skrive ja eller nei. Vi kan gjøre dette slik:

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

Slutt på artikkelen. Rett og slett flott 😀

Redigere: Du må være forsiktig med mellomrom og faner, som av en eller annen grunn ikke kommer ut ¬¬


22 kommentarer, legg igjen dine

Legg igjen kommentaren

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *

*

*

  1. Ansvarlig for dataene: Miguel Ángel Gatón
  2. Formålet med dataene: Kontroller SPAM, kommentaradministrasjon.
  3. Legitimering: Ditt samtykke
  4. Kommunikasjon av dataene: Dataene vil ikke bli kommunisert til tredjeparter bortsett fra ved juridisk forpliktelse.
  5. Datalagring: Database vert for Occentus Networks (EU)
  6. Rettigheter: Når som helst kan du begrense, gjenopprette og slette informasjonen din.

  1.   KZKG ^ Gaara sa

    Fuck de er kjempebra O_O ... det vil hjelpe mye på tingene mine som jeg gjør i Bash

  2.   ren434 sa

    Manusene er super! For et flott bidrag seriøst, akkurat det jeg lette etter.

    PS: Forumet er nede.

    1.    KZKG ^ Gaara sa

      Ja, serveren der forumet er montert er frakoblet, aner ikke hvorfor ... vi skrev en e-post til vennen som tar seg av den, for å se hva han reagerer på oss 🙂

      Hilsener.

  3.   ren434 sa

    Vel, la oss håpe det ikke er noe seriøst.

  4.   venstrehendt sa

    Var det "agnet" også inkludert i Code Ninja? XD

  5.   taregon sa

    Jeg liker kraften i bash 😉 og de fortalte meg hva C-språket var for ... vel, i skallskript er det mange kjente kommandoer.

  6.   Christopher sa

    Takk, jeg likte veldig godt

  7.   engelblad sa

    Validering av inngangsparametere er veldig nyttig. Jeg visste ikke hvordan jeg skulle lage menyene =)

  8.   Hyuuga_Neji sa

    Flott…. nå kan jeg gi litt "hardhet" til skriptchurrosene mine

  9.   ravn sa

    En stor glede å se hvordan vårt ydmyke arbeid på CodeNinja betjener det internasjonale linux-samfunnet

    1.    KZKG ^ Gaara sa

      Klar! 🙂
      Alt er å hjelpe og bidra sammen, og ikke å skape flammer, ikke sant? 😉

  10.   diego sa

    Prosessskriptet som kjører kan forbedres litt ved å sette muligheten til å velge prosessen du vil vite om, det vil se ut slik:

    #! / Bin / bash
    ekko "Velg en tjeneste"
    les SERVICE
    # SERVICE = 'mysql'
    hvis ps øks | grep -v grep | grep $ SERVICE> / dev / null
    deretter
    ekko "$ SERVICE-tjenesten kjører"
    ellers
    ekko "$ SERVICE-tjenesten er stoppet"

  11.   Juan Carlos C sa

    Jeg er veldig praktisk med skriptene dine, men jeg ser etter et spesielt skript for å løse et problem som jeg har, som er følgende: Vi har en applikasjonsserver i selskapet som interne brukere får tilgang til den via telnet, og utfører en spesiell applikasjon det er begrenset For lisenser misbruker brukere og åpner mer enn ett telnet for å ta over 2 eller flere lisenser, så skriptet jeg har tenkt er at etter en eller annen metode, sjekk hvilken telnet-prosess som er inaktiv i mer enn 2 timer, og send derfor en kill til den pid, kan du hjelpe meg?

    1.    diego sa

      Installer følgende program

      aptitude installer autolog

      Og konfigurasjonsfilen du har i /etc/autolog.conf

  12.   Tito sa

    Flott, venn, jeg kan stille deg et spørsmål, jeg trenger et skallskript med alternativer og jeg har basert det på ditt, og det fungerer bra, men et av alternativene må sende e-post (ved hjelp av postifix), det ber om emne, tekst og mottakere på skjermen og hva sender og sjekker at den er sendt riktig, med mailq kan jeg se køen og se om den ble sendt, men hvordan sender jeg e-postene på kommando ved hjelp av variablene som mottok emne, tekst og mottakere? 🙁

    1.    KZKG ^ Gaara sa

      Skriv til min e-post (kzkggaara[at]desdelinux[dot]net) for å snakke roligere, hjelper jeg deg gjerne :)

      1.    Tito sa

        Stor takk venn, du passerte!

  13.   Fer sa

    Hei god.
    Jeg har kommet over disse gode eksemplene akkurat da jeg trengte en meny.
    Jeg har begynt å gjøre det, og jeg kan ikke få det til å fungere (i de forrige trinnene).
    Jeg har 247 elementer, som refererer til de forskjellige territoriale domenene.
    Det jeg trenger er en meny hvor jeg skal velge land:
    #! / Bin / bash
    fjerne
    samtidig som:
    do
    ekko »Velg landet du vil prøve»
    ekko «1. Afghanistan (AF) »
    ekko «2. Albania (AL) »
    ekko «3. Tyskland (DE) »
    ekko «5. Angola (AO) »
    ekko «6. Anguilla (AI) »
    .. og fortsetter til 247

    echo -n "Velg et alternativ [1 - 247]"
    lese-alternativet
    sak $ alternativ i
    1) ekko "dette er du:"; whoami ;;
    2) ekko "du har dette"; df ;;
    3) ekko ""; uname -r ;;
    4) ekko "farvel"; utgang 1 ;;
    5) ekko "dette er du:"; whoami ;;
    6) ekko "dette er du:"; whoami ;;
    ... Og fortsetter til 247
    *) ekko «$ opc er et ugyldig alternativ. Det er så vanskelig? ";
    ekko "Trykk på en tast for å fortsette ...";
    les foo ;;
    at C
    gjort

    Oppførselen er som følger:
    Ethvert alternativ unntatt 4, som er utdata, sletter det angitte nummeret og venter på et nytt nummer.
    Å skrive inn 4 kommer ut.
    Hvis jeg legger koden til 4 i en hvilken som helst annen linje (la oss si 150), kommer den ut like uten problemer.
    Jeg har også prøvd å sette koden i dette formatet:
    151) ekko "dette er du:";
    hvem er jeg ;;
    med samme resultat.
    Jeg lurer på om det er bedre alternativer for en så lang meny, og selvfølgelig gjør jeg også feil.
    En hjelp vil være veldig verdsatt, takk

  14.   Bare Raul sa

    utmerket ... Jeg synes det er veldig bra å komme inn i skallet

    takk

  15.   rammeverk sa

    flott hei hvordan kan jeg få min bash til å fungere med en fil
    eksempel:

    upload.sh fotodelavecina.jpg

    tenker at bash-skriptet mitt "upload.sh" har tilgangsinformasjonen til ftp-en min

    hilsener og takk 😀

  16.   netzulo ntx sa

    God mann, tusen takk for alle skriptene, jeg har satt opp en CentOS-server og du vet ikke hvor godt disse malene kommer til meg, vennligst kontakt meg via e-post. Jeg vil foreslå noe for deg

  17.   gabriel balderramos sa

    Hvorfor bruker du lese foo når du lager en meny? raske svar jeg trenger