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

Решение

Собственно задача до безобразия простая. Написать скрипт, который будет копировать файл можно за минуту. Мы знаем, что команда для копирования файлов в shell . Потому, сделав мы скопируем все файлы в нужный каталог. Но как мы узнаем о том, что это уже произошло? Ведь главное преимущество UNIX-систем заключается в том, что человек командует этой ОС, а не ОС человеком. Соответственно, мы хотим видеть всё, что происходит в нашей системе.

Как нам известно, имеется три файловых дескриптора:

  • стандартный ввод
  • стандартный вывод
  • стандартный вывод ошибки

Можно, конечно, открыть и другие потоки вывода. Shell имеет богатые средства для манипулирования ими. Итак вот они (file — это файл, в который мы будем писать сообщения из скрипта):

  • >file — Перенаправление стандартного вывода в файл file
  • >>file — Перенаправление стандартного вывода в file, но при этом старые записи удаляться не будут,. Новые записи будут добавлять к старым в конец файла
  • — Перенаправление стандартного ввода из файла file
  • proc1|proc2 — Перенаправление стандартного вывода процесса proc1 на стандартный ввода proc2
  • n>file — Перенаправление дескриптора с номером n в файл file
  • n>>file — То же самое, но с добавление в конец файла
  • n — Слияние потоков с дескрипторов n1 и n2
  • — Ввод до подстроки string (>)

Собственно вся необходимая нам информация, которой мы будем оперировать есть, теперь осталось внедрить нашу задачу в жизнь. Итак, мы хотим видеть, как происходило копирование файла из одной директории в другую. Для этого создаём файл и делаем его исполняемым скриптом. Как это делать рассказано в прошлой теме. Читать прошлую тему

Итак, вот код нашего скрипта: каким бы он был, если бы мы кроме копирования ничего от него не требовали бы:

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

и после этого, каждый раз, когда скрипт будет выполняться, в нашем файле лога (/usr/logs/file) будут появляться новые записи.

Итак, скрипт теперь будет выглядить вот так:

Теперь, если мы поместим файл скрипта в cron, где укажем ему запускаться каждую минуту, и открыв файл /usr/logs/file с помощью команды tail -f, то бишь , в нашем окне будет видно, как происходит копирование файлов из директории /usr/dir1 в директорию /usr/dir2 с уведомлением о том, что скрипт запущен и остановлен. Если при копировании возникнет какая-то ошибка и файл скопирован не будет, то вы не увидите последней строки, а значит, скрипт отработал не до конца и в какой-то строке ошибка.

Последняя строка покажет нам, что находится в каталоге, в который мы копировали. Для более подробного процесса логирования можно применить оператор test и применить конструкцию выбора if-fi, но о них позже напишу. Оператор test умеет анализировать файлы и каталоги. А на основе результата анализа можно будет делать выбор.

Таким образом, всё что ты хочешь логировать в каком-то файле, можешь реализовать это с помощью дескриптора >>.

Через месяц, когда файл станет огромен, мы его заархивируем с помощью другого скрипта, и почистим для новых записей. Всё это также реализуется на скриптах. Тут уже включайте свою фантазию, как это сделать 🙂

Я показал понятный пример использования логирования наших скриптов. Остальное ты должен узнать сам, как делать, так как простой «копи-паст» не желателен. Теперь только я могу делать «копи-паст» из этой статьи 🙂

Удачи тебе, начинающий сисадмин 🙂

Ссылки:

К содержанию

Как работают скрипты

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

Теперь о том, как работают скрипты. Это обычные файлы, которые содержат текст. Но если для них установлен атрибут исполняемости, то для их открытия используется специальная программа — интерпретатор, например, оболочка bash. А уже интерпретатор читает последовательно строку за строкой и выполняет все команды, которые содержатся в файле. У нас есть несколько способов выполнить запуск скрипта linux. Мы можем запустить его как любую другую программу через терминал или же запустить оболочку и сообщить ей какой файл нужно выполнять. В этом случае не нужно даже флага исполняемости.

Почему это сложный путь?

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

или вы можете запустить и перенаправить вывод в файл:

или вы можете отфильтровать вывод для ключевых слов (например, «яблоки»), а затем перенаправить на файл:

