Корисні сценарії оболонки в будь-якій програмі

Удар Це комп’ютерна програма, функцією якої є інтерпретація замовлень. Він заснований на оболонці Юнекс і була написана для проекту GNU будучи оболонкою за замовчуванням у більшості дистрибутивів GNU / Linux. Його ім'я є абревіатурою від Шелл Борна (черговий снаряд), роблячи гру слів (Народження знову означає відродження) на Шкаралупа Борна (ш), який був одним з перших великих тлумачів 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

Переконайтеся, що служба / процес запущений

Якщо ми хочемо знати, чи запущені будь-які служби чи програми, ми могли б скористатися цим сценарієм (у цьому випадку він перевіряє, чи демон 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

У цьому випадку перевіряється, що файл будь-що. замок існувати. У випадку, якщо він існує, сценарій НЕ виконує своїх завдань. Якщо він не існує, він створює файл, запускає завдання, які йому потрібно виконати, і видаляє його. Але це не зовсім надійно. Що станеться, якщо під час запуску наш скрипт його буде різко закрито?

У цьому випадку файл блокування не буде видалений, а отже, це не дозволить нам запустити сценарій знову. Щоб охопити ці випадки, ми могли б використовувати команду trap, яка дозволяє нам виконувати команди на випадок, якщо наш сценарій несподівано закінчиться. Це більш вдосконалена версія, яка також зберігає 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

Давайте розберемося в команді трохи краще пастка. Його синтаксис в основному такий: сигнал команди trap [сигнал…]; де сигнал - це сигнал завершення, який ви хочете вловити. Якщо ви хочете побачити список доступних сигналів, ви можете запустити команду 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

Попросіть підтвердження перед запуском сценарію

Іноді корисно, коли користувач підтверджує виконання пакета операторів, тобто типового повідомлення, яке просить користувача ввести так чи ні. Ми можемо зробити це так:

#!/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. Відповідальний за дані: Мігель Анхель Гатон
  2. Призначення даних: Контроль спаму, управління коментарями.
  3. Легітимація: Ваша згода
  4. Передача даних: Дані не передаватимуться третім особам, за винятком юридичних зобов’язань.
  5. Зберігання даних: База даних, розміщена в мережі Occentus Networks (ЄС)
  6. Права: Ви можете будь-коли обмежити, відновити та видалити свою інформацію.

  1.   KZKG ^ Гаара - сказав він

    На хуй вони чудові O_O ... це дуже допоможе моїм дрібницям, якими я займаюся в Bash 😀

  2.   ren434 - сказав він

    Сценарії чудові! Який великий внесок серйозно, саме те, що я шукав.

    PS: Форум не працює.

    1.    KZKG ^ Гаара - сказав він

      Так, сервер, на якому встановлений форум, перебуває в автономному режимі, не маючи уявлення чому ... ми написали електронний лист другу, який подбає про це, щоб побачити, що він нам відповість

      Привіт.

  3.   ren434 - сказав він

    Ну добре, будемо сподіватися, що це нічого серйозного.

  4.   Шульга - сказав він

    Чи була ця "плява" також включена в Code Ninja? XD

  5.   тарегон - сказав він

    Мені подобається сила bash 😉, і вони сказали мені, для чого потрібна мова C ... ну, у сценарії оболонки є багато звичних команд.

  6.   Крістофер - сказав він

    Дякую, мені дуже сподобалось

  7.   ангельський клинок - сказав він

    Перевірка вхідних параметрів дуже корисна. Я не знав, як скласти меню =)

  8.   Хюга_Неджі - сказав він

    Чудово…. тепер я можу надати трохи "твердості" моєму сценарію churros hehehe

  9.   ворон - сказав він

    З великим задоволенням бачу, як наша скромна робота в CodeNinja служить міжнародній спільноті Linux

    1.    KZKG ^ Гаара - сказав він

      Ясно! 🙂
      Все полягає в тому, щоб допомагати та сприяти разом, а не для того, щоб спалювати полум’я, так? 😉

  10.   Дієго - сказав він

    Сценарій процесу, який працює, можна трохи вдосконалити, поставивши опцію вибору процесу, про який ви хочете знати, це виглядатиме приблизно так:

    #! / бін / баш
    луна "Виберіть послугу"
    прочитати СЕРВІС
    # SERVICE = 'mysql'
    якщо ps сокира | grep -v grep | grep $ SERVICE> / dev / null
    потім
    echo "Служба $ SERVICE працює"
    ще
    echo "Служба $ SERVICE зупинена"

  11.   Хуа Карлос С - сказав він

    Я дуже практичний з його сценаріями, але я шукаю спеціальний сценарій для вирішення моєї проблеми, який полягає в наступному: У нас є сервер додатків у компанії, до якого внутрішні користувачі отримують доступ через telnet, і виконуємо спеціальний додаток, який обмежений Для ліцензій користувачі зловживають і відкривають більше одного телнета, щоб взяти на себе 2 або більше ліцензій, тому сценарій, на мій погляд, полягає в тому, що якимось способом перевіряють, який процес телнету неактивний більше 2 годин, і, отже, надсилають на нього вбивство pid, ти не міг би мені допомогти?

    1.    Дієго - сказав він

      Встановіть наступну програму

      aptitude встановити автолог -

      І у вас є файл конфігурації в /etc/autolog.conf

  12.   Тіто - сказав він

    Чудово, друже, я можу задати тобі запитання, мені потрібен сценарій оболонки з опціями, і я базую його на твоїм, і він чудово працює, але одна з опцій повинна надсилати електронні листи (за допомогою postifix), він запитує тему, текст та одержувачів на екрані та надсилати та перевіряти, чи він надісланий правильно, за допомогою mailq я бачу чергу та перевіряю, чи була вона надіслана, але як надіслати електронні листи командою, використовуючи змінні, які отримали тему, текст та одержувачів? 🙁

    1.    KZKG ^ Гаара - сказав він

      Напишіть на мою електронну адресу (kzkggaara[at]desdelinux[точка]net) щоб говорити спокійніше, я з радістю вам допоможу :)

      1.    Тіто - сказав він

        Велике спасибі друже, ти пройшов!

  13.   Fer - сказав він

    Привіт добре.
    Я стикався з цими чудовими прикладами саме тоді, коли мені потрібно було меню.
    Я запустив його і не можу змусити його працювати (на попередніх кроках).
    У мене є 247 елементів, які стосуються різних територіальних областей.
    Мені потрібне меню, де вибрати країну:
    #! / бін / баш
    ясно
    в той час як:
    do
    echo »Виберіть країну, щоб спробувати»
    ехо «1. Афганістан (AF) »
    ехо «2. Албанія (AL) »
    ехо «3. Німеччина (DE) »
    ехо «5. Ангола (АТ) »
    ехо «6. Ангілья (AI) »
    .. і триває до 247

    echo -n "Виберіть варіант [1 - 247]"
    варіант читання
    варіант $ в
    1) луна "це ти:"; whoami ;;
    2) echo "у вас є це"; df ;;
    3) відлуння ""; uname -r ;;
    4) відлуння "до побачення"; вихід 1 ;;
    5) луна "це ти:"; whoami ;;
    6) луна "це ти:"; whoami ;;
    ... І триває до 247
    *) echo "$ opc є недійсним варіантом. Це так складно? ";
    echo "Натисніть клавішу, щоб продовжити ...";
    read foo ;;
    що С
    зроблений

    Поведінка така:
    Будь-який варіант, крім 4, який є вихідним, видаляє введене число і чекає нового номера.
    Введення 4 виходить.
    Якщо я поміщу код 4 в будь-який інший рядок (скажімо 150), він вийде однаково без проблем.
    Я також намагався розмістити код у такому форматі:
    151) луна "це ти:";
    хто я ;;
    з однаковим результатом.
    Цікаво, чи є кращі варіанти для такого довгого меню, і, звичайно, я теж роблю не так.
    Дякуємо за допомогу

  14.   Тільки Рауль - сказав він

    відмінно ... Я думаю, це дуже добре потрапити в оболонку

    спасибі

  15.   Маркос - сказав він

    чудово, ей, як я можу змусити мою bash працювати з файлом
    приклад:

    upload.sh fotodelavecina.jpg

    думаючи, що мій скрипт bash "upload.sh" має інформацію про доступ до мого ftp

    привітання та подяки 😀

  16.   netzulo ntx - сказав він

    Хороша людина, дякую вам за всі сценарії, я створив сервер CentOS, і ви не знаєте, наскільки ці шаблони мені надходять, будь ласка, зв'яжіться зі мною по електронній пошті. Я хочу щось вам запропонувати

  17.   Габріель Бальдеррамос - сказав він

    Чому ви використовуєте read foo при складанні меню? швидкі відповіді, які мені потрібні