Linux создание скрипта запуска приложения. Создание и запуск скрипта. Запуск PPP на серверной стороне моединения

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

Набор скриптов автоматизирует процесс входа в систему и запускает PPP так что все, что вы должны сделать (от root или как член группы PPP) - дать одну команду запуска вашего соединения.

15.1 Скрипты соединения для аутентификации по имени/паролю пользователя

Если ваш ISP не требует использования PAP/CHAP, вам нужны именно эти скрипты!

Если пакет ppp установлен правильно, вы должны иметь два файла примеров. Для PPP 2.1.2 они находятся в /usr/sbin , а для PPP 2.2 они находятся в /etc/ppp/scripts . Они называются

для PPP-2. 1.2

а для PPP-2. 2

ppp-off ppp-on ppp-on-dialer

Теперь, если Вы используете PPP 2.1.2, я настойчиво прошу вас удалить файлы примеров. С ними имеются потенциальные проблемы (и не сообщайте мне, что они прекрасно работают), я использовал их очень долго (и даже рекомендовал их в первой версии этого HOWTO)!

Для пользователя PPP 2.1.2 имеется ЛУЧШАя версия шаблона, взятая из дистрибутива PPP 2.2. Я предлагаю вам скопировать и использовать эти скрипты вместо старого скрипта PPP-2.1.2.

15.2 Скрипт ppp-on

Это первый из ПАРЫ скриптов, которые фактически запускают соединение.

#!/bin/sh # # Скрипт для инициации соединения PPP. Это первая часть из пары скриптов. # Это не секретные скрипты, так как коды видны командой ps. # Однако это пример. # # Это параметры. Измените их как нужно. TELEPHONE=555-1212 # Телефонный номер соединения ACCOUNT=george # Имя пользователя для входа ("George Burns") PASSWORD=gracie # Пароль для этого аккаунта (и "Gracie Allen") LOCAL_IP=0.0.0.0 # Локальный IP адрес, если известен. Динамический = 0.0.0.0 REMOTE_IP=0.0.0.0 # Удаленный IP адрес, если желателен. Обычно 0.0.0.0 NETMASK=255.255.255.0 # Соответствующая сетевая маска, если нужна # # Экспортируем их, чтобы они были доступны в "ppp-on-dialer" export TELEPHONE ACCOUNT PASSWORD # # Это расположение скрипта, который звонит по телефону и регистрируется в # системе. Пожалуйста, используйте абсолютное имя файла, так как опция connect # не использует переменную $PATH. (Если это сделать, то "root" аккаунт будет # дырой в защите, так что не просите.) # DIALER_SCRIPT=/etc/ppp/ppp-on-dialer # # Инициация соединения # # exec /usr/sbin/pppd debug /dev/ttySx 38400 \ $LOCAL_IP:$REMOTE_IP \ connect $DIALER_SCRIPT

Это скрипт ppp-on-dialer:

#!/bin/sh # # Это вторая часть скрипта ppp-on. Она выполняет установку желаемого # соединения. # /usr/sbin/chat -v \ TIMEOUT 3 \ ABORT "\nBUSY\r" \ ABORT "\nNO ANSWER\r" \ ABORT "\nRINGING\r\n\r\nRINGING\r" \ "" \rAT \ "OK-+++\c-OK" ATH0 \ TIMEOUT 30 \ OK ATDT$TELEPHONE \ CONNECT "" \ ogin:--ogin: $ACCOUNT \ assword: $PASSWORD

Для PPP-2.2, сценарий ppp-off примерно такой:

#!/bin/sh ###################################################################### # # Определить прерываемое устройство. # if [ "$1" = "" ]; then DEVICE=ppp0 else DEVICE=$1 fi ###################################################################### # # Если pid файл ppp0 есть, тогда программа работает. Остановить ее. if [ -r /var/run/$DEVICE.pid ]; then kill -INT `cat /var/run/$DEVICE.pid` # # Если kill не работает, тогда нет процесса, запущенного под этим pid. # Это может также означать, что существует посторонний lock файл. # Возможно, вы захотите удалить его. if [ ! "$?" = "0" ]; then rm -f /var/run/$DEVICE.pid echo "ERROR: Removed stale pid file" exit 1 fi # # Отлично. Пусть pppd поправит свой собственный недочет. echo "PPP link to $DEVICE terminated." exit 0 fi # # для ppp0 не запущен ppp процесс echo "ERROR: PPP link is not active on $DEVICE" exit 1

15.3 Редактирование скриптов запуска PPP

Поскольку новые скрипты приходят двумя частями, мы в свою очередь отредактируем их.

Скрипт ppp-on

Вы должны будете отредактировать скрипт чтобы вставить ВАШЕ имя пользователя на вашем ISP, ВАШ пароль на вашем ISP, номер телефона вашего ISP.

Каждая из строк типа TELEPHONE= - это фактически установленные переменные shell, которые содержат информацию справа от = (исключая комментарии, конечно). Отредактируйте каждую из этих строк так, чтобы они соответствовали вашему ISP и соединению.

Также, поскольку вы устанавливаете IP адрес (если вам это нужно) в файле /etc/ppp/options , УДАЛИТЕ строку, которая говорит

