Χρήσιμα σενάρια shell σε οποιοδήποτε πρόγραμμα

Bash Είναι ένα πρόγραμμα υπολογιστή του οποίου η λειτουργία είναι να ερμηνεύει παραγγελίες. Βασίζεται στο κέλυφος του Unix και γράφτηκε για το έργο GNU είναι το προεπιλεγμένο κέλυφος στις περισσότερες διανομές του GNU / Linux. Το όνομά του είναι αρκτικόλεξο για Bourne–Again Shell (ένα άλλο κέλυφος bourne), κάνοντας ένα παιχνίδι στις λέξεις (αναγεννημένος σημαίνει αναγέννηση) επί Κέλυφος Bourne (sh), που ήταν ένας από τους πρώτους μεγάλους διερμηνείς του Unix.

Σήμερα πρόκειται να δείξουμε μερικά σενάρια shell που μπορούν να είναι πολύ χρήσιμα για προγραμματιστές. Τα περισσότερα δουλεύουν σε οποιοδήποτε κέλυφος Unix, αν και ορισμένοι απαιτούν να εκτελεστούν συγκεκριμένα από Bash.

Αποτρέψτε τους μη προνομιούχους χρήστες από την εκτέλεση του σεναρίου

Ορισμένα σενάρια εκτελούν διοικητικές εργασίες, οπότε ίσως θέλουμε μόνο ο ριζικός χρήστης να εκτελέσει το σενάριο. Σε αυτήν την περίπτωση μπορούμε να χρησιμοποιήσουμε κάτι σαν αυτό:

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

Να επιτρέπεται η εκτέλεση σεναρίου μόνο σε συγκεκριμένο χρήστη

Παρόμοια με τον παραπάνω κώδικα, ίσως θέλουμε μόνο ένας συγκεκριμένος χρήστης να εκτελέσει το σενάριο. Το κάνουμε έτσι:

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

Βεβαιωθείτε ότι εκτελείται μια υπηρεσία / διαδικασία

Εάν θέλουμε να μάθουμε εάν υπάρχουν διαδικασίες οποιασδήποτε υπηρεσίας ή προγράμματος που εκτελείται, θα μπορούσαμε να χρησιμοποιήσουμε αυτό το σενάριο (σε αυτήν την περίπτωση επιβεβαιώνει ότι ο δαίμονας του Apache τρέχει):

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

Δημιουργήστε ένα αρχείο κλειδώματος

Μερικές φορές πρέπει να βεβαιωθούμε ότι το σενάριο δεν εκτελείται δύο ή περισσότερες φορές ταυτόχρονα. Γι 'αυτό μπορούμε να χρησιμοποιήσουμε τα αρχεία κλειδώματος. Αυτή είναι μια απλή έκδοση ενός σεναρίου που μας επιτρέπει να το κάνουμε:

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

Σε αυτήν την περίπτωση, επαληθεύεται ότι το αρχείο οτιδήποτε. Κλείδωμα υπάρχει. Εάν υπάρχει, το σενάριο ΔΕΝ εκτελεί τις εργασίες του. Εάν δεν υπάρχει, δημιουργεί το αρχείο, εκτελεί τις εργασίες που πρέπει να εκτελέσει και το αφαιρεί. Όμως, αυτό δεν είναι απολύτως αξιόπιστο. Τι θα συνέβαινε εάν ενώ το σενάριό μας εκτελείται κλείσει απότομα;

Σε αυτήν την περίπτωση, το αρχείο κλειδώματος δεν θα διαγραφεί και επομένως δεν θα μας επιτρέπει να εκτελέσουμε ξανά το σενάριο. Για να καλύψουμε αυτές τις περιπτώσεις, θα μπορούσαμε να χρησιμοποιήσουμε την εντολή παγίδας που μας επιτρέπει να εκτελέσουμε εντολές σε περίπτωση που το σενάριό μας τελειώσει απροσδόκητα. Αυτή είναι μια πιο προηγμένη έκδοση που αποθηκεύει επίσης το PID του σεναρίου που το εκτελεί στο αρχείο κλειδώματος:

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

