diff options
Diffstat (limited to 'LINUX/BASH_script')
| -rw-r--r-- | LINUX/BASH_script/15 однострочных bash-скриптов.md | 211 | ||||
| -rw-r--r-- | LINUX/BASH_script/BASH. Разное.md | 40 | ||||
| -rw-r--r-- | LINUX/BASH_script/BASH. Часть 1.md | 221 | ||||
| -rw-r--r-- | LINUX/BASH_script/BASH. Часть 2.md | 223 | ||||
| -rw-r--r-- | LINUX/BASH_script/Обновление списка пакетов и установка обновлений.md | 24 | ||||
| -rw-r--r-- | LINUX/BASH_script/Скрипты для админов.md | 1 |
6 files changed, 720 insertions, 0 deletions
diff --git a/LINUX/BASH_script/15 однострочных bash-скриптов.md b/LINUX/BASH_script/15 однострочных bash-скриптов.md new file mode 100644 index 0000000..555f4ff --- /dev/null +++ b/LINUX/BASH_script/15 однострочных bash-скриптов.md @@ -0,0 +1,211 @@ +для упрощения рутинных задач + +1. Проверка использования +дискового пространства +Нехватка места на диске может привести к +сбою приложений. Эта команда выводит +список всех смонтированных разделов и +выделяет те, которые утилизированы на 80% +и более. +==`df -h | awk '$5+0 > 80 {print}' +- df -hотображает использование диска в +удобном для чтения формате. +- awk ‘$5+0 > 80 {print}’извлекает +строки, в которых утилизация превышает +80%. + +2. Поиск больших файлов, +которые занимают место +Определите 10 самых больших файлов в +системе. +==`find / -type f -exec du -h {} + | +sort -rh | head -10 +- find / -type fищет все файлы. +- du -hвычисляет размеры файлов в +удобном для чтения формате. +- sort -rhсортирует результаты по +убыванию. +- head -10ограничивает вывод 10 самыми +большими файлами. + +3. Отслеживание обновлений +лога в реальном времени +Просмотр файлов логов в режиме реального +времени, с фильтрацией сообщений об +ошибках. +==`tail -f /var/log/syslog | grep - +line-buffered "error" +- tail -fотслеживает файл журнала по +мере добавления новых записей. +- grep — line-buffered “error” +фильтрует строки, содержащие "error". + +4. Перезапуск службы в случае +сбоя +Проверка, что критически важная служба, +такая как Nginx, всегда запущена. +==`systemctl is-active - quiet nginx +|| systemctl restart nginx +- systemctl is-active — quiet +nginx проверяет состояние службы. +- Если она не запущена, systemctl +restart nginx перезапускает ее. + +5. Мониторинг использования +CPU в режиме реального +времени +Проверка загрузки CPU в реальном времени +для устранения неполадок с +производительностью. +==`top -b -n 1 | grep "Cpu(s)" +- top -b -n 1запускает «top» в пакетном +режиме для одной итерации. +- grep “Cpu(s)”извлекает сведения об +использовании CPU. + +6. Уничтожение самого +ресурсоемкого процесса +Поиск и завершение процесса, +потребляющего больше всего ресурсов CPU. +==`kill -9 $(ps -eo pid,%cpu - +sort=-%cpu | awk 'NR==2 {print +$1}') +- ps -eo pid,%cpu — sort=-%cpuвыводит +список процессов, отсортированных по +использованию CPU. +- awk ‘NR\==2 {print $1}’выбирает +процесс с наибольшим потреблением ЦП. +- kill -9принудительно завершает его. + +7. Получение публичного IP- +адреса +Быстрое получение публичного IP-адреса +сервера. +==`curl -s ifconfig.me +- Способ использует curl для запроса +текущего публичного IP-адреса из +«ifconfig.me». +- -s Подавляет ненужный вывод. + +8. Поиск всех открытых сетевых +портов +Перечисление всех активных +прослушиваемых портов на вашем +компьютере. +==`netstat -tulnp | grep LISTEN +- netstat -tulnpотображает открытые +порты и связанные с ними процессы. +- grep LISTENфильтрует результаты по +прослушиваемым портам. + +9. Копирование SSH-ключа на +удаленный сервер +Настройка беспарольной SSH- +аутентификации за секунды. +==`ssh-keygen -t rsa -b 2048 -q -N +"" && ssh-copy-id +user@remote_server +- ssh-keygen создает пару ключей RSA. +- ssh-copy-id передает открытый ключ на +удаленный сервер. + +10. Синхронизация файлов +между серверами +Использование rsync для зеркалирования +файлов с одного сервера на другой. +==`rsync -avz /local/path +user@remote:/remote/path +- -a сохраняет разрешения и временные +метки. +- -v включает подробный режим. +- -z сжимает данные для более быстрой +передачи. + +11. Планирование задач с +помощью Cron +Добавление задания cron для резервного +копирования файлов каждую ночь в 2 часа +ночи. +==`echo "0 2 * * * tar -czf / +backup.tar.gz /important/data" | +crontab - +- 0 2 * * *планирует задание на 2 часа +ночи ежедневно. +- tar -czfсжимает и создает резервную +копию "/important/data". + +12. Загрузка файла в фоновом +режиме +Использование «wget» для загрузки +больших файлов без блокировки терминала. +==`nohup wget -q https:// +example.com/bigfile.zip & +- nohup обеспечивает выполнение процесса +даже после выхода из системы. +- wget -q незаметно загружает файл. +- & запускает процесс в фоновом режиме. + +13. Поиск и удаление старых +файлов логов +Автоматическая очистка логов старше 7 +дней. +==`find /var/log -name "*.log" +-mtime +7 -exec rm -f {} \; +- -mtime +7выбирает файлы старше 7 дней. +- -exec rm -f {}удаляет их. + +14. Проверка открыт ли порт на +удаленном сервере +Проверка открыт ли определенный порт +(например, 443) на удаленном хосте. +==`nc -zv example.com 443 +- nc -zvпроверяет соединение без +отправки данных. +- Полезно для устранения неполадок +брандмауэра и подключения. + +15. Список всех запущенных +Docker-контейнеров +Удобный просмотр активных контейнеров +Docker. +==`docker ps - format "table {{.ID}} +\t {{.Image}} \t {{.Status}}" +- docker psвыводит список запущенных +контейнеров. +- — formatструктурирует вывод для лучшей +читабельности. + +========================= +Подборка полезных скриптов для опытных Linux-админов + +1) 🔍 Быстрый поиск крупных файлов (удобно перед очисткой диска) +du -ah / | sort -rh | head -n 30 + +2) 🛑 Массовое убийство зависших процессов по шаблону +pkill -f "pattern" + +3) 🧼 Очистка старых логов/кэша старше X дней +find /var/log -type f -mtime +7 -delete + +4) 🧬 Проверка файловой системы без остановки +fsck -n /dev/sdX + +5) 📦 Список пакетов, обновлённых за последние 5 дней +grep "upgrade" /var/log/dpkg.log | tail + +6) 🕵️ Слежение за открытыми портами в реальном времени +watch -n1 "ss -tulpn" + +7) 📊 Сбор top-нагружающих процессов по CPU за минуту +ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%cpu | head + +8) 🔁 Авто-рестарт службы при падении +while true; do systemctl restart myservice; sleep 5; done + +9) 🔗 Быстрый тест сетевой задержки и MTU +tracepath google.com + +10) 🔐 Сканирование слабых SSH-ключей +ssh-audit -p 22 localhost + +Такие короткие утилитарные команды экономят кучу времени в рутине админа.
\ No newline at end of file diff --git a/LINUX/BASH_script/BASH. Разное.md b/LINUX/BASH_script/BASH. Разное.md new file mode 100644 index 0000000..f76b28f --- /dev/null +++ b/LINUX/BASH_script/BASH. Разное.md @@ -0,0 +1,40 @@ +_**Использование стандартных ключей**_ + +При написании bash-скриптов вы можете выбирать любые буквы для ключей командной строки и произвольно задавать реакцию скрипта на эти ключи. Однако, в мире Linux значения некоторых ключей стали чем-то вроде стандарта, которого полезно придерживаться. Вот список этих ключей: + +``` +-a Вывести все объекты. +-c Произвести подсчёт. +-d Указать директорию. +-e Развернуть объект. + +-f Указать файл, из которого нужно прочитать данные. +-h Вывести справку по команде. +-i Игнорировать регистр символов. +-l Выполнить полноформатный вывод данных. + +-n Использовать неинтерактивный (пакетный) режим. (ввод на той же строке) +-o Позволяет указать файл, в который нужно перенаправить вывод. +-p предотвращения чтения оболочкой файлов, контролируемых пользователем +-t 5 параметр ключа задаёт время ожидания ввода в секундах +-q Выполнить скрипт в quiet-режиме. +-r Обрабатывать папки и файлы рекурсивно. +-s Выполнить скрипт в silent-режиме. команды read предотвращает отображение на экране данных, вводимых с клавиатуры +-v Выполнить многословный вывод. +-x Исключить объект. +-y Ответить «yes» на все вопросы. + +$REPLY - специальная переменная среды в которую запоминается ввод + +``` + +```sh +# простое чтение данных из файла: + +#!/bin/bash +count=1 +cat myfile | while read line do +echo "Line $count: $line" count=$(( $count + 1 )) +done +echo "Finished" +``` diff --git a/LINUX/BASH_script/BASH. Часть 1.md b/LINUX/BASH_script/BASH. Часть 1.md new file mode 100644 index 0000000..abc45f8 --- /dev/null +++ b/LINUX/BASH_script/BASH. Часть 1.md @@ -0,0 +1,221 @@ +## Введение + +BASH — Bourne-Again SHell (что может переводится как «перерожденный шел», или «Снова шел Борна(создатель sh)»), самый популярный командный интерпретатор в юниксоподобных системах, в особенности в GNU/Linux. Ниже приведу ряд встроенных команд, которые мы будем использовать для создания своих скриптов. + + +>`break` выход из цикла for, while или until +> `continue` выполнение следующей итерации цикла for, while или until +> `echo` вывод аргументов, разделенных пробелами, на стандартное устройство вывода +> `exit` выход из оболочки +> `export` отмечает аргументы как переменные для передачи в дочерние процессы в среде +> `hash` запоминает полные имена путей команд, указанных в качестве аргументов, чтобы не искать их при следующем обращении +> `kill` посылает сигнал завершения процессу +> `pwd` выводит текущий рабочий каталог +> `read` читает строку из ввода оболочки и использует ее для присвоения значений указанным переменным.\ +> `return` заставляет функцию оболочки выйти с указанным значением +> `shift` перемещает позиционные параметры налево +> `test` вычисляет условное выражение +> `times` выводит имя пользователя и системное время, использованное оболочкой и ее потомками +> `trap` указывает команды, которые должны выполняться при получении оболочкой сигнала +> `unset` вызывает уничтожение переменных оболочки +> `wait` ждет выхода из дочернего процесса и сообщает выходное состояние. + + +И конечно же кроме встроенных команд мы будем использовать целую кучу внешних, отдельных команд-программ, с которыми мы познакомимся уже в процессе + +## Что необходимо знать с самого начала + +1. Любой bash-скрипт должен начинаться со строки: + +> `#!/bin/bash` + +*в этой строке после #! указывается путь к bash-интерпретатору, поэтому если он у вас установлен в другом месте(где, вы можете узнать набрав `whereis bash`) поменяйте её на ваш путь.* + +2. Коментарии начинаются с символа # (кроме первой строки). +3. В bash переменные не имеют типа(о них речь пойдет ниже) + +## Переменные и параметры скрипта + +Приведу как пример небольшой пример, который мы разберем: + +> `#!/bin/bash` #указываем где у нас хранится bash-интерпретатор +> \#присваиваем переменной parametr1 значение первого параметра скрипта +> `parametr1=$1` +> \#присваиваем переменной script_name значение имени скрипта +> `script_name=$0` +> \# команда echo выводит определенную строку, обращение к переменным осуществляется через $имя_переменной. +> `echo "Вы запустили скрипт с именем $script_name и параметром $parametr1"` +> \# здесь мы видим другие кавычки, разница в том, что в одинарных кавычках не происходит подстановки переменных. +> `echo 'Вы запустили скрипт с именем $script_name и параметром $parametr1'` +> \#Выход с кодом 0 (удачное завершение работы скрипта) +> `exit 0` + + +Результат выполнения скрипта: + +> `ite@ite-desktop:~$ ./test.sh qwerty` +> Вы запустили скрипт с именем ./test.sh и параметром qwerty +> Вы запустили скрипт с именем $script_name и параметром $parametr1 + + +После того как мы познакомились как использовать переменные и передавать скрипту параметры, время познакомиться с зарезервированными переменными: + +> `$DIRSTACK` - содержимое вершины стека каталогов +> `$EDITOR` - текстовый редактор по умолчанию +> `$EUID` - Эффективный UID. Если вы использовали программу su для выполнения команд от другого пользователя, то эта переменная содержит UID этого пользователя, в то время как... +> `$UID` - ...содержит реальный идентификатор, который устанавливается только при логине. +> `$FUNCNAME` - имя текущей функции в скрипте. +> `$GROUPS` - массив групп к которым принадлежит текущий пользователь +> `$HOME` - домашний каталог пользователя +> `$HOSTNAME` - ваш hostname +> `$HOSTTYPE` - архитектура машины. +> `$LC_CTYPE` - внутренняя переменная, котороя определяет кодировку символов +> `$OLDPWD` - прежний рабочий каталог +> `$OSTYPE` - тип ОС +> `$PATH` - путь поиска программ +> `$PPID` - идентификатор родительского процесса +> `$SECONDS` - время работы скрипта(в сек.) +> `$#` - общее количество параметров переданных скрипту +> `$*` - все аргументы переданыне скрипту(выводятся в строку) +> `$@` - тоже самое, что и предыдущий, но параметры выводятся в столбик +> `$!` - PID последнего запущенного в фоне процесса +> `$$` - PID самого скрипта + +> IFS=$'\n' - переназначение переменной среды на 'только перевод строки' +> IFS=: - переназначение переменной среды на ' : ' + +## Условия + +Условные операторы, думаю, знакомы практически каждому, кто хоть раз пытался на чем-то писать программы. В bash условия пишутся след. образом (как обычно на примере): + + +> `#!/bin/bash` +> \#в переменную source засовываем первый параметр скрипта +> `source=$1` +> \#в переменную dest засовываем второй параметр скрипта +> `dest=$2` +> +> \# в ковычках указываем имена переменных для сравнения. -eq - логическое сравнение обозначающие "равны" +> `if [[ "$source" -eq "$dest" ]]` +> \# если они действительно равны, то +> `then` +> \#выводим сообщение об ошибке, т.к. $source и $dest у нас равны +> `echo "Применик $dest и источник $source один и тот же файл!"` +> \# выходим с ошибкой (1 - код ошибки) +> `exit 1` +> \# если же они не равны +> `else` +> \# то выполняем команду cp: копируем источник в приемник +> `cp $source $dest` +> `echo "Удачное копирование!"` +> `fi` #обозначаем окончание условия. + + +Результат выполнения скрипта: + + +> `ite@ite-desktop:~$ ./primer2.sh 1 1` +> Применик 1 и источник 1 один и тот же файл! + +> `ite@ite-desktop:~$ ./primer2.sh 1 2` +> Удачное копирование! + +Структура `if-then-else` используется следующим образом: + +> `if` <команда или набор команд возвращающих код возврата(0 или 1)> +> `then` +> <если выражение после if истино, то выполняется этот блок> +> `else` +> <если выражение после if ложно, тот этот> + + +В качестве команд возвращающих код возврата могут выступать структуры `[[ , [ , test, (( ))` или любая другая(или несколько) linux-команда. + + +> `test` - используется для логического сравнения. после выражения, неоьбходима закрывающая скобка "]" +>`[` - синоним команды test +>`[[` - расширенная версия "[" (начиная с версии 2.02)(как в примере), внутри которой могут быть использованы || (или), & (и). Долна иметь закрывающуб скобку "]]" +>`(( ))` - математическое сравнение. + + +для построения многоярусных условий вида: + +> `if ...` +>`then ....` +>`else` +>`if ....` +>`then....` +>`else ....` + +для краткости и читаемости кода, можно использовать структуру: + +> `if ..` +> `then ...` +> `elif ...` +> `then ...` +> `elif ...` + + +## Условия. Множественный выбор + +Если необходимо сравнивать какоую-то одну переменную с большим количеством параметров, то целесообразней использовать оператор case. + +> `#!/bin/bash` +> `echo "Выберите редатор для запуска:"` +> `echo "1 Запуск программы nano"` +> `echo "2 Запуск программы vi"` +> `echo "3 Запуск программы emacs"` +> `echo "4 Выход"` +\#здесь мы читаем в переменную $doing со стандартного ввода +> `read doing` +> +> `case $doing in` +> `1)` +> `/usr/bin/nano` # если $doing содержит 1, то запустить nano +> `;;` +> `2)` +> `/usr/bin/vi` # если $doing содержит 2, то запустить vi +> `;;` +> `3)` +> `/usr/bin/emacs` # если $doing содержит 3, то запустить emacs +> `;;` +> `4)` +> `exit 0` +> `;;` +> `*)` #если введено с клавиатуры то, что в case не описывается, выполнять следующее: +> `echo "Введено неправильное действие"` +> +> `esac` #окончание оператора case. + +Результат работы: + +> `ite@ite-desktop:~$ ./menu2.sh` +> Выберите редатор для запуска: +> 1 Запуск программы nano +> 2 Запуск программы vi +> 3 Запуск программы emacs +> 4 Выход + +После выбор цифры и нажатия Enter запуститься тот редактор, который вы выбрали(если конечно все пути указаны правильно, и у вас установлены эти редакторы :) ) + + +Прведу список логических операторв, которые используются для конструкции if-then-else-fi: + +> `-z` # строка пуста +> `-n` # строка не пуста +> `=, (==)` # строки равны +> `!=` # строки неравны +> +> `-eq` # равно +> `-ne` # неравно +> `-lt,(< )` # меньше +> `-le,(<=)` # меньше или равно +> `-gt,(>)` # больше +> `-ge,(>=)` # больше или равно +> `!` # отрицание логического выражения +> +> `-a,(&&)` # логическое «И» +> `-o,(||)` # логическое «ИЛИ» + + +С основами языка и условиями мы разобрались, чтобы не перегружать статью, разобью её на несколько частей(допустим на 3). Во второй части разберем операторы цикла и выполнение математических операций. diff --git a/LINUX/BASH_script/BASH. Часть 2.md b/LINUX/BASH_script/BASH. Часть 2.md new file mode 100644 index 0000000..dea8c45 --- /dev/null +++ b/LINUX/BASH_script/BASH. Часть 2.md @@ -0,0 +1,223 @@ +## Циклы. Цикл for-in. + +Оператор `for-in` предназначен для поочередного обращения к значениям перечисленным в списке. Каждое значение поочередно в списке присваивается переменной. +Синтаксис следующий: + +``` +for переменная in список_значений +do +команды +done +``` + +Рассмотрим небольшой пример: + +``` +#!/bin/bash +for i in 0 1 2 3 4 #переменной $i будем поочередно присваивать значения от 0 до 4 включительно +do +echo "Console number is $i" >> /dev/pts/$i #Пишем в файл /dev/pts/$i(файл виртуального терминала) строку "Console number is $i" +done #цикл окончен +exit 0 +``` + +После выполнения примера в первых 5 виртуальных консолях(терминалах) появится строка с её номером. В переменную `$i` поочередно подставляются значения из списка и в цикле идет работа со значением этой переменной + +## Циклы. Цикл while. + +Цикл `while` сложнее цикла `for-in` и используется для повторения команд, пока какое-то выражение истинно( код возврата = 0). +Синтаксис оператора следующий: + +``` +while выражение или команда возвращающая код возврата +do +команды +done +``` + +Пример работы цикла рассмотрим на следующем примере: + +``` +#!/bin/bash +again=yes #присваиваем значение "yes" переменной again +while [ "$again" = "yes" ] #Будем выполнять цикл, пока $again будет равно "yes" +do +echo "Please enter a name:" +read name +echo "The name you entered is $name" + +echo "Do you wish to continue?" +read again +done +echo "Bye-Bye" +``` + + +А теперь результат работы скрипта: +``` +ite@ite-desktop:~$ ./bash2_primer1.sh +Please enter a name: +ite +The name you entered is ite +Do you wish to continue? +yes +Please enter a name: +mihail +The name you entered is mihail +Do you wish to continue? +no +Bye-Bye +``` + +Как видим цикл выполняется до тех пор, пока мы не введем что-то отличное от «yes». Между `do` и `done` можно описывать любые структуры, операторы и т.п., все они будут выполнятся в цикле.Но следует быть осторожным с этим циклом, если вы запустите на выполнение в нём какую-либо команду, без изменения переменной выражения, вы можете попасть в бесконечный цикл. + +Теперь об условии истинности. После `while`, как и в условном операторе `if-then-else` можно вставлять любое выражение или команду, которая возвращает код возврата, и цикл будет исполнятся до тех пор, пока код возврата = 0! Оператор `[` аналог команды `test`, которая проверяет истинность условия, которое ей передали. + +Рассмотрим еще один пример, я взял его из книги Advanced Bash Scripting. Уж очень он мне понравился :), но я его немного упростил. В этом примере мы познакомимся с еще одним типом циклов **UNTIL-DO**. Эта практически полный аналог цикла **WHILE-DO**, только выполняется пока какое-то выражение ложно. +Вот пример: +``` +#!/bin/bash +echo "Введите числитель: " +read dividend +echo "Введите знаменатель: " +read divisor + +dnd=$dividend #мы будем изменять переменные dividend и divisor, +#сохраним их знания в других переменных, т.к. они нам +#понадобятся +dvs=$divisor +remainder=1 + +until [ "$remainder" -eq 0 ] +do +let "remainder = dividend % divisor" +dividend=$divisor +divisor=$remainder +done + +echo "НОД чисел $dnd и $dvs = $dividend" +``` + +Результат выполнения скрипта: +``` +ite@ite-desktop:~$ ./bash2_primer3.sh +Введите числитель: +100 +Введите знаменатель: +90 +НОД чисел 100 и 90 = 10 +``` + +## Математические операции + +Команда `let`. +Команда `let` производит арифметические операции над числами и переменными. +Рассмотрим небольшой пример, в котором мы производим некоторые вычисления над введенными числами: + +``` +#!/bin/bash +echo "Введите a: " +read a +echo "Введите b: " +read b + +let "c = a + b" #сложение +echo "a+b= $c" +let "c = a / b" #деление +echo "a/b= $c" +let "c <<= 2" #сдвигает c на 2 разряда влево +echo "c после сдвига на 2 разряда: $c" +let "c = a % b" # находит остаток от деления a на b +echo "$a / $b. остаток: $c " +``` + +Результат выполнения: +``` +ite@ite-desktop:~$ ./bash2_primer2.sh +Введите a: +123 +Введите b: +12 +a+b= 135 +a/b= 10 +c после сдвига на 2 разряда: 40 +123 / 12. остаток: 3 +``` + + +Ну вот, как видите ничего сложного, список математических операций стандартный: + +> `+` — сложение +> `—` — вычитание +> `*` — умножение +> `/` — деление +> `**` — возведение в степень +> `%` — модуль(деление по модулю), остаток от деления +> `let` позволяет использовать сокращения арифметических команд, тем самым сокращая кол-во используемых переменных. Например: `a = a+b` эквивалентно `a +=b` и т.д + +## Работа с внешними программами при написании shell-скриптов + +Для начала немного полезной теории. +### Перенаправление потоков. + +В **bash** (как и многих других оболочках) есть встроенные файловые дескрипторы: `0 (stdin)`, `1 (stdout)`, `2 (stderr)`. +`stdout` — Стандартный вывод. Сюда попадает все что выводят программы +`stdin` — Стандартный ввод. Это все что набирает юзер в консоли +`stderr` — Стандартный вывод ошибок. +Для операций с этими дескрипторами, существуют специальные символы: `>` (перенаправление вывода), `<` (перенаправление ввода). Оперировать ими не сложно. Например: + +``` +cat /dev/random > /dev/null #перенаправить вывод команды cat /dev/random в /dev/null (абсолютно бесполезная операция :)) ) +``` +или + +``` +ls -la > listing #записать в файл listing содержание текущего каталога (уже полезней) +``` + +Если есть необходимость дописывать в файл(при использовании "`>`" он заменятеся), необходимо вместо "`>`" использовать "`>>`" +``` +sudo < my_password +``` +после просьбы sudo ввести пароль, он возьмется из файла my_password, как будто вы его ввели с клавиатуры. +Если необходимо записать в файл только ошибки, которые могли возникнуть при работе программы, то можно использовать: +``` +./program_with_error 2> error_file +``` +цифра 2 перед "`>`" означает что нужно перенаправлять все что попадет в дескриптор 2(stderr). +Если необходимо заставить `stderr` писать в `stdout`, то это можно след. образом: +``` +./program_with_error 2>&1 +``` +символ "`&`" означает указатель на дескриптор `1(stdout)` +(Поумолчанию `stderr` пишет на ту консоль, в котрой работает пользователь(вренее пишет на дисплей)). + +### 2. Конвееры. + +Конвеер — очень мощный инструмент для работы с консолью Bash. Синтаксис простой: +`команда1 | команда 2` — означает, что вывод команды 1 передастся на ввод команде 2 +Конвееры можно группировать в цепочки и выводить с помощью перенаправления в файл, например: +``` +ls -la | grep «hash» |sort > sortilg_list +``` +вывод команды `ls -la` передается команде `grep`, которая отбирает все строки, в которых встретится слово *hash*, и передает команде сортировке `sort`, которая пишет результат в файл *sorting_list*. Все довольно понятно и просто. + +Чаще всего скрипты на Bash используются в качестве автоматизации каких-то рутинных операций в консоли, отсюда иногда возникает необходимость в обработке `stdout` одной команды и передача на `stdin` другой команде, при этом результат выполнения одной команды должен быть неким образом обработан. В этом разделе я постораюсь объяснить основные принципы работы с внешними командами внутри скрипта. Думаю что примеров я привел достаточно и можно теперь писать только основные моменты. + +### 1. Передача вывода в переменную. + +Для того чтобы записать в переменную вывод какой-либо команды, достаточно заключить команду в ` `` ` ковычки, например +> a = \` echo "qwerty" \` +> echo $a + +Результат работы: qwerty + +Однако если вы захотите записать в переменную список директорий, то необходимо, должным образом обработать результат для помещения данных в переменную. Рассмотрим небольшой, пример: +``` +LIST=`find /svn/ -type d 2>/dev/null| awk '{FS="/"} {print $4}'| sort|uniq | tr '\n' ' '` +for ONE_OF_LIST in $LIST +do +svnadmin hotcopy /svn/$ONE_OF_LIST /svn/temp4backup/$ONE_OF_LIST +done +``` +Здесь мы используем цикл `for-do-done` для архивирование всех директорий в папке */svn/* с помощью команды `svnadmin hotcopy`(что в нашем случае не имеет никого значения, просто как пример). Наибольшй интерес вызывает строка: LIST=`find /svn/ -type d 2>/dev/null| awk '{FS="/"} {print $4}'| sort|uniq | tr '\n' ' '` В ней переменной LIST присваивается выполнение команды find, обработанной командами awk, sort, uniq,tr(все эти команды мы рассматривать не будем, ибо это отдельная статья). В переменной LIST будут имена всех каталогов в папке /svn/ пгомещенных в одну строку(для того чтобы её стравить циклу.
\ No newline at end of file diff --git a/LINUX/BASH_script/Обновление списка пакетов и установка обновлений.md b/LINUX/BASH_script/Обновление списка пакетов и установка обновлений.md new file mode 100644 index 0000000..bfa1302 --- /dev/null +++ b/LINUX/BASH_script/Обновление списка пакетов и установка обновлений.md @@ -0,0 +1,24 @@ +```sh +#!/bin/bash + +# Обновление списка пакетов и установка обновлений +echo "----------------------------" +echo "Обновление системы." +echo "----------------------------" +sudo apt-get update +sudo apt-get upgrade -y + +# Автоматическое удаление ненужных пакетов и очистка кэша +echo "----------------------------" +echo "Очистка системы." +echo "----------------------------" +sudo apt-get autoremove -y +sudo apt-get autoclean -y +sudo apt-get clean + +# Вывод сообщения о завершении +echo "----------------------------" +echo "Система обновлена и очищена." +echo "----------------------------" +``` + diff --git a/LINUX/BASH_script/Скрипты для админов.md b/LINUX/BASH_script/Скрипты для админов.md new file mode 100644 index 0000000..ec58a6a --- /dev/null +++ b/LINUX/BASH_script/Скрипты для админов.md @@ -0,0 +1 @@ +![[СкриптыДляАдмина.jpg]]
\ No newline at end of file |
