====== Команды и программы и их применение ====== ===== 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}}