Полезные сценарии оболочки в любой программе

Колотить Это компьютерная программа, предназначенная для интерпретации приказов. В его основе лежит оболочка Юникс и был написан для проекта GNU является оболочкой по умолчанию в большинстве дистрибутивов GNU / Linux. Его имя является аббревиатурой от Bourne-Again Shell (еще одна оболочка борн), играя словами (рожденный свыше означает возрождение) на Оболочка Борна (ш), который был одним из первых основных интерпретаторов 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

В этом случае проверяется, что файл Any.lock существовать. Если он существует, скрипт НЕ выполняет свои задачи. Если он не существует, он создает файл, запускает задачи, которые ему необходимы, и удаляет его. Но это не совсем надежно. Что произойдет, если во время работы нашего скрипта он резко закроется?

В этом случае файл блокировки не будет удален, и, следовательно, он не позволит нам снова запустить сценарий. Чтобы охватить эти случаи, мы могли бы использовать команду 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

Давайте разберемся с командой немного лучше ловушка. Его синтаксис в основном следующий: сигнал команды ловушки [сигнал…]; где сигнал - это сигнал завершения, который вы хотите поймать. Если вы хотите увидеть список доступных сигналов, вы можете запустить команду 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"

Конец статьи. Просто здорово

Редактировать: Будьте осторожны с пробелами и табуляциями, которые по какой-то причине не выходят ¬¬


Содержание статьи соответствует нашим принципам редакционная этика. Чтобы сообщить об ошибке, нажмите здесь.

22 комментариев, оставьте свой

Оставьте свой комментарий

Ваш электронный адрес не будет опубликован. Обязательные для заполнения поля помечены *

*