Есть тысячи вещей, которые вы можете сделать для этого файла, просто набрав несколько команд.

Еще один, вы можете загрузить файл из Интернета с помощью одной простой команды:

И затем откройте файл следующим образом:

.bashrc: автозапуск скриптов при запуске терминала

Если вам требуется выполнять какие-то действия при запуске терминала ssh, вы можете добавить любую команду или выполнение скрипта в .bash_profile или .bashrc. Теоретически, вы можете добавить какое-либо действие в любой из этих файлов, оно выполнится в любом случае. Обычно все необходимое добавляется в .bashrc, а сам .bashrc запускают из .bash_profile.

Я добавил в файл .bashrc команду на рестарт веб-сервиса nginx:

После этого сохранил файл и перезапустил терминал:

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

Или вы хотите, чтобы при запуске терминала, вы сразу попадали в нужную вам директорию и запускали mc, добавьте в .bashrc

Надеюсь эта статья по управлению автозапуском сервисов и скриптов в LInux (статья писалась для CentOS) оказалась полезной для вас. Наверняка тем, кто только познает азы системного администрирования Linux, это информация будет кстати.

Bash скрипты Linux для чайников

Конструкцию bash допускается описать в 7 обязательствах подобным типом: «вызов командного интерпретатора — тело bash скрипта — окончание скрипта». Сочиняются скрипты с поддержкой различного текстового редактора, хранятся они как текстовые компьютерные данные. Но, чтобы было комфортнее, я храню их в совокупности с расширением «*.sh». Но давайте поглядим на все это на образце определенной цели. Есть использование, которое нужно запускать с достаточно большим комплектом характеристик. Стартовать потребуется зачастую, а каждый раз вводить эти характеристики лень. Чтоб являлось определеннее, поглядим, как выглядит это воздействие:

Для этого script-a давайте использовать интерпретатор bash. Первостепенным процессом нам с вами необходим вызов интерпретатора. Открываем текстовый редактор и пишем код.

Добавим эту операцию с учетом введенных переменных:

Текст, который будем вносить в логи будет таким:text=»Баланс пользователя «user» пополнен на «cash» рублей в time»

Аргумент text варьируется в связи от переменных user, cash и time

Теперь, когда нам нужно положить кому-нибудь денежку, мы запускаем скрипт командой «sh sgconf.sh», вводим имя плательщика и сумму платежа. Никаких длинных строчек, никакой головной боли с постоянным вводом одних и тех же значений.

Характерные черты исполняемых файлов в Linux

Пользователи, активно применяющие в повседневной работе операционную систему Windows, свыкнули к тому, что программы имеют расширение «.exe». Такие файлы содержат скомпилированный программный код, или иными словами – последовательность байтов, которая загружается в оперативную память и выполняется процессором. Linux реализует асбсолютно другой подход. Ранее, изучая написание скриптов командного интерпретатора Bash, мы уже поспели рассмотреть пример создания исполняемого файла. Он в отличие от Windows представляет собой обыкновенный текстовый документ с набором команд. Его особенностью является то, что перед основным содержимым дополняется специальный комментарий, говорящий операционной системе Linux, какую программу использовать для интерпретации. Кроме скрипта, исполняемым файлом является и скомпилированная программа. Таким образом, все файлы в Linux смогут быть, как обычными текстовыми документами, так и исполняемыми программами. Отличие лишь в специальных флагах и преимуществах доступа операционной системы (множество элементов, находящихся в отношениях и связях друг с другом, которое образует определённую целостность, единство).

Назначение прав для запуска файла в Linux

Сделать файл вразумительным для запуска можно с помощью графической оболочки. Нажмите по ярлыку правой кнопкой мыши. В контекстуальном меню выберите пункт «свойства». Открывшееся окно должно содержать вкладку «преимущества», в котором нужно активировать пункт «разрешить выполнение файла как программы». Данный метод будет отличаться в зависимости от дистрибутива Linux и графической оболочки. Также возможно приставить права запуска через консоль. Для этого используется команда chmod. Пример, презентованый ниже, устанавливает право выполнения для владельца файла и его группы. Вы можете скопировать Bash-скрипт из первоначального примера в файл и провести с ним данную операцию.