$LOCAL_IP:$REMOTE_IP \

Также, удостоверьтесь, что переменная оболочки DIALER_SCRIPT указывает на полный путь и имя скрипта для дозвона, который вы фактически собираетесь использовать. Так что, если вы переместили его или переименовали скрипт, удостоверьтесь, что вы отредактировали эту строку правильно в скрипте ppp-on !

Сценарий ppp-on-dialer

Это второй скрипт, который фактически поднимает нашу ppp связь.

Обратите внимание: chat скрипт обычно однострочный. Наклонные черты влево используются, чтобы разместить строки на нескольких физических строках (для удобочитаемости человеком) и не формировать часть скрипта самому.

Однако, очень полезно рассмотреть это подробно так, чтобы мы поняли, что же фактически (предположительно) происходит!

15.4 Что означает скрипт chat...

Скрипт chat - последовательность пар ожидаемая строка посылаемая строка . В частности обратите внимание, что мы ВСЕГДА ожидаем что-нибудь перед тем, как пошлем что-либо.

Если мы должны послать что-то БЕЗ того, чтобы сначала получить что-нибудь, мы должны использовать пустую строку ожидания (обозначаемую "") и аналогично для ожидания чего-либо без того, чтобы посылания чего-нибудь! Также, если строка состоит из нескольких слов, (например, NO CARRIER), вы должны взять строку в кавычки, чтобы chat вопринял ее как одно целое.

Строка chat в нашем шаблоне:

Exec /usr/sbin/chat -v

В вызове chat опция -v говорит, чтобы chat копировал ВЕСЬ ввод/вывод в систеный лог (обычно /var/log/messages). Как только вы убедитесь, что скрипт chat работает надежно, отредактируйте эту строку, чтобы удалить -v , чтобы не хранить ненужную информацию в вашем syslog

Это устанавливает паузу для получения ожидаемого ввода в 3 секунды. Вы можете увеличить это значение до 5 или 10 секунд, если вы используете медленный модем!

ABORT "\nBUSY\r"

Если получена строка BUSY , то операция аварийно прекращается

ABORT "\nNO ANSWER\r"

Если получена строка NO ANSWER , то операция аварийно прекращается

ABORT "\nRINGING\r\n\r\nRINGING\r"

Если (повторимся) получена строка RINGING , то операция аварийно прекращается.

Это потому, что кто-то сидит на вашей телефонной линии!

Не ожидаем ничего от модема, и послаем строку в него

OK-+++\c-OK ATH0

Это немного более сложно, поскольку использует некоторые из возможностей восстановления при ошибках chat .

What is says is... Ожидаем OK , если он не получен (потому что модем не в командном режиме), затем посылаем +++ (стандартная строка для Hayes-совместимых модемов, которая возвращает модем в командный режим) и ожидаем OK .

Затем посылаем ATH0 (строка для завершения связи модема). Это позволяет вашему скрипту справляться с вашим модемом, зависшим во время сеанса связи!

Установим паузу по времени в 30 секунд для оставшихся команд скрипта. Если вы испытываете проблемы со скриптом chat , прерывающимся из-за пауз, увеличьте это значение до 45 секунд или больше

OK ATDT$TELEPHONE

Ожидаем OK (ответ модема на команду ATH0) и набираем номер, на который мы хотим позвонить

Дожидаемся строки CONNECT (которую наш модем посылает, когда удаленные модем отвечает) и не посылаем в ответ ничего

Ogin:--ogin: $ACCOUNT

Снова, здесь мы вставляем кое-какое исправление ошибок. Ожидаем подсказку входа в систему (... ogin:), но если мы не получаем ее по истечении паузы, то посылаем возврат каретки и затем ищем подсказку входа в систему снова. Когда подсказка получена, посылаем username (сохраненное в переменной shell $ACCOUNT).

Assword: $PASSWORD

Ожидаем запроса пароля и посылаем наш пароль (аналогично сохраненный в переменной shell).

Этот скрипт chat имеет приемлемую возможность исправления ошибок. chat имеет значительно большее количество возможностей, чем показано здесь. Для подробной информации проконсультируйтесь с man chat (man 8 chat).

Запуск PPP на серверной стороне моединения

Хотя скрипт ppp-on-dialer отлично подходит для серверов, которые автоматически запускают pppd на серверной стороне как только вы зарегистрировались, некоторые серверы требуют, чтобы вы явно дали команду запуска PPP на сервере.

Если вы должны дать команду, чтобы запустить PPP на сервере, вы должны отредактировать скрипт ppp-on-dialer .