*

  1. Ответственный за данные: Мигель Анхель Гатон
  2. Назначение данных: контроль спама, управление комментариями.
  3. Легитимация: ваше согласие
  4. Передача данных: данные не будут переданы третьим лицам, кроме как по закону.
  5. Хранение данных: база данных, размещенная в Occentus Networks (ЕС)
  6. Права: в любое время вы можете ограничить, восстановить и удалить свою информацию.

  1.   КЗКГ ^ Гаара сказал

    Блин они классные О_О ... это очень поможет моим мелочам, которые я делаю в Баше 😀

  2.   ren434 сказал

    Сценарии супер! Какой большой вклад серьезно, именно то, что я искал.

    PS: Форум не работает.

    1.    КЗКГ ^ Гаара сказал

      Да, сервер, на котором смонтирован форум, отключен, не знаю почему ... мы написали электронное письмо другу, который заботится о нем, чтобы узнать, что он нам ответит 🙂

      Привет.

  3.   ren434 сказал

    Ну что ж, будем надеяться, что в этом нет ничего серьезного.

  4.   левша сказал

    Эта "мякина" тоже была включена в Code Ninja? XD

  5.   тарегон сказал

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

  6.   Кристофер сказал

    Спасибо мне очень понравилось

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

    Проверка входных параметров очень полезна. Не умел меню делать =)

  8.   Hyuuga_Neji сказал

    Большой…. теперь я могу придать своему скрипту немного "твердости" churros lol

  9.   ворон сказал

    Мне очень приятно видеть, как наша скромная работа в CodeNinja служит международному сообществу Linux.

    1.    КЗКГ ^ Гаара сказал

      Очистить! 🙂
      Все должно помогать и вносить свой вклад вместе, а не разжигать пламя, верно? 😉

  10.   диего сказал

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

    #! / Bin / Баш
    echo "Выберите услугу"
    читать СЕРВИС
    # СЕРВИС = 'mysql'
    если ps ax | grep -v grep | grep $ СЕРВИС> / dev / null
    становятся
    echo "Сервис $ SERVICE запущен"
    еще
    echo "Служба $ SERVICE остановлена"

  11.   Хуа Карлос К сказал

    Я очень практичен с вашими сценариями, но я ищу специальный сценарий для решения моей проблемы, а именно: у нас есть сервер приложений в компании, который внутренние пользователи получают доступ к нему через telnet и запускают специальное приложение, которое ограничено Что касается лицензий, пользователи злоупотребляют и открывают более одного telnet, чтобы получить 2 или более лицензии, поэтому сценарий, который я подумал, заключается в том, что каким-то образом проверяется, какой процесс telnet неактивен более 2 часов, и поэтому отправляет ему kill. пид, ты не мог бы мне помочь?

    1.    диего сказал

      Установите следующую программу

      aptitude install autolog

      И файл конфигурации, который у вас есть в /etc/autolog.conf

  12.   Тито сказал

    Отлично, друг, я могу задать вам вопрос, мне нужен сценарий оболочки с параметрами, я основал его на вашем, и он отлично работает, но один из вариантов должен отправлять электронные письма (с использованием postifix), он запрашивает тему, текст и получателей на экране и что send и проверьте, что оно отправлено правильно, с помощью mailq я могу увидеть очередь и посмотреть, было ли оно отправлено, но как мне отправить электронные письма с помощью команды, используя переменные, которые получили тему, текст и получателей? 🙁

    1.    КЗКГ ^ Гаара сказал

      Напишите мне на почту (kzkggaara [at] desdelinux [dot] net), чтобы говорить спокойнее, с удовольствием помогу you

      1.    Тито сказал

        Большое спасибо, друг, ты сдал!

  13.   Fer сказал

    Привет хорошо.
    Я наткнулся на эти прекрасные примеры, когда мне нужно было меню.
    Я начал это делать и не могу заставить его работать (на предыдущих шагах).
    У меня есть 247 элементов, которые относятся к разным территориальным доменам.
    Что мне нужно, так это меню, в котором выбрать страну:
    #! / Bin / Баш
    Очистить
    в то время как:
    do
    echo »Выберите страну, чтобы попробовать»
    эхо «1. Афганистан (AF) »
    эхо «2. Албания (AL) »
    эхо «3. Германия (DE) »
    эхо «5. Ангола (AO) »
    эхо «6. Ангилья (AI) »
    .. и продолжается до 247

    echo -n "Выберите вариант [1 - 247]"
    вариант чтения
    case $ option в
    1) эхо "это ты:"; whoami ;;
    2) echo "у вас есть это"; df ;;
    3) эхо ""; uname -r ;;
    4) эхо «пока»; выход 1 ;;
    5) эхо "это ты:"; whoami ;;
    6) эхо "это ты:"; whoami ;;
    … И продолжается до 247
    *) echo «$ opc - недопустимая опция. Это так сложно? ";
    echo "Нажмите клавишу, чтобы продолжить ...";
    читать foo ;;
    ESAC
    сделанный

    Поведение выглядит следующим образом:
    Любая опция, кроме 4, которая является выходом, удаляет введенное число и ожидает нового числа.
    Ввод 4 выходит.
    Если я помещаю код 4 в любую другую строку (скажем, 150), он выходит также без проблем.
    Я также попытался поместить код в такой формат:
    151) echo "это ты:";
    кто я ;;
    с тем же результатом.
    Интересно, есть ли варианты получше для такого длинного меню, и, конечно, я тоже ошибаюсь.
    Помощь будет очень признательна, спасибо

  14.   Только Рауль сказал

    отлично ... думаю очень хорошо попасть в оболочку

    Gracias

  15.   рамки сказал

    отлично, эй, как я могу заставить мой bash работать с файлом
    пример:

    upload.sh fotodelavecina.jpg

    думая, что мой сценарий bash "upload.sh" имеет доступ к моему ftp

    привет и спасибо 😀

  16.   Netzulo NTX сказал

    Добрый человек, большое спасибо за все скрипты, я установил сервер CentOS, и вы не знаете, насколько хорошо мне приходят эти шаблоны, пожалуйста, свяжитесь со мной по электронной почте. Я хочу предложить тебе кое-что

  17.   Габриэль Бальдеррамос сказал

    Почему вы используете read foo при создании меню? мне нужны быстрые ответы