Удар Це комп’ютерна програма, функцією якої є інтерпретація замовлень. Він заснований на оболонці Юнекс і була написана для проекту 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"
Кінець статті. Просто чудово 😀
Редагувати: Ви повинні бути обережними з пробілами та вкладками, які з якихось причин не виходять ¬¬
На хуй вони чудові O_O ... це дуже допоможе моїм дрібницям, якими я займаюся в Bash 😀
Сценарії чудові! Який великий внесок серйозно, саме те, що я шукав.
PS: Форум не працює.
Так, сервер, на якому встановлений форум, перебуває в автономному режимі, не маючи уявлення чому ... ми написали електронний лист другу, який подбає про це, щоб побачити, що він нам відповість
Привіт.
Ну добре, будемо сподіватися, що це нічого серйозного.
Чи була ця "плява" також включена в Code Ninja? XD
Мені подобається сила bash 😉, і вони сказали мені, для чого потрібна мова C ... ну, у сценарії оболонки є багато звичних команд.
Дякую, мені дуже сподобалось
Перевірка вхідних параметрів дуже корисна. Я не знав, як скласти меню =)
Чудово…. тепер я можу надати трохи "твердості" моєму сценарію churros hehehe
З великим задоволенням бачу, як наша скромна робота в CodeNinja служить міжнародній спільноті Linux
Ясно! 🙂
Все полягає в тому, щоб допомагати та сприяти разом, а не для того, щоб спалювати полум’я, так? 😉
Сценарій процесу, який працює, можна трохи вдосконалити, поставивши опцію вибору процесу, про який ви хочете знати, це виглядатиме приблизно так:
#! / бін / баш
луна "Виберіть послугу"
прочитати СЕРВІС
# SERVICE = 'mysql'
якщо ps сокира | grep -v grep | grep $ SERVICE> / dev / null
потім
echo "Служба $ SERVICE працює"
ще
echo "Служба $ SERVICE зупинена"
Я дуже практичний з його сценаріями, але я шукаю спеціальний сценарій для вирішення моєї проблеми, який полягає в наступному: У нас є сервер додатків у компанії, до якого внутрішні користувачі отримують доступ через telnet, і виконуємо спеціальний додаток, який обмежений Для ліцензій користувачі зловживають і відкривають більше одного телнета, щоб взяти на себе 2 або більше ліцензій, тому сценарій, на мій погляд, полягає в тому, що якимось способом перевіряють, який процес телнету неактивний більше 2 годин, і, отже, надсилають на нього вбивство pid, ти не міг би мені допомогти?
Встановіть наступну програму
aptitude встановити автолог -
І у вас є файл конфігурації в /etc/autolog.conf
Чудово, друже, я можу задати тобі запитання, мені потрібен сценарій оболонки з опціями, і я базую його на твоїм, і він чудово працює, але одна з опцій повинна надсилати електронні листи (за допомогою postifix), він запитує тему, текст та одержувачів на екрані та надсилати та перевіряти, чи він надісланий правильно, за допомогою mailq я бачу чергу та перевіряю, чи була вона надіслана, але як надіслати електронні листи командою, використовуючи змінні, які отримали тему, текст та одержувачів? 🙁
Напишіть на мою електронну адресу (kzkggaara[at]desdelinux[точка]net) щоб говорити спокійніше, я з радістю вам допоможу :)
Велике спасибі друже, ти пройшов!
Привіт добре.
Я стикався з цими чудовими прикладами саме тоді, коли мені потрібно було меню.
Я запустив його і не можу змусити його працювати (на попередніх кроках).
У мене є 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) луна "це ти:";
хто я ;;
з однаковим результатом.
Цікаво, чи є кращі варіанти для такого довгого меню, і, звичайно, я теж роблю не так.
Дякуємо за допомогу
відмінно ... Я думаю, це дуже добре потрапити в оболонку
спасибі
чудово, ей, як я можу змусити мою bash працювати з файлом
приклад:
upload.sh fotodelavecina.jpg
думаючи, що мій скрипт bash "upload.sh" має інформацію про доступ до мого ftp
привітання та подяки 😀
Хороша людина, дякую вам за всі сценарії, я створив сервер CentOS, і ви не знаєте, наскільки ці шаблони мені надходять, будь ласка, зв'яжіться зі мною по електронній пошті. Я хочу щось вам запропонувати
Чому ви використовуєте read foo при складанні меню? швидкі відповіді, які мені потрібні