Các tập lệnh shell hữu ích trong bất kỳ chương trình nào

Cú đánh Nó là một chương trình máy tính có chức năng diễn giải các lệnh. Nó dựa trên vỏ của Unix và được viết cho dự án GNU là trình bao mặc định trong hầu hết các bản phân phối của GNU / Linux. Tên của anh ấy là từ viết tắt của Vỏ Bourne-Again (một lớp vỏ khác), chơi chữ (Birth-again có nghĩa là tái sinh) trên Vỏ Bourne (sh), là một trong những trình thông dịch lớn đầu tiên của Unix.

Hôm nay chúng tôi sẽ giới thiệu một số kịch bản shell có thể rất hữu ích cho các nhà phát triển. Hầu hết hoạt động trong mọi trình bao Unix, mặc dù một số yêu cầu rằng chúng phải được thực thi cụ thể bởi Cú đánh.

Ngăn người dùng không có đặc quyền chạy tập lệnh

Một số tập lệnh thực hiện các tác vụ quản trị vì vậy chúng tôi có thể chỉ muốn người dùng root chạy tập lệnh. Trong trường hợp đó, chúng ta có thể sử dụng một cái gì đó như sau:

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

Chỉ cho phép thực thi tập lệnh cho một người dùng cụ thể

Tương tự như đoạn mã ở trên, chúng tôi có thể chỉ muốn một người dùng cụ thể chạy tập lệnh. Chúng tôi làm như vậy:

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

Xác minh rằng một dịch vụ / quy trình đang chạy

Nếu chúng tôi muốn biết liệu có quá trình của bất kỳ dịch vụ hoặc chương trình nào đang chạy hay không, chúng tôi có thể sử dụng tập lệnh này (trong trường hợp này, nó xác minh rằng con quỷ của Apache đang chạy):

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

Tạo một tệp khóa

Đôi khi chúng ta phải đảm bảo rằng script không chạy đồng thời hai hoặc nhiều lần. Đối với điều này, chúng tôi có thể sử dụng các tệp khóa. Đây là một phiên bản đơn giản của tập lệnh cho phép chúng tôi thực hiện việc này:

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

Trong trường hợp này, nó được xác minh rằng tệp bất cứ điều gì. khóa hiện hữu. Trong trường hợp nó tồn tại, tập lệnh KHÔNG thực hiện các tác vụ của nó. Nếu nó không tồn tại, nó sẽ tạo tệp, chạy các tác vụ cần chạy và xóa nó. Nhưng, điều này không hoàn toàn đáng tin cậy. Điều gì sẽ xảy ra nếu trong khi tập lệnh của chúng tôi đang chạy, nó bị đóng đột ngột?

Trong trường hợp đó, tệp khóa sẽ không bị xóa và do đó nó sẽ không cho phép chúng tôi chạy lại tập lệnh. Để giải quyết những trường hợp đó, chúng ta có thể sử dụng lệnh trap cho phép chúng ta thực hiện các lệnh trong trường hợp tập lệnh của chúng ta kết thúc bất ngờ. Đây là phiên bản nâng cao hơn cũng lưu PID của tập lệnh thực thi nó trong tệp khóa:

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

Hãy hiểu lệnh tốt hơn một chút bẫy. Cú pháp của nó về cơ bản là: tín hiệu lệnh bẫy [signal…]; trong đó tín hiệu là tín hiệu kết thúc mà bạn muốn bắt. Nếu bạn muốn xem danh sách các tín hiệu có sẵn, bạn có thể chạy lệnh kill -l. Đối với trường hợp trước, tín hiệu INT đã được sử dụng (nắm bắt sự kết thúc được tạo ra bởi Ctrl + c), KỲ HẠN (chấm dứt được tạo ra bởi lệnh kill) và EXIT (kết thúc bình thường của một tập lệnh, vì không còn dòng nào để chạy hoặc vì nó bắt gặp lệnh thoát).

Menu tùy chọn

Để tạo một menu mà chúng tôi cho phép người dùng chọn một loạt các tùy chọn, chúng tôi có thể sử dụng lược đồ sau:

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

Yêu cầu xác nhận trước khi chạy tập lệnh

Đôi khi, rất hữu ích khi yêu cầu người dùng xác nhận việc thực thi một loạt câu lệnh, tức là, thông báo điển hình yêu cầu người dùng nhập có hoặc không. Chúng ta có thể làm như thế này:

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