В КОНЦЕ сценария (после строки пароля) добавьте дополнительную пару ожидаемой-посылаемой строк, которая искала бы вашу подсказку регистрации в системе (отличая символы, которые имеют специальное значение в оболочке Bourne: типа $ и [ или ] (открытые и закрытые квадратные скобки).

Как только программа chat нашла командную строку оболочки, она должна выдать команду запуска ppp , требуемую для PPP сервера вашего ISP.

В моем случае, мой PPP сервер использует стандартную подсказку bash Linux

и требует, чтобы я напечатал

чтобы запустить PPP на сервере.

Хорошо бы учесть здесь некоторые ошибки, так например в моем случае я использую

Hartr--hartr ppp

Это значит, что если мы не получили подсказку в течении заданной паузы, то посылаем возврат каретки и ищем подсказку снова.

Как только подсказка получена, посылаем строку ppp .

Не забудьте добавить \ к концу предыдущей строки, так что бы chat думал, что весь сценарий chat состоит из одной строки!

К сожалению, на некоторых серверах набор подсказок часто меняется!

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

15.5 Сценарий chat для соединения PAP/CHAP

Если ваш ISP использует PAP/CHAP, то ваш сценарий chat намного более простой.

Весь ваш сценарий chat должен делать вот что: звонить по номеру телефона, ждать соединения и затем позволить pppd обработать регистрацию в системе!

#!/bin/sh # # This is part 2 of the ppp-on script. It will perform the connection # protocol for the desired connection. # exec /usr/sbin/chat -v \ TIMEOUT 3 \ ABORT "\nBUSY\r" \ ABORT "\nNO ANSWER\r" \ ABORT "\nRINGING\r\n\r\nRINGING\r" \ "" \rAT \ "OK-+++\c-OK" ATH0 \ TIMEOUT 30 \ OK ATDT$TELEPHONE \ CONNECT "" \

15.6 Отладка pppd и опция file option_file

Как мы уже видели, вы можете включить отладочную информацию опцией -d в pppd . Опция debug эквивалентна ей.

Поскольку мы устанавливаем новое соединение с новым скриптом, сейчас поставьте опцию отладки.

Если у вас мало дискового пространства, то логи pppd могут быстро увеличить ваш файл syslog и создать вам проблему.

Как только вы обрадуетесь, что все работает правильно, можете удалить эту опцию.

Если вы назвали ваш ppp файл опций как-нибудь иначе, чем /etc/ppp/options , или /etc/ppp/options.ttySx , определите имя файла опцией file в pppd , например

Exec /usr/sbin/pppd debug file options.myserver /dev/ttyS0 38400 \

Пишем скрипты в Linux (обучение на примерах)

———————————————————————————-

1. Введение

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

Зачем нужны скрипты
Во-первых, администрирование linux-сервера в той или иной степени сводится к систематическому выполнению одних и тех же команд. Причем не обязательно, чтобы эти команды выполнял человек. Их можно запрограммировать на выполнение машиной.
Во-вторых, даже просто выполнение обычной задачи, которая (вдруг) составляет 20-1000… однообразных операций ГОРАЗДО проще реализовать в скрипте.

Что такое скрипт
Скрипт — набор инструкций, которые должен в определенном порядке и в определенное время выполнить компьютер. Инструкциями могут быть как внутренние команды оболочки (циклы, условия, обработка текстовой информации, работа с переменными окружения и прочее), так и любая программа, выполняемая нами в консоли с необходимыми параметрами.

Как писать скрипт
В нашем случае скрипт будет представлять из себя текстовый файл с атрибутами выполнения. Если файл сценария начинается с последовательности #!, которая в мире UNIX называется sha-bang, то это указывает системе какой интерпретатор следует использовать для исполнения сценария. Если это трудно понять, то просто запомните, что все скрипты мы будем начинать писать именно со строчки #!/bin/bash или #!/bin/sh, а далее пойдут команды и комментарии к ним.

Напутствие
Я Вам искренне советую писать как можно больше комментариев чуть ли ни к каждой строчке в скрипте. Пройдет время и Вам понадобится изменить или модернизировать написанный когда-то скрипт. Если не помнишь или не понимаешь, что написано в скрипте, то становится сложно его изменять, проще писать с нуля.

Какие скрипты могут нам понадобиться:

    устанавливающий правила файервола при загрузке системы.
    выполняющий backup настроек и данных.
    запускающий в определенное время (лучше каждую ночь) программу, которая сканирует логи прокси-сервера и выдает удобный web-отчет по количеству скачанного трафика.
    отправляющий нам на почту информацию о том, что кто-то получил доступ к нашему серверу по ssh, время подключения и адрес клиента.

О методике написания скриптов
Создаем текстовый файл, редактируем его, устанавливаем права на выполнение, запускаем, смотрим ошибки, исправляем, запускаем, смотрим ошибки…
Когда все вылизано и работает правильно, ставим его в автозагрузку либо в планировщик на определенное время.

———————————————————————————-

2. Обучение написанию сценариев на внутреннем языке BASH
оригинал: https://www.linuxconfig.org/Bash_scripting_Tutorial

Это руководство предполагает отсутствие предварительных знаний о методике написания сценариев (далее скриптов) с помощью внутреннего языка Bash. С помощью данного руководства вы обнаружите в скором времени, что написание скриптов очень простая задача. Давайте начнем наше обучение с простого сценария, выполняющего вывод строки «Hello World!» (в перев. с англ. — Всем привет!)

1. Сценарий «Всем привет»
Вот ваш первый пример bash-скрипта:

#!/bin/bash
echo «Hello World»

Переходим в директорию, содержащую наш файл hello_world.sh и делаем его исполняемым:

Код: Выделить всё $ chmod +x hello_world.sh

Запускаем скрипт на выполнение

Код: Выделить всё $ ./hello_world.sh

2. Простой архивирующий bash-скрипт

#!/bin/bash
tar -czf myhome_directory.tar.gz /home/user

Код: Выделить всё $ ./backup.sh

$ du -sh myhome_directory.tar.gz
41M myhome_directory.tar.gz

3. Работа с переменными
В данном примере мы объявляем простую переменную и выводим её на экран с помощью команды echo

#!/bin/bash
STRING=»HELLO WORLD!!!»
echo $STRING

Код: Выделить всё $ ./hello_world.sh
HELLO WORLD!!!

Наш архивирующий скрипт с переменными:

#!/bin/bash
OF=myhome_directory_$(date +%Y%m%d).tar.gz
IF=/home/user
tar -czf $OF $IF

Код: Выделить всё $ ./backup.sh
tar: Removing leading "\" from member names
$ du -sh *tar.gz
41M myhome_directory_20100123.tar.gz

3.1 Глобальные и локальные переменные

#!/bin/bash
# Объявляем глобальную переменную
# Такая переменная может использоваться в любом месте этого скрипта
VAR=»global variable»
function bash {
# Объявляем локальную переменную
# Такая переменная действительна только для функции, в которой её объявили
local VAR=»local variable»
echo $VAR
}
echo $VAR
bash
# Обратите внимание, что глобальная переменная не изменилась
echo $VAR

Код: Выделить всё $ ./variables.sh
global variable
local variable
global variable

4. Передаем аргументы в скрипт

#!/bin/bash
# Используйте предопределенные переменные для доступа к аргументам
# Выводим аргументы на экран
echo $1 $2 $3 ‘ -> echo $1 $2 $3’

#Мы так же можем получить доступ к аргументам через специальный массив args=(«$@»)
# Выводим аргументы на экран
echo ${args} ${args} ${args} ‘ -> args=(«$@»); echo ${args} ${args} ${args}’

# Используйте переменную $@ для вывода всех аргументов сразу
echo $@ ‘ -> echo $@’

Используйте переменную $# для вывода количества переданный в скрипт аргументов
echo Number of arguments passed: $# ‘ -> echo Number of arguments passed: $#’

Код: Выделить всё $ ./arguments.sh Bash Scripting Tutorial
Bash Scripting Tutorial -> echo $1 $2 $3
Bash Scripting Tutorial -> args=("$@"); echo ${args} ${args} ${args}
Bash Scripting Tutorial -> echo $@
Number of arguments passed: 3 -> echo Number of arguments passed: $#

5. Выполнение в скрипте команд оболочки

#!/bin/bash
# используйте обратные кавычки » ` ` » для выполнения команды оболочки
echo `uname -o`
# теперь попробуем без кавычек
echo uname -o

Код: Выделить всё $ uname -o
GNU/Linux
$ ./bash_backtricks.sh
GNU/Linux
uname -o

Как видим, во втором случае вывелась сама команда, а не результат её выполнения

6. Читаем пользовательский ввод (интерактивность)

#!/bin/bash
echo -e «Hi, please type the word: \c »
read word
echo «The word you entered is: $word»
echo -e «Can you please enter two words? »
read word1 word2
echo «Here is your input: \»$word1\» \»$word2\»»
echo -e «How do you feel about bash scripting? »
# read command now stores a reply into the default build-in variable $REPLY
read
echo «You said $REPLY, I’m glad to hear that! »
echo -e «What are your favorite colours ? »
# -a makes read command to read into an array
read -a colours
echo «My favorite colours are also ${colours}, ${colours} and ${colours}:-)»

