Инструменты пользователя

Инструменты сайта


nix:komandy_i_programmy

Команды и программы и их применение

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

наблюдение за логами в каталоге и подкаталогах

tail -f **/*.log

Вывод файла с пропуском N первых строк

tail -n +<N+1> <filename>

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:

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, который имеет примерно следующий формат:

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

Описание опций команды:

  • -n - не делать отступы перед элементами
  • -o - не выводить блок <?xml version="1.0"?>
  • -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

Управление 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
nix/komandy_i_programmy.txt · Последнее изменение: 2024/03/01 08:37 — san

Если не указано иное, содержимое этой вики предоставляется на условиях следующей лицензии: Public Domain
Public Domain Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki