Как настроить удобный поиск и запуск команд терминала и сессий SSH в Tmux с помощью плагина FZF смотрите под спойлером:
Спойлер :)
Сразу напомню, что по умолчанию клавиша prefix в Tmux это сочетание клавиш Ctrl-b⌨️
Вариант №1 - установка моей конфигурации tmux
Предварительные требования:
- Любой моноширный иконочный Powerline шрифт⚡️, например, из проекта Nerd fonts. Я предпочитаю шрифт Hack Nerd Font Mono. Шрифт необходимо поместить по пути
/usr/share/fonts/либо отдельно для пользователя в~/.local/share/fonts/и применить его к терминалу; - Любой эмулятор терминал🧑💻, с поддержкой TrueColor и темы Nord, например, Gnome-terminal или Guake;
- (Опционально) Интерактивная командная оболочка💻, например, Zsh + Oh-My-Zsh с темой agnoster.
Установка конфига из моего GitHub:
sudo apt update && sudo apt install -y git xclip fzf tmux
git clone https://github.com/r4ven-me/tmux.git ~/.config/tmux
tmux new -s WorkПервый запуск займет время.
Проверяем работу поиска команд/сессий клавишами.
Вариант №2 - установка и настройка плагина FZF отдельно
Устанавливаем необходимые утилиты:
sudo apt update && sudo apt install -y git xclip fzf tmuxОткрываем на редактирование конфиг:
mkdir -p ~/.config/tmux/
nvim ~/.config/tmux/tmux.confВставляем следующий код:
# Параметры FZF
set-environment -g TMUX_FZF_OPTIONS "-p -w 65% -h 35% -m"
# Быстрые команды через prefix+Ctrl-b
bind-key C-b run-shell "
command_list="~/.config/tmux/commands.list"
command=\$(cat \$command_list | fzf-tmux \$TMUX_FZF_OPTIONS --reverse --prompt=\"⚡️ Command: \") && \
tmux send-keys \"\${command#*] }\" || \
exit 0
"
# Быстрый запуск SSH сессии из ~/.ssh/config через prefix+Shift-b
bind-key B run-shell "
host=\$(grep -E \"^Host \" ~/.ssh/config | sed \"s/^Host //\" | fzf-tmux \$TMUX_FZF_OPTIONS --reverse --prompt=\"🌐 SSH: \") && \
tmux new-window -n \"SSH [\$host\"] \"ssh \$host\" || \
exit 0
"
# активация плагина FZF
set -g @plugin 'sainnhe/tmux-fzf'
# эта строка обязательно должна быть последней!
run '~/.config/tmux/plugins/tpm/tpm'Создаем файл commands.list со списком нужных команд:
nvim ~/.config/tmux/commands.listУказываем команды построчно. Пример:
ps --sort=-%cpu -eo user,pid,ppid,state,comm | head -n6
ps --sort=-%mem -eo user,pid,ppid,state,comm | head -n6
du -h / 2> /dev/null | sort -rh | head -n 20Если вы хотите добавить комментарий к команде, сделайте это в квадратных скобках до самой команды + пробел между ними. Пример:
[ps top5 cpu] ps --sort=-%cpu -eo user,pid,ppid,state,comm | head -n6
[ps top5 mem] ps --sort=-%mem -eo user,pid,ppid,state,comm | head -n6
[du top20] du -h / 2> /dev/null | sort -rh | head -n 20Теперь устанавливаем пакетный менеджер tpm и запускаем установку плагина FZF:
git clone https://github.com/tmux-plugins/tpm ~/.config/tmux/plugins/tpm
tmux new -s Work '~/.config/tmux/plugins/tpm/bin/install_plugins'Готово. Создаем новую сессию:
tmux new -s WorkЕсли необходимо задать дополнительные параметры FZF, то делается это через специальную переменную окружения TMUX_FZF_OPTIONS.
Ранее мы уже задали ее прямо в конфиге tmux.
Например, следующие значения задают пользовательские параметры размера всплывающего окна и цветовую палитру Nord:
set-environment -g TMUX_FZF_OPTIONS "
-p -w 65% -h 35% -m
--exact
--color=fg:#e5e9f0,bg:#2e3440,hl:#81a1c1
--color=fg+:#e5e9f0,bg+:#2e3440,hl+:#81a1c1
--color=info:#eacb8a,prompt:#bf6069,pointer:#b48dac
--color=marker:#a3be8b,spinner:#b48dac,header:#a3be8b
--color=border:#5e81ac
--border=rounded
"Проверяем работу поиска команд/сессий клавишами.
prefix+Ctrl-b(команды):
💡Список команд из коллекции в нужном формате доступен на GitHub.
prefix+Shift-b(SSH хосты):
Пример заполнения конфига SSH
Создаем/открываем файл клиентского конфига SSH со списком хостов:
nvim ~/.ssh/configЗаполняем его примерно так:
Host local
HostName localhost
User ivan
Port 22
Host test
HostName test.r4ven.me
User ivan
Port 2222Подробнее про тонкую настройку клиента SSH мы говорили в этой статье.
Собственно, сам список команд:
1## Process Management
2# показать топ-5 процессов по CPU
3ps --sort=-%cpu -eo user,pid,ppid,state,comm | head -n6
4# показать топ-5 процессов по памяти
5ps --sort=-%mem -eo user,pid,ppid,state,comm | head -n6
6# показать дерево процессов
7ps -axf -eo user,pid,ppid,state,comm
8# показать зомби-процессы
9ps -eo user,pid,ppid,state,comm | awk '$4=="Z" {print $3}'
10# показать команду родительского процесса
11ps -o pid,command --ppid 698
12# показать дерево cgroups systemd
13systemd-cgls
14# показать иерархию процессов в виде дерева
15pstree -p -t -n -C age
16# вывести исполняемые бинарники всех процессов пользователя
17for pid in $(ps -u $USER -o pid); do exe=$(readlink -f /proc/$pid/exe 2>/dev/null); if [ "$exe" ]; then echo "$pid: $exe"; fi; done | awk '{print $2}' | sort -u
18
19## System Monitoring
20# показать точки монтирования с заполнением >80%
21df -h | awk '$5 ~ /^8[0-9]%/ {print $6}'
22# показать топ-20 по использованию диска
23du -h / 2> /dev/null | sort -rh | head -n 20
24# показать открытые файлы в директории
25lsof +D /opt
26# показать аптайм в unixtime
27date -d "$(uptime -s)" +%s
28# показать топ-10 команд из истории bash
29history | awk '{print $2}' | sort | uniq -c | sort -rn | head
30# показать процессы, использующие swap
31for file in /proc/*/status ; do awk '/VmSwap|Name/{printf $2 " " $3}END{ print ""}' $file; done | sort -k 2 -n -r | head -n 10
32# показать значение swappiness
33cat /proc/sys/vm/swappiness
34# показать OOM score для процессов
35printf "PID\tOOM Score\tOOM Adj\tCommand\n"; while read -r pid comm; do [ -f /proc/$pid/oom_score ] && [ $(cat /proc/$pid/oom_score) != 0 ] && printf "%d\t%d\t\t%d\t%s\n" "$pid" "$(cat /proc/$pid/oom_score)" "$(cat /proc/$pid/oom_score_adj)" "$comm"; done < <(ps -e -o pid= -o comm=) | sort -k 2nr
36# мониторинг IO активности
37iotop -o -P -d 5
38# извлечь IP-адреса из лога
39grep -a -E '([0-9]{1,3}\.){3}[0-9]{1,3}' /var/log/nginx/access.log
40
41## Scheduling
42# добавить задание в cron
43{ crontab -l; echo "0 3 * * 0 ls -l &> dirs.txt"; } | crontab -
44
45## Networking
46# показать прослушиваемые порты
47ss -tuln | awk '{print $5}' | grep -Eo ':[0-9]+$' | sort -t: -k2 -n -u
48# игнорировать ICMP-пинги
49echo 1 | sudo tee /proc/sys/net/ipv4/icmp_echo_ignore_all
50# iptables: отслеживать ICMP-запросы
51iptables -A INPUT -p icmp --icmp-type echo-request -m recent --set --name PING_LIST
52# iptables: ограничить ICMP-запросы
53iptables -A INPUT -p icmp --icmp-type echo-request -m recent --update --seconds 10 --hitcount 5 --name PING_LIST -j DROP
54# nftables: заменить правило
55nft replace rule inet filter input handle 23 'tcp dport 2222 accept comment "Allow SSH"'
56# проверить порт через curl
57curl -v telnet://10.11.12.13:1234
58# проверить порт через echo
59echo > /dev/tcp/r4ven.me/443 && echo "open" || echo "unavailable"
60# проверить порт через openssl
61openssl s_client -connect r4ven.me:443
62
63## Packet Capture
64# захват пакетов по хосту и порту
65tcpdump -i any -nn -q dst host 10.11.12.13 and dst port 443
66# захват пакетов в файл
67sudo tcpdump -nn -i any host 10.11.12.13 -w ./tcpdump.pcap
68# захват пакетов в stdout
69sudo tcpdump -nn -i any host 10.11.12.13 >> ./tcpdump.txt
70# чтение pcap дампа
71sudo tcpdump -qns 0 -X -r ./tcpdump.pcap | less
72
73## Encryption / Certificates
74# зашифровать tar через openssl
75tar -czf - /var/log/apt | openssl enc -aes-256-cbc -pbkdf2 -e -out ./logs.tar.gz.enc
76# расшифровать файл через openssl
77openssl enc -aes-256-cbc -pbkdf2 -d -in ./logs.tar.gz.enc -out ./logs.tar.gz
78# подключиться к серверу через openssl
79openssl s_client -connect r4ven.me:443
80# показать сертификат удалённого сервера
81openssl s_client -connect r4ven.com:443 < /dev/null 2> /dev/null | openssl x509 -text
82# показать альтернативный сертификат
83openssl s_client -connect r4ven.me:443 -servername r4ven.me < /dev/null 2>/dev/null | openssl x509 -text
84# показать локальный сертификат
85openssl x509 -in ./ca-cert.pem -text -noout
86# зашифровать файл через GPG
87gpg --batch --passphrase-file /path/to/password_file --symmetric --cipher-algo AES256 example.txt
88
89
90## DNS / Network Tools
91# запрос через dig (по умолчанию)
92dig r4ven.me +short +answer +identify
93# запрос через альтернативный DNS
94dig @8.8.8.8 r4ven.me +short +answer +identify
95# nmap: проверка TCP порта
96nmap 10.11.12.13 -p 22
97# nmap: проверка UDP порта
98nmap -sU 10.11.12.13 -p 53
99
100
101## Docker
102# создать docker-сеть
103docker network create --opt com.docker.network.bridge.name=br-monitoring --opt com.docker.network.enable_ipv6=false --driver bridge --subnet 172.22.22.0/24 --gateway 172.22.22.1 monitoring_network
104# подключиться к сети контейнером
105docker run -it --rm --network swarm_network alpine sh
106# собрать docker-образ
107docker build -t r4venme/test .
108# сборка multiarch образа
109docker buildx create --use && docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7 -t r4venme/test:1.0 .
110# запустить multitool контейнер
111docker run --rm -it --network=container:test --pid container:test wbitt/network-multitool:alpine-extra bash
112
113## Git
114# инициализировать репозиторий и добавить remote
115git init --initial-branch=main && git remote add origin ssh://git@github.com/r4ven-me/reponame.git
116# инициализировать git с конфигом пользователя
117git init --initial-branch=main && git config user.name "Ivan Cherniy" && git config user.email "kar-kar@r4ven.me" && git remote add origin ssh://git@github.com/r4ven-me/reponame.git
118# отправить изменения в репозиторий
119git add . && git commit -m 'Upd' && git push
120
121## File Management
122# заменить текст в файле на месте
123sed -i.bak 's/old_text/new_text/g' file.txt
124# изменить права на файлы
125find /path -type f -exec chmod 644 {} \;
126# изменить права на директории
127find /path -type d -exec chmod 755 {} \;
128# установить ACL для пользователя
129setfacl -m u:ivan:rwx /opt/mydata
130
131## Web
132# скачать файл через curl
133curl -fsSL https://raw.githubusercontent.com/r4ven-me/dots/main/.zshrc -o ~/.zshrc
134# трассировка HTTP-запроса
135curl --trace-ascii trace.txt r4ven.me
136
137## Users and groups
138# добавить системную группу
139addgroup --system --gid 1995 zabbix
140# добавить системного пользователя
141adduser --system --gecos 'Zabbix monitoring system' --disabled-password --uid 1997 --ingroup zabbix --shell /sbin/nologin --home /opt/zabbix/zabbix_data zabbix
142
143## Systemd
144# отредактировать unit-файл
145systemctl edit --full --force unitname.service
146# показать параметры system.slice
147systemctl show system.slice
148# показать параметры юнита
149systemctl show unit_name
150# проверить статус службы
151systemctl is-active --quiet cron
152# перезапустить службу с отладкой
153sudo SYSTEMD_LOG_LEVEL=debug systemctl restart systemd-networkd
154# показать cgroups systemd
155sudo systemd-cgls
156# top по cgroups
157sudo systemd-cgtop -d 3
158
159## Sysrq
160# показать справку SysRq
161echo h | sudo tee /proc/sysrq-trigger | grep 'sysrq: HELP' /var/log/kern.log
162# выполнить перезагрузку через SysRq
163echo b > /proc/sysrq-trigger
164
165## Ansible
166# получить факты узла
167ansible debian12-vpn -m setup -a 'filter=os_family,distribution_version'
168# запустить playbook с переменными
169ansible-playbook playbook.yml -e 'user_name=root' -e 'user_home=/root'
170# запустить команду оболочки
171ansible debian12-vpn -b -m shell -a 'systemctl start service_name'
172
173## Asciinema
174# записать сессию терминала
175asciinema rec demo.cast
176# конвертировать запись в GIF
177agg demo.cast demo.gif --theme nord --font-family 'Hack Nerd Font Mono' --line-height 1.3 --font-size 18
178
179## Proc
180# трассировка exec команд
181strace -f -e execve ls -l
182# подключиться к PID через strace
183strace -p 123
184# показать переменные окружения процесса
185sudo cat /proc/<pid>/environ | xargs -0 -n1
186
187## Logging
188# перенаправить вывод в лог с отметкой времени
189exec > >(tee >(logger -t $(basename "${BASH_SOURCE[0]}")) | while IFS= read -r line; do echo "$(date +"[%Y-%m-%d %H:%M:%S.%3N]") - $line"; done | tee -a "${BASH_SOURCE[0]%.*}.log") 2>&1
190
191## SSH
192# прямое пробрасывание порта
193ssh -q -f -N -L 127.0.0.1:5432:localhost:5432 ivan@test.r4ven.me
194# временное пробрасывание порта
195ssh -q -f -L 127.0.0.1:5432:localhost:5432 ivan@test.r4ven.me sleep 60
196# временное пробрасывание с ключом и опциями
197ssh -q -f -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o ExitOnForwardFailure=yes -L 127.0.0.1:5432:localhost:5432 test.r4ven.me -p 2222 -l ivan -i ~/.ssh/id_ed25519_test sleep 60
198# обратное пробрасывание порта
199ssh -q -f -N -R 127.0.0.1:4443:localhost:5001 ivan@test.r4ven.me
200
201## Misc
202# сгенерировать псевдослучайную строку
203cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 8 | head -n 1