Ας καταλάβουμε την εντολή λίγο καλύτερα παγίδα. Η σύνταξή του είναι βασικά η εξής: εντολή παγίδας [σήμα…] όπου το σήμα είναι το σήμα τερματισμού που θέλετε να πιάσετε. Εάν θέλετε να δείτε μια λίστα με τα διαθέσιμα σήματα, μπορείτε να εκτελέσετε την εντολή kill -l. Για την προηγούμενη περίπτωση χρησιμοποιήθηκαν τα σήματα INT (καταγράφει τον τερματισμό που παράγεται από Ctrl + c), ΟΡΟΙ (τερματισμός που παράγεται με εντολή kill) και ΕΞΟΔΟΣ (κανονικός τερματισμός ενός σεναρίου, είτε επειδή δεν υπάρχουν άλλες γραμμές για εκτέλεση είτε επειδή βρίσκεται στην εντολή εξόδου).

Μενού επιλογών

Για να δημιουργήσετε ένα μενού όπου επιτρέπουμε στον χρήστη να επιλέξει μια σειρά επιλογών, μπορούμε να χρησιμοποιήσουμε το ακόλουθο σχήμα:

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

Ζητήστε επιβεβαίωση πριν εκτελέσετε ένα σενάριο

Μερικές φορές είναι χρήσιμο να επιβεβαιώνετε ο χρήστης την εκτέλεση μιας παρτίδας δηλώσεων, δηλαδή το τυπικό μήνυμα που ζητά από τον χρήστη να πληκτρολογήσει ναι ή όχι. Μπορούμε να το κάνουμε έτσι:

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

Τέλος άρθρου. Απλά υπέροχο 😀

Επεξεργασία: Πρέπει να είστε προσεκτικοί με κενά και καρτέλες, οι οποίες για κάποιο λόγο δεν βγαίνουν ¬


Αφήστε το σχόλιό σας

Η διεύθυνση email σας δεν θα δημοσιευθεί. Τα υποχρεωτικά πεδία σημειώνονται με *

*

