====== Команды и программы и их применение ======
===== Grep =====
Удаление из файла конфигурации незначимых строк (закомментаренных и пустых)
egrep -v "^;|^$" php.ini >php.ini.compact
===== date =====
date -I
2021-06-05
date -Iseconds
2021-06-05T16:59:11+03:00
date +%Y-%m-%dT%H:%M:%S
2021-06-05T16:57:36
Вывод на экран сообщения с текущим временем (удобно для ведения логов и выдачи сообщений в скриптах)
echo "$(date +%Y-%m-%dT%H:%M:%S) текст сообщения"
Занесение текущего времени в переменную
current_time="$(date +%Y-%m-%d:%H:%M:%S)"
Запись выполнения скрипта в лог с отметкой этого лога датой
#!/bin/bash
set -x
{
ip a
iptables -vL
iptables -vL -t mangle
iptables -vL -t nat
ip rule show
ip route show table all
} 2>&1 |tee $(basename $0).$(date +%Y%m%d%H%M%S).log
"Путешествуем" в прошлое
date +%Y-%m-%dT%H:%M:%S -d "yesterday"
date +%Y-%m-%dT%H:%M:%S -d "7 day ago"
===== ip =====
ifconfig изо всех линукс-дистрибутивов постепенно убирается. На смену ему предлагают ip (с тем или иным успехом заменяет ifconfig, route, netstat, ifup, ifdown и др.)
Все ключи, объекты и команды программы можно сокращать:
ip link
ip l
ip address
ip a
ip route
ip r
ip rule
ip ru
ip address show dev tun0
ip a s dev tun0
полезные ключи:
* -color -c
* -brief -br
* -statistics -stats -s
* -human-readable -human -h
* -details -d
* -oneline -o
* -json -j и связанный с ним -pretty -p
Список объектов:
link | address | addrlabel | route | rule | neigh | ntable | tunnel | tuntap | maddress | mroute | mrule | monitor | xfrm | netns | l2tp | tcp_metrics | token | macsec
Примеры (раскраска вывода не сохранена):
$ ip -c -br l
lo UNKNOWN 00:00:00:00:00:00
enp1s11 UP 00:04:23:d0:ac:af
wlp1s9 DOWN c0:25:e9:13:c5:40
tun0 UNKNOWN
$ ip -c -s -h -d l
1: lo: mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 promiscuity 0 minmtu 0 maxmtu 0 addrgenmode eui64 numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535
RX: bytes packets errors dropped overrun mcast
621k 6.54k 0 0 0 0
TX: bytes packets errors dropped carrier collsns
621k 6.54k 0 0 0 0
...
===== tail =====
наблюдение за логами в каталоге и подкаталогах
tail -f **/*.log
Вывод файла с пропуском N первых строк
tail -n +
===== find =====
Сменить массово всем файлам и каталогам права доступа
find . -type f -exec chmod 644 \{\} \;
find . -type d -exec chmod 755 \{\} \;
Удалить все лог-файлы
find . -name *.log -delete
Удалить все файлы старше 3 месяцев
find /var/log/radius/radacct/ ! -newermt '3 month ago' -delete
Удалить файлы старше 30 дней, а старше 1 дня сжать (каталог задан в переменной, поиск в его подкаталогах)
find $logdir/*/detail* -mtime +1 -exec /bin/gzip -1 {} \;
find $logdir/*/detail* -mtime +30 -exec /bin/rm -f {} \;
Удалить пустые папки (по маске old*)
find . -name "old*" -type d -empty -delete
find . -maxdepth 1 -name "old*" -type d -empty -delete
Найти все css-файлы и сделать их сжатые копии (например для отдачи сжатых копий из nginx)
find ./* -type f -name '*.css' -exec gzip -9vk '{}' \;
Обратное действие (удалить все сжатые копии)
find ./* -type f -name '*.css.gz' -exec rm -f '{}' \;
Найти все файлы по нескольким заданным маскам
find . -type f -name '*.css' -o -name '*.txt' -o -name '*.js'
Создать/удалить сжатые копии для нескольких масок файлов
find . -type f -name '*.css' -o -name '*.txt' -o -name '*.js' -exec gzip -9vk '{}' \;
find . -type f -name '*.css.gz' -o -name '*.txt.gz' -o -name '*.js.gz' -exec rm -f '{}' \;
Примеры на ту же тему, но с регулярными выражениями
find -E . -type f -regex ".*\.(css.gz|txt.gz|js.gz)" -exec rm -f '{}' \;
find -E . -type f -regex ".*\.(css|txt|js)" -exec gzip -9vk '{}' \;
find -E . -type f -regex ".*\.(css|txt|js)" -exec sh -c "gzip -9vk '{}'; chown username '{}'" \;
find -E . -type f -regex ".*\.(gif|png)" -exec sh -c "gzip -9vk '{}'; chown username '{}'" \;
Поиск по содержимому
find . -name "*.sh" -exec grep -i -H "searchstring" {} \;
Копирование по маске
find . -name "*.csv" -exec cp -f "{}" "{}.old" \;
===== sed =====
===== =====
===== tcpdump =====
tcpdump -i eth0 host 192.168.1.1
tcpdump host 192.168.1.1 and port 53
tcpdump -i ens160 -f src net 192.168.1.0/24
Захват пакетов до 4МБ дампа.
tcpdump -i ens224 host 192.168.1.1 -C 4,194,304 -w $(hostname)-192.168.1.1.pcap
Запись в файл со временем снятия дампа
tcpdump -i bond0 dst 192.168.1.1 and udp -w $(hostname)-192.168.1.1-$(date +%Y-%m-%dT%H:%M:%S).pcap
Параметры фильтрации:
* host - имя хоста;
* ip - ip адрес;
* proto - протокол;
* net - адрес сети или подсети;
* port - адрес порта;
* src - отправитель;
* dst - получатель;
* src port - порт отправителя;
* dst port - порт получателя;
* аналогично dst ip, src ip, dst net, src ip
* less, greater number - пакеты меньше и больше числа number
Доступны такие протоколы: ether, fddi, tr, wlan, ip, ip6, arp, rarp, decnet, tcp и udp.
===== find =====
Сменить массово всем файлам и каталогам права доступа
find . -type f -exec chmod 644 \{\} \;
find . -type d -exec chmod 755 \{\} \;
Удалить все лог-файлы
find . -name *.log -delete
Удалить все файлы старше 3 месяцев
find /var/log/radius/radacct/ ! -newermt '3 month ago' -delete
Удалить файлы старше 30 дней, а старше 1 дня сжать (каталог задан в переменной, поиск в его подкаталогах)
find $logdir/*/detail* -mtime 1 -exec /bin/gzip -1 {} \;
find $logdir/*/detail* -mtime 30 -exec /bin/rm -f {} \;
Удалить пустые папки (по маске old*)
find . -name "old*" -type d -empty -delete
find . -maxdepth 1 -name "old*" -type d -empty -delete
Найти все css-файлы и сделать их сжатые копии (например для отдачи сжатых копий из nginx)
find ./* -type f -name '*.css' -exec gzip -9vk '{}' \;
Обратное действие (удалить все сжатые копии)
find ./* -type f -name '*.css.gz' -exec rm -f '{}' \;
Найти все файлы по нескольким заданным маскам
find . -type f -name '*.css' -o -name '*.txt' -o -name '*.js'
Создать/удалить сжатые копии для нескольких масок файлов
find . -type f -name '*.css' -o -name '*.txt' -o -name '*.js' -exec gzip -9vk '{}' \;
find . -type f -name '*.css.gz' -o -name '*.txt.gz' -o -name '*.js.gz' -exec rm -f '{}' \;
Примеры на ту же тему, но с регулярными выражениями
find -E . -type f -regex ".*\.(css.gz|txt.gz|js.gz)" -exec rm -f '{}' \;
find -E . -type f -regex ".*\.(css|txt|js)" -exec gzip -9vk '{}' \;
find -E . -type f -regex ".*\.(css|txt|js)" -exec sh -c "gzip -9vk '{}'; chown username '{}'" \;
find -E . -type f -regex ".*\.(gif|png)" -exec sh -c "gzip -9vk '{}'; chown username '{}'" \;
Поиск по содержимому
find . -name "*.sh" -exec grep -i -H "searchstring" {} \;
Копирование по маске
find . -name "*.csv" -exec cp -f "{}" "{}.old" \;
===== git =====
Создать новый репозиторий по ssh
touch README
git init
git add README
git commit -m "first commit"
git remote add origin ssh:gituser@git.repository.ru/path/to/gitfile.git
git push -u origin master
Push существующего репозитория по ssh
git remote add origin ssh:gituser@git.repository.ru/path/to/gitfile.git
git push -u origin master
Создать новый репозиторий по http
touch README
git init
git add README
git commit -m "first commit"
git remote add origin http://git.repository.ru/path/to/gitfile.git
git push -u origin master
Push существующего репозитория по http
git remote add origin http://git.repository.ru/path/to/gitfile.git
git push -u origin master
===== XML =====
Есть две популяные программы для обработки данных в формате XML:
* [[http://xmlsoft.org/xmllint.html|xmllint]]
* [[http://xmlstar.sourceforge.net/doc/UG/xmlstarlet-ug.html|xmlstarlet]]
==== xmllint ====
xmllint входит в состав библиотеки libxml. Однако мне больше приходилось работать со второй программой, поэтому для xmllint приведу лишь несколько примеров
Перекодировать xml-файл в кодироку utf-8: –encode utf-8. Удалить описание CDATA у данных (сами данные вывести): –nocdata. Отформатировать вывод для удобочитаемости: –format
xmllint --nocdata --format --encode utf-8 dump.xml>dump1.xml
Выбрать из документа XML все элементы ip, являющиеся подэлементами content
xmllint --xpath .//*/content/ip dump1.xml
Выбрать из документа XML все элементы параметры id, принадлежащие элементам content
xmllint --xpath .//*/content/@id dump1.xml
==== xmlstarlet ====
xmlstarlet [options...] {command} [cmd-options...]
У xmlstalet есть несколько команд, которые задают что именно программа должна делать. Основные команды:
* ed (or edit) - позволяет редактировать предоставленный программе XML
* sel (or select) - дает возможность делать выборку из XML по указанным критериям
* val (or validate) - проверяет XML на предмет его согласованности
* fo (or format) - форматирование XML-документа
В качестве данных для примера беру xml-файл от Роскомнадзора(РКН) dump.xml, который имеет примерно следующий формат:
http://cannabay.org/
cannabay.org
94.76.213.163
www.weedy.be
217.70.184.50
...
Это очень большой XML-файл и имеет очень непростую структуру. Если научиться разбирать такой файл с данными, то любые другие xml-данные покажутся совсем простыми.
Файл содержит множество записей content у которых есть id - определяющий номер записи в списке РКН. Также может быть указан тип записи blockType (domain,ip,domain-mask), если он не указан, то значит тип - URL.
=== форматирование ===
Перекодировать и переформатировать исходный XML
Описание опций команды:
* -n - не делать отступы перед элементами
* -o - не выводить блок
* -C - секции, описанные как CDATA выводить просто текстом
* -N - удалять избыточные пространства имен
* -e utf-8 - вывод команды в кодировке utf-8
xmlstarlet fo -n -o -C -N -e utf-8 dump.xml >dump1.xml
=== редактирование ===
Удалить из документа блоки decision внутри content, а также потереть в блоках content атрибуты includeTime, entryType, hash
xmlstarlet ed -d "//content/decision" -d "//content/@includeTime" -d "//content/@entryType" -d "//content/@hash" dump.xml >dump1.xml
=== выборка содержимого ===
Для начала сделаем список всех типов записей content. Обратим внимание на первую пустую строку в выводе команды - это и есть вышеупомянутый тип URL
$ xmlstarlet sel -t -m "//content" -v "@blockType" -n dump.xml |sort|uniq
domain
domain-mask
ip
Выбрать значения элементов блока content с атрибутом id="7143"
xmlstarlet sel -T -t -m '//content[@id="7143"]' -v "*" dump.xml
Выбрать все ip-адреса из блока content с атрибутом id="7143". Вывести в формате "ip:1.1.1.1" по одной записи на строку
xmlstarlet sel -t -m '//content[@id="7143"]' -m ip -v "concat('ip:',self::ip)" -n dump.xml
Содержимое всех элементов в одну строку
xmlstarlet sel -t -m '//content[@id="7143"]' -v self::content -n dump.xml
Вывести содержимое блока content с атрибутом id="7143" в одну строку и то же самое, но в отформатированном виде
xmlstarlet sel -t -m '//content[@id="7143"]' -c self::content -n dump.xml
xmlstarlet sel -t -m '//content[@id="7143"]' -c self::content -n dump.xml|xmlstarlet fo -o
Выше был пример вывода ip-адресов заданного блока. А теперь выведем большее число значений элементов
xmlstarlet sel -t -m '//content[@id="7143"]' -v "concat('id:',@id,' blockType:',@blockType)" -n -m ip -v "concat('ip:',self::ip)" -n -b -m domain -v "concat('domain:',self::domain)" -n dump.xml
Ну и сконвертируем весь файл в более удобочитаемый текстовый формат (в выбору включены не все элементы, а только url,domain,ip,ipSubnet)
xmlstarlet sel -t -m '//content' -n -v "concat('id:',@id,' blockType:',@blockType)" -n -m url -v "concat('url:',self::url)" -n -b -m domain -v "concat('domain:',self::domain)" -n -b -m ip -v "concat('ip:',self::ip)" -n -b -m ipSubnet -v "concat('ipSubnet:',self::ipSubnet)" -n dump.xml > dump.txt
===== JSON =====
[[https://stedolan.github.io/jq/manual/|jq manual]]
===== Управление GSM-модемом =====
gnokii --identify
gnokii --monitor once
LANG=ru_RU.UTF-8 echo "TEST" | /usr/bin/gnokii --config /etc/gnokii/gnokii/config --sendsms "+79XXXXXXXXX" --smsc "+79XXXXXXXXX"
===== hping =====
Пинг TCP-пакетами
apt install hping3
hping3 -S -p 80 google.com
HPING google.com (tun0 216.58.210.142): S set, 40 headers + 0 data bytes
len=44 ip=216.58.210.142 ttl=120 DF id=0 sport=80 flags=SA seq=0 win=65535 rtt=55.6 ms
len=44 ip=216.58.210.142 ttl=120 DF id=0 sport=80 flags=SA seq=1 win=65535 rtt=55.4 ms
len=44 ip=216.58.210.142 ttl=120 DF id=0 sport=80 flags=SA seq=2 win=65535 rtt=51.2 ms
len=44 ip=216.58.210.142 ttl=120 DF id=0 sport=80 flags=SA seq=3 win=65535 rtt=51.0 ms
{{tag>linux unix}}