Код: Выделить всё $ ./read.sh
Hi, please type the word: something
The word you entered is: something
Can you please enter two words?
Debian Linux
Here is your input: "Debian" "Linux"
How do you feel about bash scripting?
good
You said good, I"m glad to hear that!
What are your favorite colours ?
blue green black
My favorite colours are also blue, green and black:-)

7. Использование ловушки

#!/bin/bash
# объявляем ловушку
trap bashtrap INT
# очищаем экран
clear;
# функция ловушки выполняется, когда пользователь нажимает CTRL-C:
# На экран будет выводиться => Executing bash trap subrutine !
# но скрипт будет продолжать выполняться
bashtrap()
{
echo «CTRL+C Detected !…executing bash trap !»
}
# скрипт будет считать до 10
for a in `seq 1 10`; do
echo «$a/10 to Exit.»
sleep 1;
done
echo «Exit Bash Trap Example!!!»

Код: Выделить всё $ ./trap.sh
1/10
2/10
3/10
4/10
5/10
6/10

7/10
8/10
9/10
CTRL+C Detected !...executing bash trap !
10/10
Exit Bash Trap Example!!!

Как видим, сочетание клавишь Ctrl-C не остановило выполнение скрипта.

8. Массивы
8.1 Объявляем простой массив

#!/bin/bash
# Объявляем простой массив с 4 элементами
ARRAY=(‘Debian Linux’ ‘Redhat Linux’ Ubuntu Linux)
# Получаем количество элементов в массиве
ELEMENTS=${#ARRAY[@]}

# выводим в цикле каждый элемент массива
for ((i=0;i<$ELEMENTS;i++)); do
echo ${ARRAY[${i}]}
done

Код: Выделить всё $./arrays.sh
Debian Linux
Redhat Linux
Ubuntu
Linux

8.2 Заполняем массив значениями из файла

#!/bin/bash
# Объявляем массив
declare -a ARRAY
# Команда exec # stdin (обычно это клавиатура), будет производиться из этого файла. Это дает возможность читать
# содержимое файла, строку за строкой, и анализировать каждую введенную строку с помощью sed и/или awk.
exec 10 let count=0

while read LINE <&10; do

ARRAY[$count]=$LINE
((count++))
done

echo Number of elements: ${#ARRAY[@]}
# Вывод значений массива
echo ${ARRAY[@]}
# закрываем файл
exec 10>&-

Код: Выделить всё $ cat bash.txt
Debian Linux
Redhat Linux
Ubuntu
Linux
$ ./arrays.sh
Number of elements: 4
Debian Linux Redhat Linux Ubuntu Linux

9. Условия «если-то-иначе»
9.1. Простое использование «если-иначе» условий
Обратите внимание на пробелы в квадратных скобках, без которых условие работать не будет.

#!/bin/bash
directory=»./BashScripting»

# проверяем наличие директории
if [ -d $directory ]; then
echo «Directory exists»
else
echo «Directory does not exists»
fi

Код: Выделить всё $ ./if_else.sh
Directory does not exists
$ mkdir BashScripting
$ ./if_else.sh
Directory exists

9.2 Вложенные «если-иначе» условия

#!/bin/bash
# Объявляем переменную со значением 4
choice=4
# Выводим на экран
echo «1. Bash»
echo «2. Scripting»
echo «3. Tutorial»

# Выполняем, пока переменная равна четырем
# Зацикливание
while [ $choice -eq 4 ]; do

# читаем пользовательский ввод
read choice
# вложенное «если-иначе» условие
if [ $choice -eq 1 ] ; then

echo «You have chosen word: Bash»

if [ $choice -eq 2 ] ; then
echo «You have chosen word: Scripting»
else

if [ $choice -eq 3 ] ; then
echo «You have chosen word: Tutorial»
else
echo «Please make a choice between 1-3 !»
echo «1. Bash»
echo «2. Scripting»
echo «3. Tutorial»
echo -n «Please choose a word ? »
choice=4
fi
fi
fi
done

Код: Выделить всё $ ./nested.sh
1. Bash
2. Scripting
3. Tutorial

5

1. Bash
2. Scripting
3. Tutorial
Please choose a word ?
4
Please make a choice between 1-3 !
1. Bash
2. Scripting
3. Tutorial
Please choose a word ?
3
You have chosen word: Tutorial

Таким образом сначала тело цикла «while» выполняется, т.к. переменная choice изначально равна четырем. Потом читаем в неё пользовательский ввод, и если ввод не равен 1,2 или 3 то делаем нашу переменную снова равную 4, в связи с чем тело цикла повторяется (снова необходимо вводить 1,2 или 3).

10. Сравнения
10.1 Арифметические сравнения

Lt <
-gt >
-le <=
-ge >=
-eq ==
-ne !=

#!/bin/bash

NUM1=2
NUM2=2
if [ $NUM1 -eq $NUM2 ]; then
echo «Both Values are equal»
else
echo «Values are NOT equal»
fi

Код: Выделить всё $ ./equals.sh
Both Values are equal

#!/bin/bash
# Объявляем переменные с целочисленными значениями
NUM1=2
NUM2=3
if [ $NUM1 -eq $NUM2 ]; then
echo «Both Values are equal»
else
echo «Values are NOT equal»
fi

Код: Выделить всё $ ./equals.sh
Values are NOT equal

#!/bin/bash
# Объявляем переменные с целочисленными значениями
NUM1=2
NUM2=1
if [ $NUM1 -eq $NUM2 ]; then
echo «Both Values are equal»
elif [ $NUM1 -gt $NUM2 ]; then
echo «$NUM1 is greater then $NUM2»
else
echo «$NUM2 is greater then $NUM1»
fi

Код: Выделить всё $ ./equals.sh
2 is greater then 1

10.2 Символьно-текстовые сравнения

Одинаковые
!= не одинаковые
< меньще чем
> больше чем
-n s1 переменная s1 не пустая
-z s1 переменная s1 пустая

#!/bin/bash

S1=»Bash»

S2=»Scripting»
if [ $S1 = $S2 ]; then

else
echo «Strings are NOT equal»
fi

Код: Выделить всё $ ./statement.sh
Strings are NOT equal

#!/bin/bash
# Объявляем символьную переменную S1
S1=»Bash»
# Объявляем символьную переменную S2
S2=»Bash»
if [ $S1 = $S2 ]; then
echo «Both Strings are equal»
else
echo «Strings are NOT equal»
fi

Код: Выделить всё $ ./statement.sh
Both Strings are equal

11. Проверка файлов

B filename Block special file
-c filename Special character file
-d directoryname Check for directory existence
-e filename Check for file existence
-f filename Check for regular file existence not a directory
-G filename Check if file exists and is owned by effective group ID.
-g filename true if file exists and is set-group-id.
-k filename Sticky bit
-L filename Symbolic link
-O filename True if file exists and is owned by the effective user id.
-r filename Check if file is a readable
-S filename Check if file is socket
-s filename Check if file is nonzero size
-u filename Check if file set-ser-id bit is set
-w filename Check if file is writable
-x filename Check if file is executable

#!/bin/bash
file=»./file»
if [ -e $file ]; then
echo «File exists»
else
echo «File does not exists»
fi

Код: Выделить всё $ ls
file.sh
$ ./file.sh
File does not exists
$ touch file
$ ls
file file.sh
$ ./file.sh
File exists

Аналогично для примера мы можем использовать «в то время как» петли, чтобы проверить, если файл не существует. Этот сценарий будет спать, пока файл не существует. Обратите внимание на Bash отрицатель «!» что сводит на нет (инвертирует) -e опцию.

12. Циклы
12.1. Цикл For

#!/bin/bash
# for цикл
for f in $(ls /var/); do
echo $f
done

Запуск for-цикла из командной строки bash:

Код: Выделить всё $ for f in $(ls /var/); do echo $f; done Код: Выделить всё $ for f in $(ls /var/); do echo $f; done
backups
cache
crash
games
lib
local
lock
log
mail
opt
run
spool
tmp
www

12.2. While цикл

#!/bin/bash
COUNT=6
# while цикл
while [ $COUNT -gt 0 ]; do

let COUNT=COUNT-1
done

Код: Выделить всё $ ./while_loop.sh
Value of count is: 6
Value of count is: 5
Value of count is: 4
Value of count is: 3
Value of count is: 2
Value of count is: 1

12.3. Until цикл

#!/bin/bash
COUNT=0
# until цикл
until [ $COUNT -gt 5 ]; do
echo Value of count is: $COUNT
let COUNT=COUNT+1
done

Код: Выделить всё $ ./until_loop.sh
Value of count is: 0
Value of count is: 1
Value of count is: 2
Value of count is: 3
Value of count is: 4
Value of count is: 5

12.4. Циклы с неявными условиями
В следующем примере условием while-цикла является наличие стандартного ввода.
Тело цикла будет выполняться пока есть чему перенаправляться из стандартного вывода в команду read.

#!/bin/bash
# Данный скрипт будет искать и удалять пробелы
# в файлах, заменяя их на подчеркивания
DIR=».»
Управление циклом с командой read путем перенаправления вывода в цикле.
find $DIR -type f | while read file; do
# используем POSIX-класс [:space:] чтобы найти пробелы в именах файлов
if [[ «$file» = *[[:space:]]* ]]; then
# замена пробелов подчеркиваниями
mv «$file» `echo $file | tr ‘ ‘ ‘_’`
fi;
done

Код: Выделить всё $ ls -1
script.sh
$ touch "file with spaces"
$ ls -1
file with spaces
script.sh
$ ./script.sh
$ ls -1
file_with_spaces
script.sh

13. Функции

#!/bin/bash
# Функции могут быть объявлены в любом порядке
function function_B {
echo Function B.
}
function function_A {
echo $1
}
function function_D {
echo Function D.
}
function function_C {
echo $1
}
# Вызываем функции
# передаем параметр в функцию function A
function_A «Function A.»
function_B
# передаем параметр в функцию function C
function_C «Function C.»
function_D

Код: Выделить всё $ ./functions.sh
Function A.
Function B.
Function C.
Function D.

14. Оператор выбора — Select

#!/bin/bash
PS3=’Choose one word: ‘
# select
select word in «linux» «bash» «scripting» «tutorial»
do
echo «The word you have selected is: $word»
# Прерываем, в противном случае цикл будет бесконечный.
break
done
exit 0

Код: Выделить всё $ ./select.sh
1) linux
2) bash
3) scripting
4) tutorial
Choose one word: 4
The word you have selected is: tutorial

