Удаление из файла конфигурации незначимых строк (закомментаренных и пустых)
egrep -v "^;|^$" php.ini >php.ini.compact
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"
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
полезные ключи:
Список объектов:
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 <LOOPBACK,UP,LOWER_UP> enp1s11 UP 00:04:23:d0:ac:af <BROADCAST,MULTICAST,UP,LOWER_UP> wlp1s9 DOWN c0:25:e9:13:c5:40 <BROADCAST,MULTICAST> tun0 UNKNOWN <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP>
$ ip -c -s -h -d l 1: lo: <LOOPBACK,UP,LOWER_UP> 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 -f **/*.log
Вывод файла с пропуском N первых строк
tail -n +<N+1> <filename>
Сменить массово всем файлам и каталогам права доступа
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" \;
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
Параметры фильтрации:
Доступны такие протоколы: ether, fddi, tr, wlan, ip, ip6, arp, rarp, decnet, tcp и udp.
Сменить массово всем файлам и каталогам права доступа
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" \;
Создать новый репозиторий по 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:
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 [options...] {command} [cmd-options...]
У xmlstalet есть несколько команд, которые задают что именно программа должна делать. Основные команды:
В качестве данных для примера беру xml-файл от Роскомнадзора(РКН) dump.xml, который имеет примерно следующий формат:
<?xml version="1.0" encoding="utf-8"?> <reg:register xmlns:reg="http://rsoc.ru" xmlns:tns="http://rsoc.ru" updateTime="2021-08-18T10:15:00+03:00" updateTimeUrgently="2021-08-17T19:30:00+03:00" formatVersion="2.4"> <content id="656" includeTime="2012-11-24T15:34:17" entryType="1" hash="D0853C128D92ACB78FBDF6EB31F9EE72"> <decision date="2012-11-14" number="2/1/11-168" org="ФСКН"/> <url>http://cannabay.org/</url> <domain>cannabay.org</domain> <ip>94.76.213.163</ip> </content> <content id="5081" includeTime="2014-02-17T19:20:19" entryType="1" blockType="domain" hash="5092484996B5516985016EAFA9F2A0C3"> <decision date="2013-02-06" number="2/1/11-2350" org="ФСКН"/> <domain>www.weedy.be</domain> <ip>217.70.184.50</ip> </content> ... </reg:register>
Это очень большой XML-файл и имеет очень непростую структуру. Если научиться разбирать такой файл с данными, то любые другие xml-данные покажутся совсем простыми.
Файл содержит множество записей content у которых есть id - определяющий номер записи в списке РКН. Также может быть указан тип записи blockType (domain,ip,domain-mask), если он не указан, то значит тип - URL.
Перекодировать и переформатировать исходный XML
Описание опций команды:
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
gnokii --identify gnokii --monitor once
LANG=ru_RU.UTF-8 echo "TEST" | /usr/bin/gnokii --config /etc/gnokii/gnokii/config --sendsms "+79XXXXXXXXX" --smsc "+79XXXXXXXXX"
Пинг 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