▍Топ полезных команд¶
Работа с awk¶
awk '/pattern/' file # Вывести строки с pattern
awk '/pattern/ {action; action;}' file # Выполнить действия в строках с pattern, например,
awk '/apple/ {print $2" "$3;}' file # если строка содержит "apple", вывести 2-ю и 3-ю колонку через пробел
awk '!/apple/ {print $0;}' file # если строка НЕ содержит "apple", вывести строку полностью
awk '{print NF;}' file # вывести кол-во столбцов в каждой строке. $NF вывел бы значение в последнем столбце
awk 'length > 10' file # вывести строки длиной > 10 символов
awk -F ':' '{print $1;}' /etc/passwd # вывести имена пользователей (разделитель ":")
cat permissions
File1 User1 Read 3000
Dir1 Grp2 Modify 2000
File3 User2 Modify 1000
Dir3 Grp1 Read 4000
Dir3 Grp3 Modify 6000
File1 User4 FullControl 10000
# Блок BEGIN - действия до обработки данных, END - после
# Вывести "Starting script" и задать счётчик в 0. Если 3-й столбец match "[Mm]odify", то увеличить счётчик. В конце вывести строку и счётчик, обработать файл permissions
awk 'BEGIN {print "Starting script"; count=0;} $3 ~/[Mm]odify/ {count++;} END {print "People with modify permissions:",count;}' permissions
Starting script
People with modify permissions: 3
# Изначально i=0, если i<кол-ва столбцов в строке, то прибавить к t значение 4-го столбца, затем увеличить i на единицу.
# Когда будут обработаны все строки файла permissions, вывести полученное значение t.
awk '{for(i=0;i<NF;i++) t+=$NF} END {print t;}' permissions
# 3000*4=12000
# 12000+2000*4=20000
# 20000+1000*4=24000
# 24000+4000*4=40000
# 40000+6000*4=64000
# 64000+10000*4=104000
104000
# Если 2-я колонка match [Uu]ser, а значение последней меньше 2000, то вывести строку
awk '$2 ~/[Uu]ser/ {if($NF>2000) print "User", $2, "has", $NF, "number which more than 2000";}' permissions
User User1 has 3000 number which more than 2000
User User4 has 10000 number which more than 2000
Работа с date¶
# Последнее воскресенье месяца
if [[ $(date -d "$date + 1week" +%d%a) =~ 0[1-7]Sun ]]
then
echo "$date is the last Sunday of the month!"
fi
date -d yesterday +'%b %d' # Вчера (мая 25)
date -d yesterday +%F # 2022-04-25
date -r file1 # дата изменения файла
date -u # время в UTC
date +%T -s "10:50:9" # изменить системное время на 10:50:09
date -s "15 aug 2022 14:00:00" # изменить дату и время
date -d@$(echo $SECONDS) -u +%T # время работы сессии bash - конвертировать из секунд в hh:mm:ss
# Время работы сессии bash полезно для подсчёта времени работы скрипта (конец - начало = время работы)
# Форматирование даты
%F - yy-MM-dd (2022-05-26)
%D – Display date as mm/dd/yy
%Y – Year (e.g., 2020)
%m – Month (01-12)
%B – Long month name (e.g., November)
%b – Short month name (e.g., Nov)
%d – Day of month (e.g., 01)
%j – Day of year (001-366)
%u – Day of week (1-7)
%A – Full weekday name (e.g., Friday)
%a – Short weekday name (e.g., Fri)
%T - Время в формате 10:20:30
%H – Hour (00-23)
%I – Hour (01-12)
%M – Minute (00-59)
%S – Second (00-60)
Работа с find¶
find /etc -name 'cron*' # найти в /etc всё, начинающееся с "cron"
find /etc -type f -name 'cron*' # только файлы (-type d - только каталоги)
find . -perm 777 # найти в текущем каталоге файлы с правами доступа 777
find . -perm 777 -exec chmod 555 {} \; # изменить им разрешения на 555
find / -mtime +1 # найти файлы с датой изменения старше суток
find / -atime +1 # найти файлы с датой доступа старше суток
find / -group www-data # файлы с владельцем-группой
find / -size 1MB # найти файлы размером 1 МБ
find /var/www -name *bxu* -exec rm -rf {} +
Работа с grep¶
grep ^hello file1 # обычный grep понимает регулярки
grep [1-9] file1 # найти цифры с 1 по 9
grep [a-f] file1 # буквы с a до f
grep -f expression1 file1 # взять запрос из файла expression1
grep -lr cron /etc # вывести имена файлов, содержащих в себе слово "cron" (-r - recursive)
grep -sIroE 'text' . # вывести все файлы, в которых есть слово text
Работа с lsof¶
Вывод списка открытых файлов, сокетов и каналов.
COMMAND PID TID TASKCMD USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd 1 root cwd DIR 8,2 4096 2 /
systemd 1 root rtd DIR 8,2 4096 2 /
systemd 1 root txt REG 8,2 92544 2103315 /usr/lib/systemd/systemd
COMMAND - процесс
PID - идентификатор процесса
USER - пользователь
FD - дескриптор файла
cwd — рабочий каталог
rtd — каталог /root
txt — исполняемый файл
mem — область памяти
число — номер дескриптора файла, используемого процессом
u — файл открыт с правами RW
r — файл открыт с правами R
w — файл открыт с правами W с частичной блокировкой файла
W — файл открыт с правами W с блокировкой всего файла
TYPE — тип файла
REG — файл
DIR — каталог
FIFO — именованные каналы
DEVICE — номер устройства, на котором находится файл
SIZE/OFF — размер
NODE — номер inode, индексного дескриптора
NAME — имя файла
# Процессы, использующие каталог /tmp/test
lsof +D /tmp/test
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
vi 4570 root 3u REG 253,0 12288 2621462 /tmp/test/.test.txt.swp
# Информация о процессе
lsof -p 4570
Если файл /tmp/test/.test.txt.swp удалить при работающем процессе, то lsof всё равно будет показывать файл с пометкой deleted. Если процесс завершить, то удалится дескриптор в /proc и файл исчезнет из вывода.
# Вывести удалённые файлы, занимающие память из-за того, что процесс не отпустил дескрипторы
lsof -a +L1 /tmp/test
Работа с printf¶
printf - format and print data
printf "Name:\t%s\nID:\t%04d\n" "User" "67"
Name: User
ID: 0067
today=$(date +%F)
time=$(date +%T)
printf -v d "Current user:\t%s\nDate:\t\t%s @ %s\n" $USER $today $time # d - задаваемая переменная
echo "$d"
Current user: user
Date: 2022-05-27 @ 14:35:20
Работа с read¶
read -r < log.txt # Читает первую строку из файла
echo "$REPLY" # If no NAMEs are supplied, the line read is stored in the REPLY variable.
Jun 5 00:00:29 srv-mail1 postfix/smtpd[217187]: disconnect from unknown[192.168.5.3] ehlo=1 auth=0/1 rset=1 quit=1 commands=3/4
read -r month day time server id message < log.txt
echo "$message" # any leftover words assigned to the last NAME.
disconnect from unknown[192.168.5.3] ehlo=1 auth=0/1 rset=1 quit=1 commands=3/4
echo "$server"
srv-mail1
Работа с sed¶
# Заменить test на another test
echo "This is a test" | sed 's/test/another test/'
# Заменить в файле (файл не перезаписывается)
sed 's/test/another test' ./myfile
# Ключ -e - несколько действий
sed -e 's/This/That/; s/test/another test/' ./myfile
# Ключ -f - чтение команд из файла. Содержимое файла mycommands:
s/This/That/
s/test/another test/
# команда:
sed -f mycommands myfile
# Флаги, пишутся в конце команды (s/pattern/replacement/flags). Без флагов обрабатывается только первое совпадение.
# g - заменить все совпадения, число - обработать именно это совпадение,
# p - вывести исходную строку, w outputfile - записать результат в outputfile.
sed 's/test/another test/g' myfile
sed 's/test/another test/2' myfile
sed -n 's/test/another test/p' myfile # -n - вывести только совпадения
sed 's/test/another test/w output' myfile
# Можно заменить разделитель для более удобного чтения
sed 's/\/bin\/bash/\/bin\/csh/' /etc/passwd
sed 's!/bin/bash!/bin/csh!' /etc/passwd
# Фильтр, обработка диапазона строк (с 10 по 20)
sed '10,20s/test/another test/' myfile
# с 10 до конца (можно использовать регулярку)
sed '2,$s/test/another test/' myfile
# заменить только в строке, где встречается слово user
sed '/user/s/bash/csh/' /etc/passwd
# удалить 3-ю строку
sed '3d' myfile
# удалить с 10 по 20
sed '10,20d' myfile
# с 10 до конца
sed '10,$d' myfile
# удаление строк по шаблону
sed '/test/d' myfile
# При удалении можно указывать несколько шаблонов.
# удалятся строки, где есть second и fourth и всё между ними
sed '/second/,/fourth/d' myfile
# вставка текста до
echo "Another test" | sed 'i\First test'
# вставка текста после
echo "Another test" | sed 'a\First test'
# перед 2-й строкой
sed '2i\This is the inserted line.' myfile
# заменить целиком всю 3-ю строку
sed '3c\This is a modified line.' myfile
# заменить целиком все строки, где есть This is
sed '/This is/c This is a changed line of text.' myfile
# замена отдельных символов на соответствующие (1 на 5 и т. д.)
# применяется ко всему потоку, ограничить нельзя
sed 'y/123/567/' myfile
# вывести строки с их номерами
sed '=' myfile
# вывести номера строк, соответствующих шаблону
sed -n '/test/=' myfile
# вставить содержимое newfile после 3-й строки myfile
sed '3r newfile' myfile
# вставлять содержимое newfile каждый раз после строки, соответствующей шаблону
sed '/test/r newfile' myfile
# Заменить строки в myfile, где есть DATA, на содержимое newfile, удалить исходную строку
sed '/DATA/ {
r newfile
d}' myfile
# Заменить foo на too.
sed -i 's/foo/too/'
# Удалить 14ю строку.
sed -i '14d' /file
# Удалить строку содержащую Network или network.
sed -i '/[Nn]etwork/d' /file
# Добавить в конец файла "[mounts]" затем перенос на новую строку и "user root".
sed -i '$ a \\n[mounts]\nuser root' /etc/munin/config
# После 14ой строки добавить "echo "graph_category logger"".
sed '14a\ echo \"graph_category logger\"' /etc/munin/plugins/command
# Вставить в начало файла '# vim: ft=ruby' и перенос строки.
sed '1i # vim: ft=ruby\n'
# Заменить повторяющиеся пустые строки на одну пустую строку
sed -e ':a;/^$/N;/\n$/{D;ba}' file.txt
# Конвертация переносов строк DOS (CR/LF) в Unix (LF)
sed 's/.$//' dosfile.txt > unixfile.txt
# Заменить строку string1 строкой string2
sed 's/string1/string2/g'
# Изменить строку anystring1 на anystring2
sed 's/\(.*\)1/\12/g'
# Убрать комментарии и пустые строки
sed '/ *#/d; /^ *$/d'
# Соединить строки (линии) с предшествующим \
sed ':a; /\\$/N; s/\\\n//; ta'
# Удалить предшествующие пробелы строк
sed 's/[ \t]*$//'
# Закомментировать активные метасимволы оболочки двумя кавычками
sed 's/\([\\`\\"$\\\\]\)/\\\1/g'
# Выровнять числа по правой границе
seq 10 | sed "s/^/ /; s/ *\(.\{7,\}\)/\1/"
# Напечатать 1000-ную строку
sed -n '1000p;1000q'
# Напечатать строки с 10 по 20-ую
sed -n '10,20p;20q'
# Получить title из HTML страницы
sed -n 's/.*<title>\(.*\)<\/title>.*/\1/ip;T;q'
# Убрать пустые строки из файла
sed '/^$/d' input.txt > output.txt
# Удаляем из всех .html файлов начало до тэга <pre>
# и от </pre> до конца файла, включая и сами тэги
cat *.html | sed '1,/<pre>/d; /<\/pre>/,$d' > final.file
Работа с su, sudo¶
# войти от учётки vasya
su vasya
# войти от учётки vasya + его переменные окружения
su - vasya
# войти под рутом
su
# запустить одну команду без полноценного входа
su -c 'id'
#Проверить, какие команды разрешены юзеру vasya от рута
sudo -l
Отправить тестовое письмо:
echo "test" | mail -s "Test Subject" [email protected]
Выполнить PHP функцию в консоли:
Отключить спящий режим на ubuntu server:
Для проверки набора переменных BASH_ENV:
Замер скорости диска:
или --filename нужно указать путь к файлу на диске, размер по желанию но лучше не менее гигабайта (чтобы обойти кэш самого диска, если он назойливый). Параметр --direct=1 не даст системе кэшировать операции. Для теста на чтение соответственно использовать --rw=read.Полная очистка диска
$ sudo shred -vfz -n 10 /dev/sdf
shred: /dev/sdf: проход 1/11 (random)…
shred: /dev/sdf: проход 1/11 (random)…351MiB/56GiB 0%
shred: /dev/sdf: проход 1/11 (random)…702MiB/56GiB 1%
shred: /dev/sdf: проход 1/11 (random)…1,0GiB/56GiB 1%
shred: /dev/sdf: проход 1/11 (random)…1,3GiB/56GiB 2%
...
Обновить locate:
Подключить UDF ISO образ
Конвертировать HEIC в JPG:
Изменить текстовый редактор для конкретного случая:
Удалить snapd в Ubuntu Server:
Удалить старые данные telegraf в Influxdb 1.8:
$ docker exec -ti influxdb influx
Connected to http://localhost:8086 version 1.8.10
InfluxDB shell version: 1.8.10
> use telegraf;
Using database telegraf
> DELETE WHERE time < '2022-06-01'
будут удалены все записи до 2022-06-01
Перенос почты между серверами
imapsync.exe --host1 "imap.yandex.ru" --user1 "mail1" --password1 "password1" ^
--host2 "imap.mail.ru" --user2 "mail1" --password2 "password2" ^
--useheader "Message-Id" --automap
Послать минимально валидный HTTP GET запрос:
Прочитать из сокета, что нам скажет GitHub.com с SSH порта:
Работа с сетью¶
Изменение маршрута по умолчанию:
Добавить роут:
Выключаем IPv6:
sudo sysctl -w net.ipv6.conf.all.disable_ipv6=1
sudo sysctl -w net.ipv6.conf.default.disable_ipv6=1
sudo sysctl -w net.ipv6.conf.lo.disable_ipv6=1
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1
Работа с архивами¶
Создать .tar.gz:
tar -czvf file.tar.gz /full/path — создать .tar.gz (архив)
tar -cjvf file.tar.bz2 /full/path — создать .tar.bz2 (архив)
Распаковать .tar:
Распаковать gz:
Распаковать многотомный архив:
Получить листинг файлов в архиве:
Извлечь конкретный файл из архива:
Скопировать файл на сервер:
scp -P 12345 file.tar [email protected]:/home/user
Скопировать содержимое директории home на сервер:
scp -P 12345 -r /home/ [email protected]:/home2/
Запуск программ от супер пользователя:
jexec /usr/sbin/jexec имяпользователя, пользователь
asterisk /usr/local/sbin/asterisk имяпользователя
Работа с fail2ban¶
Вывести список джейлов:
Вывести статистику по конкретному джейлу nextcloud:
sudo fail2ban-client status nextcloud
Status for the jail: nextcloud
|- Filter
| |- Currently failed: 1
| |- Total failed: 51
| `- File list: /путь/до/лога/nextcloud.log
`- Actions
|- Currently banned: 1
|- Total banned: 19
`- Banned IP list: XX.XX.XX.XX
Вывести статистику по всем джейлам:
sudo fail2ban-client status | sed -n 's/,//g;s/.*Jail list://p' | xargs -n1 sudo fail2ban-client status
Принудительно забанить IP в джейле nextcloud:
Принудительно разбанить IP в джейле nextcloud:
Отладка фильтра:
в файл /tmp/filter вставить нужную строку из лога и запустить парсер:
Работа с пользователями¶
Добавить пользователя:
sudo adduser testuser
или задать пользователя с конкретными gid и uid:
sudo groupadd asterisk -g 8000
sudo useradd asterisk -u 8000 -g 8000 -m -s /usr/sbin/nologin
Добавить пользователя testuser в существующую группу asterisk:
sudo usermod -aG asterisk testuser
Работа с wget¶
Скачать сайт целиком
После выполнения данной команды в директорию site.com будет загружена локальная копия сайта site.com. Чтобы открыть главную страницу сайта нужно открыть файл index.html. Рассмотрим используемые параметры:
-r — указывает на то, что нужно рекурсивно переходить по ссылкам на сайте, чтобы скачивать страницы.
-erobots=off — игнорировать правила в файле robots.txt
-k — используется для того, чтобы wget преобразовал все ссылки в скаченных файлах таким образом, чтобы по ним можно было переходить на локальном компьютере (в автономном режиме).
-p — указывает на то, что нужно загрузить все файлы, которые требуются для отображения страниц (изображения, css и т.д.).
-l — определяет максимальную глубину вложенности страниц, которые wget должен скачать (по умолчанию значение равно 5, в примере мы установили 7). В большинстве случаев сайты имеют страницы с большой степенью вложенности и wget может просто «закопаться», скачивая новые страницы. Чтобы этого не произошло можно использовать параметр -l.
-E — добавлять к загруженным файлам расширение .html.
-nc — при использовании данного параметра существующие файлы не будут перезаписаны. Это удобно, когда нужно продолжить загрузку сайта, прерванную в предыдущий раз.
Freebsd¶
Добавить нового пользователя vasya в систему и добавить этого пользователя в группу clients.
Удалить пользователя:
Руссификация консоли
Показать превышение дисковой коты по jail:
df | grep -v devfs | grep "/jails/" | awk '{if($5>90) print $6,$5}' | sed 's/\/Zjails\///g' | column -t
Задать переменную для запуска скриптов из "/root/bin":
Примонтировать бакет в Яндекс облаке (для дебаг режима можно использовать ключи "-d -f"):
s3fs namebucket /srv/namebucket -o passwd_file=/root/.passwd-s3fs -o url=http://storage.yandexcloud.net -o use_path_request_style
Если при монтировании бакета выводится ошибка:
Значит не загружен модуль fuse, проверить вывод:
# kldstat
Id Refs Address Size Name
1 17 0xffffffff80200000 20647c8 kernel
2 1 0xffffffff82266000 381130 zfs.ko
3 2 0xffffffff825e8000 a380 opensolaris.ko
4 1 0xffffffff82821000 2328 ums.ko
5 1 0xffffffff82824000 2e4a8 pf.ko
Загружаем модуль:
Полезные утилиты¶
-
expr: для выполнения арифметических и булевых операций, а так же регулярных выражений
-
m4: простенький макро-процессор
-
yes: вывод строки в бесконечном цикле
-
cal: классный календарь
-
env: для того, чтобы выполнить команду (полезно в Bash-скриптах)
-
printenv: print out environment variables (useful in debugging and scripts)
-
look: найти английские слова (или строки) в файле
-
cut:, paste и join: манипуляция данными
-
fmt: форматировка параграфов в тексте
-
pr: отформатировать текст в страницы/колонки
-
fold: (обернуть) ограничить длину строк в файле
-
column: форматировать текст в колонки или таблицы
-
expand: и unexpand: конвертация между табами и пробелами
-
nl: добавить номера строк
-
seq: вывести числа
-
bc: калькулятор
-
factor: возвести числа в степень
-
gpg: зашифровать и подписать файлы
-
toe: таблица терминалов terminfo с описанием
-
nc: дебаггинг сети и передачи данных
-
socat: переключатель сокетов и перенаправление tcp-портов (похоже на netcat)
-
slurm: визуализация трафика сети
-
dd: перенос информации между файлами и девайсами
-
file: узнать тип файла
-
tree: показать директории и сабдиректории в виде дерева; как ls, но рекурсивно
-
stat: информация о файле
-
tac: вывести файл наоборот (ласипан)
-
shuf: случайная выборка строк из файла
-
comm: построчно сравнить отсортированные файлы
-
pv: мониторинг прогресса прохождения информации через пайп
-
hd: и bvi: дамп и редактирование бинарников
-
strings: найти текст в бинарникх
-
tr: манипуляция с char (символьным типом)
-
iconv: и uconv: конвертация кодировок
-
split: и csplit: разбить файлы
-
sponge: прочитать весь инпут перед тем, как его записать, полезно когда читаешь из того же файла, куда записываешь, например вот так: grep -v something some-file | sponge some-file
-
units: конвертер, метры в келометры, версты в пяди (смотрите /usr/share/units/definitions.units)
-
7z: архиватор с высокой степенью сжатия
-
ldd: показывает зависимости программы от системных библиотек
-
nm: получаем названия всех функций, которые определены в .o или .a
-
ab: бенчмаркинг веб-серверов
-
strace: дебаг системных вызовов
-
mtr: лучшей трассировка для дебаггинга сети
-
cssh: несколько терминалов в одном UI
-
rsync: синхронизация файлов и папок через SSH
-
wireshark: и tshark: перехват пакетов и дебаг сети
-
ngrep: grep для слоя сети (network layer)
-
host: и dig: узнать DNS
-
lsof: процессинг дискрипторов и информация о сокетах
-
dstat: полезная статистика системы
-
glances: высокоуровневая, многосистемная статистика
-
iostat: статистика CPU и использования жесткого диска
-
htop: улучшенная версия top
-
last: история логинов в систему
-
w: под каким пользователем вы сидите
-
id: информация о пользователе/группе
-
sar: история системной статистики
-
iftop: или nethogs: использование сети конкретным сокетом или процессом
-
ss: статистика сокетов
-
dmesg: ошибки бута и ошибки системы
-
hdparm: манипуляция с SATA/ATA
-
lsb_release: информация о дистрибутиве Linux
-
lsblk: cписок блочных устройств компьютера: древо ваших дисков и логических дисков
-
lshw:, lscpu, lspci, lsusb, dmidecode: информация о железе включая, CPU, BIOS, RAID, графику, девайсы, и т.д.
-
fortune:, ddate, и sl: хм, не знаю будут ли вам “полезны” веселые цитатки и поезда, пересекающие ваш терминал :)