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"
Τέλος άρθρου. Απλά υπέροχο 😀
Επεξεργασία: Πρέπει να είστε προσεκτικοί με κενά και καρτέλες, οι οποίες για κάποιο λόγο δεν βγαίνουν ¬
Γαμώτο είναι υπέροχο O_O ... θα βοηθήσει πολύ στα μικρά μου πράγματα που κάνω στο Bash 😀
Τα σενάρια είναι εξαιρετικά! Τι μεγάλη συμβολή σοβαρά, ακριβώς αυτό που έψαχνα.
PS: Το φόρουμ είναι εκτός λειτουργίας.
Ναι, ο διακομιστής όπου είναι τοποθετημένο το φόρουμ είναι εκτός σύνδεσης, δεν ξέρω γιατί ... γράψαμε ένα email στον φίλο που το φροντίζει, για να δούμε τι μας απαντά 🙂
Χαιρετισμούς.
Α, ας ελπίσουμε ότι δεν είναι τίποτα σοβαρό.
Το "chaff" συμπεριλήφθηκε επίσης στον κώδικα Ninja; XD
Μου αρέσει η δύναμη του bash 😉 και μου είπαν για ποια ήταν η γλώσσα C…, γιατί στο shell script υπάρχουν πολλές οικείες εντολές.
Σας ευχαριστώ, μου άρεσε πολύ
Η επικύρωση των παραμέτρων εισαγωγής είναι πολύ χρήσιμη. Δεν ήξερα πώς να φτιάξω τα μενού =)
Μεγάλος…. τώρα μπορώ να δώσω κάποια «σκληρότητα» στο σενάριο churros lol
Με μεγάλη χαρά βλέπω πώς η ταπεινή δουλειά μας στο CodeNinja εξυπηρετεί τη διεθνή κοινότητα linux
Σαφή! 🙂
Όλα είναι να βοηθήσουμε και να συνεισφέρουμε μαζί, και όχι να δημιουργήσουμε φλόγες, σωστά; 😉
Το σενάριο διαδικασίας που εκτελείται θα μπορούσε να βελτιωθεί λίγο θέτοντας την επιλογή να επιλέξετε τη διαδικασία για την οποία θέλετε να γνωρίζετε, θα μοιάζει με αυτό:
#! / bin / bash
echo "Επιλέξτε μια υπηρεσία"
διαβάστε ΥΠΗΡΕΣΙΑ
# ΥΠΗΡΕΣΙΑ = 'mysql'
εάν ps ax | grep -v grep | grep $ SERVICE> / dev / null
τότε
echo "Η υπηρεσία $ SERVICE εκτελείται"
αλλιώς
echo "Η υπηρεσία $ SERVICE έχει διακοπεί"
Έχω πολύ πρακτικά σενάρια, αλλά ψάχνω ένα ειδικό σενάριο για την επίλυση ενός προβλήματος που έχω, το οποίο είναι το εξής: Έχουμε έναν διακομιστή εφαρμογών στην Εταιρεία στον οποίο οι εσωτερικοί χρήστες έχουν πρόσβαση σε αυτό μέσω telnet και εκτελούν μια ειδική εφαρμογή που είναι περιορισμένη Για άδειες, οι χρήστες κάνουν κατάχρηση και ανοίγουν περισσότερα από ένα telnet για να αναλάβουν 2 ή περισσότερες άδειες, τότε το σενάριο που έχω σκεφτεί είναι ότι με κάποια μέθοδο, ελέγξτε ποια διαδικασία telnet είναι ανενεργή για περισσότερες από 2 ώρες και, επομένως, στείλτε ένα kill σε αυτό pid, θα μπορούσες να με βοηθήσεις;
Εγκαταστήστε το ακόλουθο πρόγραμμα
autolog εγκατάσταση ικανότητας
Και το αρχείο διαμόρφωσης που έχετε στο /etc/autolog.conf
Τέλεια, φίλε, μπορώ να σας κάνω μια ερώτηση, χρειάζομαι ένα σενάριο κελύφους με επιλογές και το βασίζω στη δική σας και λειτουργεί τέλεια, αλλά μία από τις επιλογές πρέπει να στείλει email (χρησιμοποιώντας postifix), ζητά θέμα, κείμενο και παραλήπτες στην οθόνη και τι στείλτε και ελέγξτε ότι έχει σταλεί σωστά, με το mailq μπορώ να δω την ουρά και να δω αν εστάλη, αλλά πώς μπορώ να στείλω τα μηνύματα με εντολή χρησιμοποιώντας τις μεταβλητές που έλαβαν θέμα, κείμενο και παραλήπτες; 🙁
Escríbeme a mi email (kzkggaara[at]desdelinux[dot]net) para hablar con más calma, te ayudo con mucho gusto 🙂
Μεγάλη ευχαριστώ φίλε, περάσατε!
Γεια σου καλά.
Έχω συναντήσει αυτά τα εξαιρετικά παραδείγματα όταν χρειαζόμουν ένα μενού.
Το έχω κάνει και δεν μπορώ να το δουλέψω (στα προηγούμενα βήματα).
Έχω 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 "αυτό είσαι:";
ποιός είμαι ;;
με το ίδιο αποτέλεσμα.
Αναρωτιέμαι αν υπάρχουν καλύτερες επιλογές για τόσο μεγάλο μενού και φυσικά κάνω λάθος.
Μια βοήθεια θα εκτιμηθεί πολύ, ευχαριστώ
εξαιρετική ... Νομίζω ότι είναι πολύ καλό να μπεις στο κέλυφος
gracias
υπέροχο, γεια πώς μπορώ να κάνω το bash μου να λειτουργεί με ένα αρχείο
παράδειγμα:
upload.sh fotodelavecina.jpg
πιστεύοντας ότι το σενάριο bash μου "upload.sh" έχει τις πληροφορίες πρόσβασης στο ftp μου
χαιρετισμούς και ευχαριστίες 😀
Αγαπητέ μου, σας ευχαριστώ πολύ για όλα τα σενάρια, έχω δημιουργήσει έναν διακομιστή CentOS και δεν ξέρετε πόσο καλά έρχονται αυτά τα πρότυπα, παρακαλώ, επικοινωνήστε μαζί μου μέσω email. Θέλω να σας προτείνω κάτι
Γιατί χρησιμοποιείτε το read foo όταν δημιουργείτε ένα μενού; γρήγορες απαντήσεις που χρειάζομαι