Kết thúc bài viết. Chỉ đơn giản là tuyệt vời 😀

Biên tập: Bạn phải cẩn thận với các dấu cách và tab, vì lý do nào đó chúng không xuất hiện ¬¬


Để lại bình luận của bạn

địa chỉ email của bạn sẽ không được công bố. Các trường bắt buộc được đánh dấu bằng *

*

*

  1. Chịu trách nhiệm về dữ liệu: Miguel Ángel Gatón
  2. Mục đích của dữ liệu: Kiểm soát SPAM, quản lý bình luận.
  3. Hợp pháp: Sự đồng ý của bạn
  4. Truyền thông dữ liệu: Dữ liệu sẽ không được thông báo cho các bên thứ ba trừ khi có nghĩa vụ pháp lý.
  5. Lưu trữ dữ liệu: Cơ sở dữ liệu do Occentus Networks (EU) lưu trữ
  6. Quyền: Bất cứ lúc nào bạn có thể giới hạn, khôi phục và xóa thông tin của mình.

  1.   KZKG ^ Gaara dijo

    Fuck họ thật tuyệt O_O ... nó sẽ giúp ích rất nhiều cho những việc nhỏ của tôi mà tôi làm ở Bash 😀

  2.   ren434 dijo

    Kịch bản thật tuyệt vời! Thật là một đóng góp tuyệt vời, đúng như những gì tôi đang tìm kiếm.

    Tái bút: Diễn đàn ngừng hoạt động.

    1.    KZKG ^ Gaara dijo

      Có, máy chủ nơi diễn đàn được kết nối đang ngoại tuyến, không hiểu tại sao ... chúng tôi đã viết email cho người bạn phụ trách điều đó, để xem anh ấy phản hồi gì cho chúng tôi 🙂

      Chúc mừng.

  3.   ren434 dijo

    À, hy vọng nó không có gì nghiêm trọng.

  4.   thuận tay trái dijo

    Có phải "chaff" đó cũng được bao gồm trong Code Ninja? XD

  5.   taregon dijo

    Tôi thích sức mạnh của bash 😉 và họ cho tôi biết ngôn ngữ C dùng để làm gì…, bởi vì trong shell script có rất nhiều lệnh quen thuộc.

  6.   Christopher dijo

    Cảm ơn bạn, tôi thực sự thích

  7.   lưỡi thiên thần dijo

    Việc xác nhận các tham số đầu vào là rất hữu ích. Tôi không biết cách làm menu =)

  8.   Hyuuga_Neji dijo

    Tuyệt quá…. bây giờ tôi có thể cung cấp một số "độ cứng" cho churros script của tôi lol

  9.   con quạ dijo

    Rất vui khi thấy công việc khiêm tốn của chúng tôi tại CodeNinja phục vụ cộng đồng linux quốc tế như thế nào

    1.    KZKG ^ Gaara dijo

      Thông thoáng! 🙂
      Mọi thứ là để giúp đỡ và đóng góp cùng nhau, và không phải để tạo ra ngọn lửa, phải không? 😉

  10.   diego dijo

    Tập lệnh quy trình đang chạy có thể được cải thiện một chút bằng cách đặt tùy chọn để chọn quy trình bạn muốn biết, nó sẽ trông giống như sau:

    #! / bin / bash
    echo "Chọn một dịch vụ"
    đọc DỊCH VỤ
    # SERVICE = 'mysql'
    nếu ps ax | grep -v grep | grep $ SERVICE> / dev / null
    sau đó
    echo "Dịch vụ $ SERVICE đang chạy"
    khác
    echo "Dịch vụ $ SERVICE bị dừng"

  11.   Juan Carlos C dijo

    Tôi có các tập lệnh rất thực tế, nhưng tôi đang tìm một tập lệnh đặc biệt để giải quyết vấn đề mà tôi gặp phải, đó là: Chúng tôi có một máy chủ ứng dụng trong Công ty mà người dùng nội bộ truy cập nó bằng telnet và thực thi một ứng dụng đặc biệt bị giới hạn Đối với giấy phép, người dùng lạm dụng và mở nhiều telnet để chiếm 2 hoặc nhiều giấy phép, sau đó, kịch bản mà tôi nghĩ là bằng một số phương pháp, hãy kiểm tra quá trình telnet nào không hoạt động trong hơn 2 giờ và do đó gửi lệnh giết cho cái đó pid, bạn có thể giúp tôi?

    1.    diego dijo

      Cài đặt chương trình sau

      aptitude cài đặt tự động

      Và tệp cấu hình bạn có trong /etc/autolog.conf

  12.   Tito dijo

    Tuyệt vời, bạn, tôi có thể hỏi bạn một câu hỏi, tôi cần một kịch bản shell với các tùy chọn và tôi đã dựa trên nó dựa trên của bạn và nó hoạt động tốt, nhưng một trong những tùy chọn phải gửi email (sử dụng postifix), nó yêu cầu chủ đề, văn bản và người nhận trên màn hình và những gì gửi và kiểm tra xem nó đã được gửi đúng chưa, với mailq, tôi có thể xem hàng đợi và xem liệu nó đã được gửi chưa, nhưng làm cách nào để gửi thư bằng lệnh sử dụng các biến đã nhận chủ đề, văn bản và người nhận? 🙁

    1.    KZKG ^ Gaara dijo

      Viết thư vào email của tôi (kzkggaara[at]desdelinux[dot]net) để nói chuyện bình tĩnh hơn, tôi sẽ sẵn lòng trợ giúp bạn :)

      1.    Tito dijo

        Cảm ơn bạn tuyệt vời, bạn đã vượt qua!

  13.   Fer dijo

    Xin chào tốt.
    Tôi đã xem qua những ví dụ tuyệt vời này ngay khi tôi cần một menu.
    Tôi đã thực hiện nó và không thể làm cho nó hoạt động (trong các bước trước).
    Tôi có 247 phần tử, đề cập đến các miền lãnh thổ khác nhau.
    Những gì tôi cần là một menu từ nơi để chọn quốc gia:
    #! / bin / bash
    trong sáng
    trong khi:
    do
    echo »Chọn quốc gia để thử»
    echo «1. Afghanistan (AF) »
    echo «2. Anbani (AL) »
    echo «3. Đức (DE) »
    echo «5. Angola (AO) »
    echo «6. Anguilla (AI) »
    .. và tiếp tục cho đến năm 247

    echo -n "Chọn một tùy chọn [1 - 247]"
    đọc tùy chọn
    case $ option trong
    1) echo "bạn là:"; whoami ;;
    2) echo "bạn có cái này"; df ;;
    3) tiếng vang ""; uname -r ;;
    4) echo "tạm biệt"; lối ra 1 ;;
    5) echo "bạn là:"; whoami ;;
    6) echo "bạn là:"; whoami ;;
    … Và tiếp tục cho đến năm 247
    *) echo «$ opc là một tùy chọn không hợp lệ. Nó rất khó?";
    echo "Nhấn phím để tiếp tục ...";
    đọc foo ;;
    nó C
    thực hiện

    Hành vi như sau:
    Bất kỳ tùy chọn nào ngoại trừ 4, là đầu ra, xóa số đã nhập và chờ một số mới.
    Nhập 4 đi ra.
    Nếu tôi đặt mã 4 trong bất kỳ dòng nào khác (giả sử 150), nó sẽ xuất hiện như nhau mà không có vấn đề gì.
    Tôi cũng đã cố gắng đặt mã ở định dạng này:
    151) echo "bạn là:";
    tôi là ai ;;
    với cùng một kết quả.
    Tôi tự hỏi liệu có lựa chọn nào tốt hơn cho một thực đơn dài như vậy và tất nhiên tôi cũng đang làm sai.
    Một sự giúp đỡ sẽ rất được đánh giá cao, cảm ơn bạn

  14.   Chỉ Raul dijo

    tuyệt vời ... Tôi nghĩ rằng nó rất tốt để vào vỏ

    cảm ơn

  15.   marcos dijo

    tuyệt vời, này làm cách nào để tôi có thể làm cho tệp bash của tôi hoạt động được
    ví dụ:

    upload.sh fotodelavecina.jpg

    nghĩ rằng tập lệnh bash "upload.sh" của tôi có thông tin truy cập vào ftp của tôi

    lời chào và cảm ơn 😀

  16.   netzulo ntx dijo

    Người đàn ông tốt, cảm ơn bạn rất nhiều vì tất cả các tập lệnh, tôi đã thiết lập một máy chủ CentOS và bạn không biết các mẫu này đến với tôi tốt như thế nào, vui lòng liên hệ với tôi qua email. Tôi muốn đề xuất một cái gì đó với bạn

  17.   gabriel hói đầu dijo

    Tại sao bạn sử dụng read foo khi làm menu? câu trả lời nhanh tôi cần