Запуск скрипта sh в Linux

Сначала рассмотрим пример небольшого sh скрипта:

Вторая строка — это действие, которое выполняет скрипт, но нас больше всего интересует первая — это оболочка, с помощью которого его нужно выполнить. Это может быть не только /bin/bash, но и /bin/sh, и даже /usr/bin/python или /usr/bin/php. Также часто встречается ситуация, что путь к исполняемому файлу оболочки получают с помощью утилиты env: /usr/bin/env php и так далее. Чтобы выполнить скрипт в указанной оболочке, нужно установить для него флаг исполняемости:

Мы разрешаем выполнять запуск sh linux всем категориям пользователей — владельцу, группе файла и остальным. Следующий важный момент — это то место где находится скрипт, если вы просто наберете script.sh, то поиск будет выполнен только глобально, в каталогах, которые записаны в переменную PATH и даже если вы находитесь сейчас в той папке где находится скрипт, то он не будет найден. К нему нужно указывать полный путь, например, для той же текущей папки. Запуск скрипта sh в linux:

Или полный путь от корня:

Если вы не хотите писать полный путь к скрипту, это можно сделать, достаточно переместить скрипт в одну из папок, которые указаны в переменной PATH. Одна из них, которая предназначена для ручной установки программ — /usr/local/bin.

Теперь вы можете выполнить:

Это был первый способ вызвать скрипт, но есть еще один — мы можем запустить оболочку и сразу же передать ей скрипт, который нужно выполнить. Вы могли редко видеть такой способ с bash, но он довольно часто используется для скриптов php или python. Запустим так наш скрипт:

А если нам нужно запустить скрипт на php, то выполните:

Вот так все просто здесь работает. Так можно запустить скрипт как фоновый процесс, используйте символ &:

script.sh &

Даже запустить процесс linux не так сложно.

8 ответов

183

Лучший ответ

Добавить «shebang» в верхней части вашего файла:

И сделайте файл исполняемым ().

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

(обычно вы хотите для хранения собственных скриптов)

Ответ дал

08 янв. 2012, в 18:30
Поделиться

35

Вот некоторые из предпосылок использования непосредственно имени script:

  • Добавьте строку в самый верх.
  • Используя , выполните script исполняемый файл.
  • Поместите script в папку .
  • Запустите script, используя только имя script.

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

Обновление:

Если у вас нет доступа к папке , выполните следующие действия:

  • Создайте папку в своем домашнем каталоге и позвоните ей .
  • Сделайте в своем домашнем каталоге, чтобы определить запуск script, который использует ваша оболочка. Он должен быть либо , либо .
  • Как только вы определили запуск script, добавьте следующую строку в script —
    .
  • После добавления отправьте исходный код script или выйдите из системы и войдите в систему.
  • Выполните script с помощью script.

Ответ дал

08 янв. 2012, в 19:22
Поделиться

10

Просто убедитесь, что он выполним, используя . По умолчанию текущий каталог не находится на вашем PATH, поэтому вам нужно будет выполнить его как — или иначе ссылаться на него по квалифицированному пути. Кроме того, если вам действительно нужно просто , вам нужно будет добавить его в свой PATH. (Возможно, у вас нет доступа к изменению системного пути, но вы почти наверняка измените PATH вашей собственной текущей среды.) Это также предполагает, что ваш script начинается с чего-то вроде .

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

Это позволит вам просто просто (буквально — это не будет работать для любого другого файла ) вместо .

Ответ дал

08 янв. 2012, в 18:21
Поделиться

8

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

Затем вы можете использовать

Вы можете добавить папку в PATH в ваш файл (расположенный в вашем домашнем каталоге).
Добавьте эту строку в конец файла:

Ответ дал

08 янв. 2012, в 19:36
Поделиться

5

В этом примере файл будет называться

Прежде всего, нам нужно будет сделать этот файл, который мы можем просто начать, набрав следующее:

Заметьте, что мы не добавили расширение ?
Это потому что, когда мы запускаем его с терминала, нам нужно будет только ввести для выполнения нашей команды!

Теперь в nano верхняя строка ДОЛЖНА быть , после чего вы можете оставить новую строку перед продолжением.