15. Оператор выбора — Case

#!/bin/bash
echo «What is your preferred programming / scripting language»
echo «1) bash»
echo «2) perl»
echo «3) phyton»
echo «4) c++»
echo «5) I do not know !»
read case;
# простая структура case-выбора
# обратите внимание, что в данном примере $case — всего лишь переменная
# и не обязана так называться. Это лишь пример
case $case in
1) echo «You selected bash»;;
2) echo «You selected perl»;;
3) echo «You selected phyton»;;
4) echo «You selected c++»;;
5) exit
esac

Код: Выделить всё $ ./case.sh
What is your preferred programming / scripting language
1) bash
2) perl
3) phyton
4) c++
5) I do not know !
4
You selected c++

———————————————————————————-

Более подробную информацию можно получить из различных источников, например отсюда
оригинал: https://www.linuxconfig.org/Bash_scripting_Tutorial
https://ruslandh.narod.ru/howto_ru/Bash-Prog-Intro/
https://bug.cf1.ru/2005-03-17/programmin … -book.html

https://ubuntologia.ru/forum/viewtopic.php?f=109&t=2296

Если на вопрос: «как добавить программу в автозагрузку?» — начинающие пользователи находят ответ достаточно быстро, то вопрос о запуске скрипта, при выключении/перезагрузки, ставит их в тупик. В статье будет описан стандартный способ для автоматического выполнения команд при включении и выключении linux, а также более простой способ для пользователей, у которых установлен gdm и графический интерфейс, например ubuntu.