*

  1. Υπεύθυνος για τα δεδομένα: Miguel Ángel Gatón
  2. Σκοπός των δεδομένων: Έλεγχος SPAM, διαχείριση σχολίων.
  3. Νομιμοποίηση: Η συγκατάθεσή σας
  4. Κοινοποίηση των δεδομένων: Τα δεδομένα δεν θα κοινοποιούνται σε τρίτους, εκτός από νομική υποχρέωση.
  5. Αποθήκευση δεδομένων: Βάση δεδομένων που φιλοξενείται από τα δίκτυα Occentus (ΕΕ)
  6. Δικαιώματα: Ανά πάσα στιγμή μπορείτε να περιορίσετε, να ανακτήσετε και να διαγράψετε τις πληροφορίες σας.

  1.   KZKG ^ Γκάρα dijo

    Γαμώτο είναι υπέροχο O_O ... θα βοηθήσει πολύ στα μικρά μου πράγματα που κάνω στο Bash 😀

  2.   ren434 dijo

    Τα σενάρια είναι εξαιρετικά! Τι μεγάλη συμβολή σοβαρά, ακριβώς αυτό που έψαχνα.

    PS: Το φόρουμ είναι εκτός λειτουργίας.

    1.    KZKG ^ Γκάρα dijo

      Ναι, ο διακομιστής όπου είναι τοποθετημένο το φόρουμ είναι εκτός σύνδεσης, δεν ξέρω γιατί ... γράψαμε ένα email στον φίλο που το φροντίζει, για να δούμε τι μας απαντά 🙂

      Χαιρετισμούς.

  3.   ren434 dijo

    Α, ας ελπίσουμε ότι δεν είναι τίποτα σοβαρό.

  4.   αριστερό dijo

    Το "chaff" συμπεριλήφθηκε επίσης στον κώδικα Ninja; XD

  5.   ταρέγκον dijo

    Μου αρέσει η δύναμη του bash 😉 και μου είπαν για ποια ήταν η γλώσσα C…, γιατί στο shell script υπάρχουν πολλές οικείες εντολές.

  6.   Χριστόφορος dijo

    Σας ευχαριστώ, μου άρεσε πολύ

  7.   λεπίδα αγγέλου dijo

    Η επικύρωση των παραμέτρων εισαγωγής είναι πολύ χρήσιμη. Δεν ήξερα πώς να φτιάξω τα μενού =)

  8.   Hyuuga_Neji dijo

    Μεγάλος…. τώρα μπορώ να δώσω κάποια «σκληρότητα» στο σενάριο churros lol

  9.   κοράκι dijo

    Με μεγάλη χαρά βλέπω πώς η ταπεινή δουλειά μας στο CodeNinja εξυπηρετεί τη διεθνή κοινότητα linux

    1.    KZKG ^ Γκάρα dijo

      Σαφή! 🙂
      Όλα είναι να βοηθήσουμε και να συνεισφέρουμε μαζί, και όχι να δημιουργήσουμε φλόγες, σωστά; 😉

  10.   diego dijo

    Το σενάριο διαδικασίας που εκτελείται θα μπορούσε να βελτιωθεί λίγο θέτοντας την επιλογή να επιλέξετε τη διαδικασία για την οποία θέλετε να γνωρίζετε, θα μοιάζει με αυτό:

    #! / bin / bash
    echo "Επιλέξτε μια υπηρεσία"
    διαβάστε ΥΠΗΡΕΣΙΑ
    # ΥΠΗΡΕΣΙΑ = 'mysql'
    εάν ps ax | grep -v grep | grep $ SERVICE> / dev / null
    τότε
    echo "Η υπηρεσία $ SERVICE εκτελείται"
    αλλιώς
    echo "Η υπηρεσία $ SERVICE έχει διακοπεί"

  11.   Jua Carlos Γ dijo

    Έχω πολύ πρακτικά σενάρια, αλλά ψάχνω ένα ειδικό σενάριο για την επίλυση ενός προβλήματος που έχω, το οποίο είναι το εξής: Έχουμε έναν διακομιστή εφαρμογών στην Εταιρεία στον οποίο οι εσωτερικοί χρήστες έχουν πρόσβαση σε αυτό μέσω telnet και εκτελούν μια ειδική εφαρμογή που είναι περιορισμένη Για άδειες, οι χρήστες κάνουν κατάχρηση και ανοίγουν περισσότερα από ένα telnet για να αναλάβουν 2 ή περισσότερες άδειες, τότε το σενάριο που έχω σκεφτεί είναι ότι με κάποια μέθοδο, ελέγξτε ποια διαδικασία telnet είναι ανενεργή για περισσότερες από 2 ώρες και, επομένως, στείλτε ένα kill σε αυτό pid, θα μπορούσες να με βοηθήσεις;

    1.    diego dijo

      Εγκαταστήστε το ακόλουθο πρόγραμμα

      autolog εγκατάσταση ικανότητας

      Και το αρχείο διαμόρφωσης που έχετε στο /etc/autolog.conf

  12.   Τίτο dijo

    Τέλεια, φίλε, μπορώ να σας κάνω μια ερώτηση, χρειάζομαι ένα σενάριο κελύφους με επιλογές και το βασίζω στη δική σας και λειτουργεί τέλεια, αλλά μία από τις επιλογές πρέπει να στείλει email (χρησιμοποιώντας postifix), ζητά θέμα, κείμενο και παραλήπτες στην οθόνη και τι στείλτε και ελέγξτε ότι έχει σταλεί σωστά, με το mailq μπορώ να δω την ουρά και να δω αν εστάλη, αλλά πώς μπορώ να στείλω τα μηνύματα με εντολή χρησιμοποιώντας τις μεταβλητές που έλαβαν θέμα, κείμενο και παραλήπτες; 🙁

    1.    KZKG ^ Γκάρα dijo

      Escríbeme a mi email (kzkggaara[at]desdelinux[dot]net) para hablar con más calma, te ayudo con mucho gusto 🙂

      1.    Τίτο dijo

        Μεγάλη ευχαριστώ φίλε, περάσατε!

  13.   Fer dijo

    Γεια σου καλά.
    Έχω συναντήσει αυτά τα εξαιρετικά παραδείγματα όταν χρειαζόμουν ένα μενού.
    Το έχω κάνει και δεν μπορώ να το δουλέψω (στα προηγούμενα βήματα).
    Έχω 247 στοιχεία, τα οποία αναφέρονται στους διαφορετικούς εδαφικούς τομείς.
    Αυτό που χρειάζομαι είναι ένα μενού από πού να επιλέξω τη χώρα:
    #! / bin / bash
    καθαρός
    ενώ:
    do
    echo »Επιλέξτε τη χώρα που θα δοκιμάσετε»
    ηχώ «1. Αφγανιστάν (AF) »
    ηχώ «2. Αλβανία (AL) »
    ηχώ «3. Γερμανία (DE) »
    ηχώ «5. Αγκόλα (AO) »
    ηχώ «6. Ανγκουίλα (AI) »
    .. και συνεχίζεται μέχρι το 247

    echo -n "Επιλέξτε μια επιλογή [1 - 247]"
    επιλογή ανάγνωσης
    επιλογή $ υπόθεση
    1) echo "αυτό είσαι:"; whoami ;;
    2) ηχώ "έχετε αυτό"; df ;;
    3) ηχώ ""; uname -r ;;
    4) echo "bye", έξοδος 1 ;;
    5) echo "αυτό είσαι:"; whoami ;;
    6) echo "αυτό είσαι:"; whoami ;;
    … Και συνεχίζεται μέχρι το 247
    *) Το echo «$ opc είναι μη έγκυρη επιλογή. Είναι τόσο δύσκολο; ";
    echo "Πατήστε ένα πλήκτρο για να συνεχίσετε ...";
    διαβάστε το foo ;;
    ότι Γ
    γίνεται

    Η συμπεριφορά έχει ως εξής:
    Οποιαδήποτε επιλογή εκτός από το 4, που είναι η έξοδος, διαγράφει τον εισαγόμενο αριθμό και περιμένει έναν νέο αριθμό.
    Η είσοδος 4 βγαίνει.
    Αν βάλω τον κωδικό 4 σε οποιαδήποτε άλλη γραμμή (ας πούμε 150) βγαίνει εξίσου χωρίς προβλήματα.
    Προσπάθησα επίσης να βάλω τον κώδικα σε αυτήν τη μορφή:
    151) echo "αυτό είσαι:";
    ποιός είμαι ;;
    με το ίδιο αποτέλεσμα.
    Αναρωτιέμαι αν υπάρχουν καλύτερες επιλογές για τόσο μεγάλο μενού και φυσικά κάνω λάθος.
    Μια βοήθεια θα εκτιμηθεί πολύ, ευχαριστώ

  14.   Μόνο ο Ραούλ dijo

    εξαιρετική ... Νομίζω ότι είναι πολύ καλό να μπεις στο κέλυφος

    gracias

  15.   marcos dijo

    υπέροχο, γεια πώς μπορώ να κάνω το bash μου να λειτουργεί με ένα αρχείο
    παράδειγμα:

    upload.sh fotodelavecina.jpg

    πιστεύοντας ότι το σενάριο bash μου "upload.sh" έχει τις πληροφορίες πρόσβασης στο ftp μου

    χαιρετισμούς και ευχαριστίες 😀

  16.   netzulo ntx dijo

    Αγαπητέ μου, σας ευχαριστώ πολύ για όλα τα σενάρια, έχω δημιουργήσει έναν διακομιστή CentOS και δεν ξέρετε πόσο καλά έρχονται αυτά τα πρότυπα, παρακαλώ, επικοινωνήστε μαζί μου μέσω email. Θέλω να σας προτείνω κάτι

  17.   Γαβριήλ Μπαλτερράμος dijo

    Γιατί χρησιμοποιείτε το read foo όταν δημιουργείτε ένα μενού; γρήγορες απαντήσεις που χρειάζομαι