Для демонстрации я добавлю базовый ответ

Итак, я набираю следующее:

После этого мой пример должен выглядеть так:

Теперь сохраните файл и выполните следующую команду:

Теперь мы выполнили исполняемый файл, мы можем переместить его на , используя следующую команду:

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

Я использовал

Congrats! Наша команда теперь выполнена! В терминале мы можем ввести , и он должен сказать

Счастливое кодирование!

Ответ дал

21 авг. 2017, в 18:46
Поделиться

4

Вы можете ввести sudo install (имя script)/usr/local/bin/(что вы хотите напечатать для выполнения указанного script)

ex:
введите пароль

теперь может работать без .sh и в любом каталоге

Ответ дал

12 янв. 2016, в 19:16
Поделиться

1

Добавить. (текущий каталог) к переменной PATH.
Вы можете сделать это, отредактировав файл .profile.
поместите следующую строку в ваш файл .profile
Просто не забудьте добавить строку Shebang () в начало вашего script и выполнить исполняемый файл script (используя ).

Ответ дал

28 фев. 2014, в 13:08
Поделиться

Вот моя резервная копия script, которая даст вам идею и автоматизацию:

Сервер: Ubuntu 16.04
PHP: 7.0
Apache2, Mysql и т.д.

измените/home/user в свой каталог пользователя и введите: backupscript в любом месте терминала для запуска script! (предполагая, что /usr/bin находится на вашем пути)

Ответ дал

30 июль 2017, в 00:45
Поделиться

Ещё вопросы

  • 1661Как проверить, существует ли программа из скрипта Bash?
  • 1041Разница между sh и bash
  • 995Сделать псевдоним Bash, который принимает параметр?
  • 506Как объявить и использовать логические переменные в сценарии оболочки?
  • 484Что означает set -e в скрипте bash?
  • 459Команда sed найти и заменить в файле и перезаписать файл не работает, он очищает файл
  • 465Ошибка команды при назначении переменной Bash
  • 319Как получить пароль из сценария оболочки, не повторяя
  • 210В чем разница между $ (command) и `command` в программировании оболочки?
  • 92исходная команда не найдена в оболочке sh

Telnet bash script

Первым делом, давайте сформулируем задачу. Допустим, у нас есть три маршрутизатора cisco c ip адресами 192.168.10.10, 192.168.10.11 и 192.168.10.12 и компьютер с Linux. Нам требуется подключиться к каждому маршрутизатору через протокол telnet и узнать версию IOS, используя команду «show ver | include IOS». Можно, конечно, пройтись по этим маршрутизаторам, набирая команды вручную, но когда количество железок вырастет, например, до 100, согласитесь, проделать данную процедуру уже будет довольно утомительно. Поэтому сделаем скрипт, который соберет вывод команд со всех маршрутизаторов в файл.

#!/bin/bash
set -x
#Входные данные:
USER="admin"
PASSWD="123456"
LOG="telnnet_conn.log"
HOSTS="
192.168.10.10
192.168.10.12
192.168.10.11
"
for H in $HOSTS
do
echo START SCRIPT: >> $LOG
date +%x-%R >> $LOG
(
sleep 1;
echo -en "$USER\r";
sleep 1;
echo -en "$PASSWD\r";
sleep 1;
echo -en "show ver | include IOS\r";
sleep 1;
echo -en "exit\r";
sleep 1;
) | telnet $H >> $LOG
echo =================================== >> $LOG
done

Описание telnet скрипта

1. Начинаться любой bash-скрипт всегда должен со строки, указывающий путь к bash-интерпритатору.

#!/bin/bash

2. Включаем режим отладки, прописав set -x (позволяет наблюдать за ходом выполнения скрипта в терминале).

3. Задаем входные данные. В нашем случае это имя пользователя (USER), пароль (PASSWD), названия файла, в который будет собираться вывод команд (telnnet_conn.log), и ip адреса, к которым будем подключаться телнетом (HOSTS).

4. Для организации подключения сделаем цикл с перебором ip адресов.

for H in $HOSTS
do
#Тело цикла (выполняемые операции в цикле)
done

5. Для удобства обработки вывода команд добавим строчку начала скрипта, используя echo и дату и время начала выполнения.