Консольный вариант.

Немного теории.
Следует знать, что в Linux существует 7 уровней запуска. Однако, использоваться могут только 6.
Как у всех уважающих себя программ отсчёт начинается с 0-ля.
0 — Остановка или выключение системы.
1 — Однопользовательский режим.
2 — Многопользовательский режим, но без поддержки сети.
3 — Тоже самое, но с сетью.
4 — Добавили для красоты Не используется.
5 — Графический режим с загрузкой X сервера.
6 — Перезагрузка.
Если перейти в папку /etc (В некоторых дистрибутивах /etc/rc.d) то можно увидеть папки с 7-мью уровнями запуска.

Например при выключении компьютера, выполнятся все скрипты из папки rc0.d


Тут следует остановится по подробнее. Дело в том, что самих скриптов (а точнее сценариев) в этой папке нету, а есть только ссылки на файлы, которые лежат в папке /etc/init.d. Эти сценарии выполняют различные задачи, в зависимости от параметра start или stop (например /etc/init.d/reboot start и /etc/init.d/reboot stop это разные команды, а /etc/init.d/reboot вообще не будет работать). Если в ссылке стоит первая буква S, то значит сценарию подаётся параметр start, а если стоит буква K(от слова kill), то параметр stop. Цифра после буквы обозначает порядок выполнения сценария.
Например, на выше вставленном скриншоте вначале выполниться команда /etc/init.d/hddtemp stop, а уже позже /etc/init.d/networking start.
Хватит теории. Переходим к практике.
Для того, чтобы добавить команду в автозагрузку, достаточно поместить её в файл /etc/rc.local.

