Есть довольно известная программа в Linux (в Windows тоже работает) для хранения и управления историей - atuin.
Я развернул всё это хозяйство у себя на постоянку, настроил, чтобы было удобно пользоваться и хочу поделиться своим опытом. Сразу скажу, что я не уверен, что подобное стоит устанавливать в прод. Я бы не стал, если прям сильно не нужна эта функциональность. Развернул всё на своих личных машинах, которых у меня немало и которым тоже требуется централизованное управление.
📌 Перечислю основные возможности atuin:
▪️Замена основного поиска по истории через CTRL + R. Работает удобно, мне лично очень понравилось.
▪️Централизованный сбор истории со всех хостов. Хранение либо в SQLite, либо в PostgreSQL. Это одновременно и удобный поиск по всей истории, и её бэкап.
▪️На сервере может показывать глобальную историю, историю всего хоста, текущей сессии или конкретной папки.
▪️Помимо непосредственно выполненной команды сохраняет код выхода, время исполнения, в какой директории была запущена.
▪️Стандартную историю в ~/.bash_history не заменяет и не перезаписывает.
▪️Работает со всеми популярными оболочками, в том числе powershell.
▪️В bash работает с помощью хуков preexec и precmd через расширение bash-preexec.sh, в других оболочках не проверял.
▪️ Всё это open source.
Не буду подробно останавливаться на установке клиентов, так как в документации всё это есть. Для сервера я взял готовый docker-compose.yml, убрал оттуда postgres и заменил на локальную sqlite, просто указав:
ATUIN_DB_URI: sqlite:///config/atuin.db
Соответственно, бэкап всей истории - это бэкап файла atuin.db. Теперь после установки клиентов на хостах достаточно добавить адрес своего сервера для хранения там истории.
Приведу пример настроенного мной клиента в ~/.config/atuin/config.toml. Отражу только те параметры, что изменил по сравнению со стандартом:
sync_address = "http://192.168.137.57:8888"
Мой локальный адрес сервера истории
sync_frequency = "0"
Сразу после записи команды отправлять её на сервер
filter_mode = "host"
По умолчанию в поиске по CTRL+R открывается история хоста
history_format = "{time} {host} {user} - {directory} | {command}"
Формат хранения истории, по умолчанию не сохраняет имя сервера, добавил
style = "full"
Всегда отображать полный интерфейс
По умолчанию autin запускается по CTRL+R или по стрелке вверх. Последнее мне не нужно, я сразу отключил. Для этого в ~/.bashrc добавил ключ к запуску:
eval "$(atuin init bash --disable-up-arrow)"
После настройки первого клиента, регистрируем учётную запись на сервере:
# atuin register
Далее записываем в atuin уже существующую историю и синхронизируем её с сервера:
# atuin import auto
# atuin sync
На следующих серверах достаточно будет сделать:
# atuin login
И зайти под уже созданной учёткой. Теперь при нажатии CTRL+R у вас откроется поиск по текущей истории хоста. Дальнейшее нажатие комбинации CTRL+R переключает область поиска: сессия, директория, глобальный поиск.
Для того, чтобы статично вывести глобальную историю, а не искать по ней, можно использовать команду:
# atuin search --filter-mode global
Можно её грепать, а можно прямо тут написать строку для поиска. Например, смотрим на все перезагрузки:
# atuin search --filter-mode global reboot
В целом, удобное решение для централизованного хранения истории. Тут тебе и сама история хоста и по сути глобальный аудит. Не хватает веб интерфейса для просмотра.
#linux