На днях задачка небольшая была по сохранению команд пользователя в консоли. В ней ничег...
На днях задачка небольшая была по сохранению команд пользователя в консоли. В ней ничего особенного, раньше делал подобное, но всё равно запишу по горячим следам, чтобы не забыть. Немного подработал решение. Есть одиночная VPS, где крутятся сайты. Доступ к исходникам по SFTP. Разработчики попросили сделать SSH доступ. На всякий случай решил добавить сохранение набранных консольных команд. Решений этой задачи много. Я в своё время делал подборку. Мне не захотелось ставить какие-то сторонние программы. Централизованной системы управления нет. Поэтому рассматривал 2 варианта, которые я уже раньше использовал: ▪️Через настройку PROMPT_COMMAND ▪️С помощью auditd Последнее более целостное и надёжное решение. Но лично мне не нравится смотреть логи auditd. Очень ненаглядно, много лишнего. Постоянно вспоминать надо, как сделать выборку, чтобы что-то найти. Решил в итоге использовать первый вариант. Для этого пользователю, чьи команды мы будем сохранять, добавляем в ~/.bashrc: export PROMPT_COMMAND='EX_CODE=$?; logger -p local6.debug "{\"user\":\"$(whoami)\",\"path\":\"$(pwd)\",\"command\":\"$(history 1 | sed "s/^[ ]*[0-9]\+[ ]*//")\", \"status\":\"$EX_CODE\"}";' Тут всё просто. Используем возможности bash в виде PROMPT_COMMAND. Значение этой переменной выполняется каждый раз перед появлением приглашения на ввод команды в оболочке. То есть вы ввели какую-то команду, она выполнилась, отработала команда в PROMPT_COMMAND и снова появилось приглашение на ввод. В этот момент мы просто используя logger записываем в системный лог некоторые переменные и очищенный вывод команды history 1, которая выводит последнюю введённую команду. В итоге получаем то, что надо. Выведем эти логи в отдельный лог-файл. Для этого добавляем конфигурацию в rsyslog. Создаём файл /etc/rsyslog.d/command-audit.conf: # cat > /etc/rsyslog.d/command-audit.conf <<'EOF' local6.debug /var/log/command-audit.log EOF Перезапускаем rsyslog: # systemctl restart rsyslog Заходим пользователем по SSH, что-то делаем в консоли и смотрим результат в файле /var/log/command-audit.log: 2026-10-01T20:03:43.038407+03:00 debian13 devbitrix01: {"user":"devbitrix01","path":"/var/www","command":"free -m", "status":"0"} 2026-10-01T20:03:47.192911+03:00 debian13 devbitrix01: {"user":"devbitrix01","path":"/var/www","command":"htop", "status":"0"} Мне нравится такой формат - просто и наглядно. Ещё и в json сразу обёрнут. У обычного пользователя доступа к этому логу нет, изменить он его не сможет. При желании этот лог легко отправить в централизованное хранилище с помощью любого сборщика логов (vector, alloy и т.д.), если оно используется. Ничего дополнительно на сервер ставить не надо, что очень удобно. Я не люблю донастраивать и что-то менять в уже введённых в эксплуатацию серверах. Обычно все подобные вещи делаю сразу в момент настройки, чтобы можно было всё проверить. ☝️ Важно понимать, что этот аудит легко отключить самим пользователем, или просто обойти. Он банально может обнулить переменную PROMPT_COMMAND. То есть это не инструмент повышения безопасности, а скорее просто модернизированная версия history для удобства пользователей, особенно если их несколько и администратора. #ssh #webserver