เชลล์สคริปต์ที่มีประโยชน์ในโปรแกรมใด ๆ

ทุบตี เป็นโปรแกรมคอมพิวเตอร์ที่มีหน้าที่แปลคำสั่ง มันขึ้นอยู่กับเปลือกของ ยูนิกซ์ และถูกเขียนขึ้นสำหรับโครงการ GNU เป็นเชลล์ดีฟอลต์ในการแจกแจงส่วนใหญ่ของ GNU / Linux. ชื่อของเขาเป็นคำย่อของ บอร์น-อะเกน เชลล์ (อีกเปลือกหนึ่ง)การเล่นคำ (เกิดอีกครั้งหมายถึงการเกิดใหม่) เกี่ยวกับ เปลือกบอร์น (sh)ซึ่งเป็นหนึ่งในล่ามหลักคนแรกของ Unix

วันนี้เราจะแสดงเชลล์สคริปต์ที่มีประโยชน์มากสำหรับนักพัฒนา ส่วนใหญ่ทำงานในเปลือกใด ๆ ยูนิกซ์แม้ว่าบางคนต้องการให้ดำเนินการโดยเฉพาะ ทุบตี.

ป้องกันไม่ให้ผู้ใช้ที่ไม่ได้รับสิทธิพิเศษเรียกใช้สคริปต์

สคริปต์บางตัวดำเนินงานการดูแลระบบดังนั้นเราอาจต้องการให้เฉพาะผู้ใช้ root เท่านั้นที่รันสคริปต์ ในกรณีนี้เราสามารถใช้สิ่งนี้:

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

ตรวจสอบว่าบริการ / กระบวนการทำงานอยู่

หากเราต้องการทราบว่ามีกระบวนการของบริการหรือโปรแกรมใด ๆ ที่ทำงานอยู่หรือไม่เราสามารถใช้สคริปต์นี้ได้ (ในกรณีนี้เป็นการตรวจสอบว่าปีศาจของ อาปาเช่ กำลังวิ่ง):

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

ในกรณีนี้จะได้รับการตรวจสอบว่าไฟล์ what.lock มีอยู่ ในกรณีที่มีอยู่สคริปต์จะไม่ดำเนินการตามภารกิจ หากไม่มีอยู่ระบบจะสร้างไฟล์เรียกใช้งานที่ต้องรันและลบออก แต่ไม่น่าเชื่อถือทั้งหมด จะเกิดอะไรขึ้นถ้าในขณะที่สคริปต์ของเรากำลังทำงานอยู่มันถูกปิดทันที

ในกรณีนี้ไฟล์ล็อกจะไม่ถูกลบดังนั้นจึงไม่อนุญาตให้เราเรียกใช้สคริปต์อีกครั้ง เพื่อให้ครอบคลุมกรณีเหล่านั้นเราสามารถใช้ประโยชน์จากคำสั่งกับดักที่ช่วยให้เราดำเนินการคำสั่งในกรณีที่สคริปต์ของเราจบลงโดยไม่คาดคิด นี่เป็นเวอร์ชันขั้นสูงกว่าที่บันทึก 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) และออก (การยุติสคริปต์ตามปกติไม่ว่าจะเป็นเพราะไม่มีบรรทัดให้ดำเนินการอีกต่อไปหรือเพราะเจอคำสั่ง exit).

เมนูตัวเลือก

ในการสร้างเมนูที่เราอนุญาตให้ผู้ใช้เลือกชุดตัวเลือกเราสามารถใช้โครงร่างต่อไปนี้:

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

ขอการยืนยันก่อนเรียกใช้สคริปต์

บางครั้งการให้ผู้ใช้ยืนยันการดำเนินการของชุดคำสั่งนั่นคือข้อความทั่วไปที่ขอให้ผู้ใช้พิมพ์ yes or no เราสามารถทำได้ดังนี้:

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

สิ้นสุดบทความ ยอดเยี่ยมเพียง😀

แก้ไข: คุณต้องระมัดระวังกับการเว้นวรรคและแท็บซึ่งด้วยเหตุผลบางประการจึงไม่ออกมา¬¬


แสดงความคิดเห็นของคุณ

อีเมล์ของคุณจะไม่ถูกเผยแพร่ ช่องที่ต้องการถูกทำเครื่องหมายด้วย *

*