В этой части статьи в качестве редактора будет использоваться nano, но вы можете пользоваться своим любимым редактором, например gedit.

sudo nano /etc/rc.local

И помещаем наши команды чуть выше строчки с exit 0.
Для того, что бы команды выполнялись перед выключением или перезагрузкой нам нужно создать сценарий в папке /etc/init.d

sudo nano /etc/init.d/имя_сценария

Вставляем следующий код:

#! /bin/sh
case "$1" in
start)
echo "подан сигнал start"
;;
stop)
echo "подан сигнал stop"
;; esac

Если будет подаваться только один сигнал, то просто закомментируйте строку поставив в начале команды знак #
Например

...
case "$1" in
start)
#
;;
...

Теперь делаем файл исполняемым:

sudo chmod +x /etc/init.d/имя_сценария

sudo update-rc.d имя_сценария start 20 0 6 . stop 1 0 6 .

Точки важны (обе). Исследуя просторы интернета, у меня сложилось впечатление, что синтаксис этой программы иногда меняется. Актуальные примеры можно посмотреть по команде «man update-rc.d». Примеры будут в низу.

Эта команда создаст по 2 ссылки в каталогах /etc/rc0 .d (второе число в команде) и /etc/rc6 .d (третье число в команде). Причём вначале будет выполняться сценарий с параметром stop (т.к. стоит 1), а уже потом с параметром start (т.к. стоит 20).
Если второй параметр не нужен, то можно выполнить команду:

sudo update-rc.d имя_сценария stop 1 0 6 .

Советую ставить приоритет повыше (т.е. число после start или stop должно быть маленьким), желательно меньше 20. В обратном случае у меня иногда зависал компьютер при попытке перезагрузиться.

Для пользователей ubuntu, да и многих других современных дистрибутивов с gdm можно воспользоваться…

Графический вариант.

Что касается автозагрузки то можно воспользоваться способом описанным .
Или просто открыть «автоматически запускаемые приложения» командой:

gnome-session-properties

Для выполнения скрипта при выключении компьютера, помещаем его в файл /etc/gdm/PostSession/Default

sudo gedit /etc/gdm/PostSession/Default

Прямо над строчкой exit 0.

Скрипт командной оболочки представляет собой последовательность команд, которую вы можете использовать многократно. Исполнение этой последовательности, как правило, осуществляется с помощью ввода в командной строке имени скрипта. Кроме того, с помощью cron вы можете использовать скрипты для автоматизации выполнения задач. Другое применение скриптов - процедура загрузки и остановки системы UNIX, когда в скриптах init определяются операции с демонами и сервисами.

Чтобы создать скрипт командной оболочки, откройте в вашем редакторе новый пустой файл. Для этого можно использовать любой текстовый редактор: vim , emacs , gedit , dtpad и т. д.; подойдет любой. Однако, вы можете выбрать более продвинутый редактор, такой как vim или emacs , поскольку такие редакторы можно настроить на распознавание синтаксиса командной оболочки и Bash и они могут оказаться хорошим подспорьем по предотвращению таких ошибок, которые часто делают новички, например, забывают закрывать скобки и ставить точки с запятой.

Набирайте команды UNIX в новом пустом файле точно также, как если бы вы вводили их в командной строке. Как уже говорилось в предыдущей главе (смотрите раздел "Выполнение команды"), команды могут быть функциями командной оболочки, встроенными командами, командами UNIX или другими скриптами.