echo START SCRIPT: >> $LOG
date +%x-%R >> $LOG

6. Теперь начинается основная часть работы скрипта. Укажем команды, которые мы хотели бы, чтобы скрипт вводил за нас, а именно ввод логина, пароля и команду вывода версии IOS. Команда «sleep 1» используется чтобы расставить паузы при выполнение команд.

(
sleep 1;
echo -en "$USER\r";
sleep 1;
echo -en "$PASSWD\r";
sleep 1;
echo -en "show ver | include IOS\r";
sleep 1;
echo -en "exit\r";
sleep 1;
) | telnet $H >> $LOG

7. Для удобства чтения выведем разделитель (=========), используя echo.

Примечание:

Создать файл можно, используя команду touch имя_файла.

touch telnet_con.sh

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

chmod 777 telnet_con.sh

Запускаем скрипт

./telnet_con.sh

Скрипт отработает и создаст файл с названием telnnet_conn.log, в котором и будет храниться вывод выполняемых на железяках команд.

Пример содержания файла telnet_conn.log

START SCRIPT:
05.11.2017-14:19
Trying 192.168.10.10...
Connected to 192.168.10.10.
Escape character is '^]'.
User Access Verification
Username: admin
Password:
R1>show ver | include IOS
Cisco IOS Software, 7200 Software (C7200-ADVIPSERVICESK9-M), Version 15.2(4)S5, RELEASE SOFTWARE (fc1)
R1>exit
==============================
START SCRIPT:
05.11.2017-14:19
Trying 192.168.10.11...
...

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

3 ответа

Решение

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

Если по какой-то причине вам абсолютно необходимо или же , вы всегда можете использовать xrdp для запуска сеанса удаленного рабочего стола. Это, конечно, если система Ubuntu, к которой вы пытаетесь получить доступ, имеет X-сервер вообще; серверные компьютеры, например, часто не имеют графического интерфейса, потому что это угроза безопасности.

2

2018-05-27 09:10

Можно запустить приложение, которому требуется GUI из сеанса SSH, в сеанс Desktop, если вам это действительно нужно. Я использую следующий подход для запуска виртуальных машин VMWare, когда они мне нужны, но я не на передней панели компьютера.

Я хотел бы подчеркнуть, что вы упомянули, что вы подключаетесь к Ubuntu Server, на котором по умолчанию не установлена ​​среда рабочего стола. И в этом случае стоит использовать или же или выдвиньте сценарий в фоновый режим, или используйте второй сеанс SSH. Если на сервере установлена ​​среда рабочего стола, можно выполнить следующие шаги.

Следующие скрипты работают с Lightdm и Unity, которые по умолчанию для Ubuntu 16.04.

1. Первое требование заключается в том, что ваш пользователь должен войти в систему в сеансе Desktop. Для этого я использую следующий скрипт ( ):

  • Сценарий должен быть выполнен как обычный пользователь (принадлежит группе sudoers).

  • Я бы предпочел разместить сценарий в быть доступным для всей системы команд оболочки. Не забудьте сделать его исполняемым.

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

  • Сценарий будет работать до тех пор, пока пользователь не войдет в систему, включая заблокированный экран.

  • Я бы предпочел разместить сценарий в быть доступным для всей системы команд оболочки. Не забудьте сделать его исполняемым.

3. Использование:

Установить сессию SSH;
казнить ;

казнить :

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

4. Демонстрация:

5. Ссылки и другие примеры:

https://github.com/pa4080/cron-gui-launcher

1

2018-05-27 11:24

Начнем с простых примеров

Команда ниже покажет вам ваш внешний IP — это идеальный вариант, если в Сеть вы входите используя роутер. Эта команда обращается к серверу ifconfig.co, который возвращает IP одной строкой без лишней писанины которая вам не нужна.

curl ifconfig.co

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

#!/bin/bash
curl ifconfig.co

Сохраняeм скрипт в каталог ~/bin и даем права на исполнение:

chmod +x ~/bin/yourip.sh

Почти готово, вы можно исполнить скрипт из командной строки используя команду yourip.sh.

C айпи закончили, посмотрим погоду с консоли.

Ссылка на основную публикацию