*

  1. ผู้รับผิดชอบข้อมูล: Miguel ÁngelGatón
  2. วัตถุประสงค์ของข้อมูล: ควบคุมสแปมการจัดการความคิดเห็น
  3. ถูกต้องตามกฎหมาย: ความยินยอมของคุณ
  4. การสื่อสารข้อมูล: ข้อมูลจะไม่ถูกสื่อสารไปยังบุคคลที่สามยกเว้นตามข้อผูกพันทางกฎหมาย
  5. การจัดเก็บข้อมูล: ฐานข้อมูลที่โฮสต์โดย Occentus Networks (EU)
  6. สิทธิ์: คุณสามารถ จำกัด กู้คืนและลบข้อมูลของคุณได้ตลอดเวลา

  1.   KZKG ^ กาอาระ dijo

    ไอ้พวกมันเยี่ยมมาก O_O ... มันจะช่วยได้มากกับสิ่งเล็ก ๆ น้อย ๆ ของฉันที่ฉันทำใน Bash 😀

  2.   ren434 dijo

    สคริปต์ยอดเยี่ยมมาก! ช่างเป็นสิ่งที่มีส่วนช่วยอย่างมากในสิ่งที่ฉันกำลังมองหา

    PS: ฟอรั่มไม่ทำงาน

    1.    KZKG ^ กาอาระ dijo

      ใช่เซิร์ฟเวอร์ที่ติดตั้งฟอรัมนั้นออฟไลน์ไม่รู้ว่าทำไม ... เราจึงเขียนอีเมลไปหาเพื่อนที่ดูแลเรื่องนั้นเพื่อดูว่าเขาตอบกลับเราอย่างไร🙂

      อาศิรพจน์

  3.   ren434 dijo

    อืมหวังว่ามันจะไม่มีอะไรร้ายแรง

  4.   ถนัดมือซ้าย dijo

    "แกลบ" นั้นรวมอยู่ใน Code Ninja ด้วยหรือไม่? XD

  5.   ทาเรกอน dijo

    ฉันชอบพลังของ bash 😉และพวกเขาก็บอกฉันว่าภาษา C มีไว้เพื่ออะไร ... ในเชลล์สคริปต์มีคำสั่งที่คุ้นเคยมากมาย

  6.   คริส dijo

    ขอบคุณฉันชอบมาก

  7.   แองเจิ้ลเบลด dijo

    การตรวจสอบความถูกต้องของพารามิเตอร์อินพุตมีประโยชน์มาก ฉันไม่รู้วิธีทำเมนู =)

  8.   ฮิวงะ_เนจิ dijo

    เยี่ยมมาก…. ตอนนี้ฉันสามารถให้ "ความแข็ง" บางอย่างกับ churros สคริปต์ของฉันฮ่า ๆ

  9.   ดำขลับ dijo

    มีความยินดีเป็นอย่างยิ่งที่ได้เห็นว่าการทำงานที่ต่ำต้อยของเราที่ CodeNinja ให้บริการชุมชน linux ระหว่างประเทศอย่างไร

    1.    KZKG ^ กาอาระ dijo

      ชัดเจน! 🙂
      ทุกอย่างคือการช่วยเหลือและมีส่วนร่วมกันไม่ใช่เพื่อก่อไฟใช่ไหม? 😉

  10.   ดิเอโก dijo

    สคริปต์กระบวนการที่กำลังทำงานอยู่สามารถปรับปรุงได้เล็กน้อยโดยใส่ตัวเลือกเพื่อเลือกกระบวนการที่คุณต้องการทราบซึ่งจะมีลักษณะดังนี้:

    #! / bin / ทุบตี
    echo "เลือกบริการ"
    อ่าน SERVICE
    # บริการ = 'mysql'
    ถ้า ps ขวาน | grep -v grep | grep $ SERVICE> / dev / null
    แล้วก็
    สะท้อน "บริการ $ SERVICE กำลังทำงาน"
    อื่น
    เสียงสะท้อน "บริการ $ SERVICE หยุดทำงาน"

  11.   Jua Carlos C. dijo

    ฉันมีสคริปต์ที่ใช้งานได้จริง แต่ฉันกำลังมองหาสคริปต์พิเศษเพื่อแก้ปัญหาที่ฉันมีซึ่งมีดังต่อไปนี้: เรามีแอปพลิเคชันเซิร์ฟเวอร์ใน บริษัท ที่ผู้ใช้ภายในเข้าถึงได้โดยเทลเน็ตและเรียกใช้แอปพลิเคชันพิเศษที่เป็น จำกัด สำหรับใบอนุญาตผู้ใช้จะละเมิดและเปิดมากกว่าหนึ่งเทลเน็ตเพื่อรับสิทธิ์การใช้งานมากกว่า 2 รายการดังนั้นสคริปต์ที่ฉันคิดไว้ก็คือโดยวิธีการบางอย่างให้ตรวจสอบว่ากระบวนการ telnet ใดไม่ได้ใช้งานนานกว่า 2 ชั่วโมงจึงส่ง kill pid คุณช่วยฉันได้ไหม

    1.    ดิเอโก dijo

      ติดตั้งโปรแกรมต่อไปนี้

      ความถนัดในการติดตั้ง autolog

      และไฟล์การกำหนดค่าที่คุณมีใน /etc/autolog.conf

  12.   ตีโต้ dijo

    เยี่ยมมากเพื่อนฉันสามารถถามคำถามคุณได้ฉันต้องการเชลล์สคริปต์ที่มีตัวเลือกและฉันได้อิงตามของคุณและมันก็ใช้งานได้ดี แต่หนึ่งในตัวเลือกต้องส่งอีเมล (โดยใช้ postifix) มันจะถามเรื่อง, ข้อความ และผู้รับบนหน้าจอและสิ่งที่ส่งและตรวจสอบว่าส่งถูกต้องด้วย mailq ฉันสามารถดูคิวและดูว่ามีการส่งหรือไม่ แต่ฉันจะส่งอีเมลตามคำสั่งได้อย่างไรโดยใช้ตัวแปรที่รับเรื่องข้อความและผู้รับ เหรอ? 🙁

    1.    KZKG ^ กาอาระ dijo

      เขียนถึงอีเมลของฉัน (kzkggaara[at]desdelinux[dot]net) เพื่อพูดอย่างใจเย็นมากขึ้น ฉันยินดีที่จะช่วยเหลือคุณ :)

      1.    ตีโต้ dijo

        ขอบคุณมากเพื่อนคุณผ่าน!

  13.   Fer dijo

    สวัสดีดี.
    ฉันเจอตัวอย่างที่ยอดเยี่ยมเหล่านี้เมื่อฉันต้องการเมนู
    ฉันเริ่มทำแล้วและไม่สามารถใช้งานได้ (ในขั้นตอนก่อนหน้านี้)
    ฉันมีองค์ประกอบ 247 รายการซึ่งอ้างถึงโดเมนอาณาเขตที่แตกต่างกัน
    สิ่งที่ฉันต้องการคือเมนูสำหรับเลือกประเทศ:
    #! / bin / ทุบตี
    ชัดเจน
    ในขณะที่:
    do
    echo »เลือกประเทศที่จะลอง»
    เสียงสะท้อน« 1. อัฟกานิสถาน (AF) »
    เสียงสะท้อน« 2. แอลเบเนีย (AL) »
    เสียงสะท้อน« 3. เยอรมนี (DE) »
    เสียงสะท้อน« 5. แองโกลา (AO) »
    เสียงสะท้อน« 6. แองกวิลลา (AI) »
    .. และเรื่อยไปจนถึง 247

    echo -n "เลือกตัวเลือก [1 - 247]"
    อ่านตัวเลือก
    case $ option ใน
    1) สะท้อน "นี่คือคุณ:"; whoami ;;
    2) ก้อง "คุณมีสิ่งนี้"; df ;;
    3) เสียงสะท้อน ""; ไม่มีชื่อ -r ;;
    4) echo "ลาก่อน"; ทางออก 1 ;;
    5) สะท้อน "นี่คือคุณ:"; whoami ;;
    6) สะท้อน "นี่คือคุณ:"; whoami ;;
    …และดำเนินต่อไปจนถึง 247
    *) echo « $ opc เป็นตัวเลือกที่ไม่ถูกต้อง มันยากขนาดนี้? ";
    echo "กดปุ่มเพื่อดำเนินการต่อ ... ";
    อ่าน foo ;;
    ว่า C
    ทำ

    ลักษณะการทำงานมีดังนี้:
    ตัวเลือกใด ๆ ยกเว้น 4 ซึ่งเป็นเอาต์พุตจะลบหมายเลขที่ป้อนและรอหมายเลขใหม่
    เข้า 4 ออกมา
    ถ้าฉันใส่รหัสของ 4 ในบรรทัดอื่น ๆ (สมมติว่า 150) มันออกมาเท่า ๆ กันโดยไม่มีปัญหา
    ฉันได้พยายามใส่รหัสในรูปแบบนี้ด้วย:
    151) สะท้อนว่า "นี่คือคุณ:";
    ฉันเป็นใคร ;;
    ด้วยผลลัพธ์เดียวกัน
    ฉันสงสัยว่ามีตัวเลือกที่ดีกว่าสำหรับเมนูยาว ๆ แบบนี้หรือเปล่าและแน่นอนว่าฉันทำผิดด้วย
    ความช่วยเหลือจะได้รับการชื่นชมมากขอบคุณ

  14.   ราอูลเท่านั้น dijo

    เยี่ยมมาก ... คิดว่าเข้ากะลาได้ดีมาก

    ขอบคุณ

  15.   marcos dijo

    เยี่ยมมากเฮ้ฉันจะทำให้ bash ทำงานกับไฟล์ได้อย่างไร
    ตัวอย่างเช่น:

    อัพโหลด.sh fotodelavecina.jpg

    คิดว่าสคริปต์ทุบตีของฉัน "upload.sh" มีข้อมูลการเข้าถึง ftp ของฉัน

    ทักทายและขอบคุณ😀

  16.   netzulo ntx dijo

    คนดีขอบคุณมากสำหรับสคริปต์ทั้งหมดฉันได้ตั้งค่าเซิร์ฟเวอร์ CentOS แล้วและคุณไม่รู้ว่าเทมเพลตเหล่านี้มาหาฉันได้ดีแค่ไหนโปรดติดต่อฉันทางอีเมล ฉันต้องการเสนอบางอย่างให้กับคุณ

  17.   Gabriel Balderramos Bal dijo

    ทำไมคุณถึงใช้ read foo เมื่อสร้างเมนู? คำตอบด่วนที่ฉันต้องการ