Выберите для вашего скрипта мнемоничное имя, которое бы говорило, что скрипт делает. Убедитесь, что имя вашего скрипта не конфликтует с существующими командами. Чтобы не возникало никакой путаницы, имена скриптов часто заканчиваются расширением.sh. Тем не менее, в вашей системе могут существовать и другие скрипты с тем же именем, которое вы выбрали. С помощью команд which , whereis и других поищите информацию об уже существующих программах и файлах в таким именем:

Which -a script_name whereis script_name locate script_name (прим.пер. : вместо script_name укажите имя своего скрипта ).

Скрипт script1.sh

В этом примере мы используем команду echo , встроенную в Bash, которая перед тем, как будут выданы выходные данные, проинформирует пользователя о том, что должно быть сделано. Настоятельно рекомендуется информировать пользователей о том, что делает скрипт с тем, чтобы пользователи не нервничали в случае, если им покажется, что скрипт ничего не делает . Мы вернемся к теме оповещения пользователей в главе 8 "Пишем интерактивный скрипт".


Рис.2.1. Скрипт script1.sh

Напишите такой же скрипт для себя. Хорошей идеей было бы создать директорий ~/scripts , в котором будут находиться ваши скрипты. Добавьте этот директорий к содержимому переменной PATH:

Export PATH="$PATH:~/scripts"

Если вы только знакомитесь с Bash, используйте текстовый редактор, в котором для различных конструкций оболочки используются различные цвета. Подсветка синтаксиса поддерживается в vim , gvim , (x)emacs , kwrite и во многих других редакторах, смотрите документацию к вашему любимому редактору.

Выполнение скрипта

Для того, чтобы скрипт можно было запускать, он должен для соответствующих пользователей иметь права на запуск. После того, как вы установите права доступа, проверьте, что вы действительно установили те права, которые вам нужны. Когда это будет сделано, скрипт можно будет запускать точно также, как и любую другую команду:

Willy:~/scripts> chmod u+x script1.sh willy:~/scripts> ls -l script1.sh -rwxrw-r-- 1 willy willy 456 Dec 24 17:11 script1.sh willy:~> script1.sh The script starts now. Hi, willy! I will now fetch you a list of connected users: 3:38pm up 18 days, 5:37, 4 users, load average: 0.12, 0.22, 0.15 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT root tty2 - Sat 2pm 4:25m 0.24s 0.05s -bash willy:0 - Sat 2pm ? 0.00s ? - willy pts/3 - Sat 2pm 3:33m 36.39s 36.39s BitchX willy ir willy pts/2 - Sat 2pm 3:33m 0.13s 0.06s /usr/bin/screen I"m setting two variables now. This is a string: black And this is a number: 9 I"m giving you back your prompt now. willy:~/scripts> echo $COLOUR willy:~/scripts> echo $VALUE willy:~/scripts>

Это наиболее обычный способ выполнить скрипт. Предпочтительно выполнять скрипты, подобные этому, в подоболочке. Переменные, функции и псевдонимы, создаваемые в этой подоболочке, известны только в этой конкретной сессии bash в этой подоболочке. Когда происходит выход из этой оболочки и управление получает родительская оболочка, все настройки очищаются и будут забыты все изменения, которые были сделаны с помощью скрипта в состоянии этой оболочки.

Если вы в переменной PATH не указали директорий scripts или. (текущий каталог), вы можете активировать скрипт следующим образом:

./script_name.sh

Также можно выполнить скрипт внутри имеющейся оболочки, но это обычно делается только в случае, если вы хотите получить специальные возможности, например, если нужно проверить, работает ли скрипт с другой оболочкой, или выдать трассировку с целью отладки (прим.пер. - вместо script_name укажите имя своего скрипта):

Rbash script_name.sh sh script_name.sh bash -x script_name.sh

Указанная командная оболочка будет запущена как подоболочка вашей текущей оболочки и выполнит скрипт. Это делается, когда вы хотите, чтобы скрипт был запущен с конкретными параметрами или при определенных условиях, которые не указаны в самом скрипте.

Если вы не хотите запускать новую командную оболочку, а хотите выполнить скрипт в текущей оболочке, используйте команду source:

Source script_name.sh

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

Willy:~/scripts> source script1.sh --output ommitted-- willy:~/scripts> echo $VALUE 9 willy:~/scripts>

Для написания простого скрипта на bash , нам потребуется выполнить следующие простые действия:

Как это все работает:

первая строка нашего скрипта #!/bin/bash крайне необходима, для того, чтобы наш скрипт успешно выполнился.

вторая строка mkdir testdir создает каталог testdir

третья строка cd testdir позволяет перейти в созданный каталог testdir

команда touch в следующей строке touch file1 file2 file3 создает три файла

и последняя команда в строке нашего скрипта ls -al позволяет вывести на экран содержимое текущего каталога, в котором, благодаря предыдущей строке, появилось три пустых файла.

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

Если вы ежедневно выполняете цепочку каких-либо одинаковых команд (с постоянными параметрами) в Linux, то возможно вам имеет смысл написать такой же простой скрипт на bash , который позволит вам сэкономить ваше время и автоматизировать вашу работу.