Как я могу сохранить локальную метку времени всех удаленных команд, которые я использую ssh
(клиент openssh из командной строки запускается bash
)?
Требования:
Essential:
- 100% на стороне клиента, не полагаясь на ведение журнала на сервере
- Сконфигурированный или установленный для пользователя с журналами, сохраненными в домашнем каталоге пользователя.
- Поддержка различения нескольких одновременных сеансов с различными пользователями и хостами.
- Ненавязчивый (не нужно активировать его каждый раз и не сильно мешает использованию ssh)
Высокий приоритет:
- Либо вывод не зарегистрирован или отфильтрованы в максимально возможной степени
- Либо записи пароля не зарегистрированы, либо файл зашифрован
- Указывает фактические используемые команды (после завершения табуляции / истории, возвраты, CTRL+ Cи т.д ...)
Хорошо бы иметь:
- Также регистрирует команды в связанных сессиях (команды, введенные во время удаленных
ssh
илиsu <user>
сессий) - Начало и конец сеанса должны быть зарегистрированы
bash
Лучше было бы использовать простое решение без полномочий root (возможно, сценарийalias
илиbash
оболочка дляssh
команды?)
- Также регистрирует команды в связанных сессиях (команды, введенные во время удаленных
Мой уровень мастерства:
- Я не новичок в программировании, но я все еще учусь
bash
и "способ Linux", поэтому примеры кода с краткими пояснениями будут наиболее цениться.
Возможные стратегии
- Кейлоггер - Проблема: регистрирует пароли, не регистрирует вкладку / историю завершения (см . ответ Гленна )
screen
с выгрузкой прокрутки один раз в секунду иdiff
между ними для поиска новых строк прокрутки - Проблема: как это можно реализовать полезным автоматическим способом?ssh "$@" | tee >(some_cleaner_function >> $logfile)
- Проблема: не может обрабатывать многострочные команды или историю в связанных сессиях, необходима тщательная очистка (см. Мой ответ)- Сочетание некоторых из вышеперечисленных
Пример
Следующая сессия SSH:
user@local:~$ ssh user@remote
Last login: Tue Jun 17 16:34:23 2014 from local
user@remote:~$ cd test
user@remote:~/test$ ls
a b
user@remote:~/test$ exit
Может привести к записи в журнале, ~/logs/ssh.log
например:
2014-06-17 16:34:50 [user@remote - start]
2014-06-17 16:34:51 [user@remote] cd test
2014-06-17 16:34:52 [user@remote] ls
2014-06-17 16:34:53 [user@remote] exit
2014-06-17 16:34:53 [user@remote - end]
Или, возможно, для каждого сеанса будет создан отдельный журнал с командной строкой, используемой для запуска сеанса в верхней части файла.
bash
shell
command-line
openssh
Олег
источник
источник
Ответы:
Я был заинтригован вашим вопросом. Изначально я не собирался давать ответ, но меня зацепило.
Это использует,
expect
и это действительно ключ регистратор.Заметки:
uptime
команды), вы получите «upt \ t» в файле журнала, а не «uptime»^?
(символов возврата) в файле журнала.источник
В настоящее время я использую скрипт bash ниже. У него много проблем, но это единственное найденное мной решение, которое учитывает все требования, приоритеты и «приятно иметь» (по крайней мере, большую часть времени).
В этом ответе обсуждается, почему локальная регистрация сессий ssh так сложна.
Проблемы со сценарием, которые я обнаружил до сих пор:
Многострочные команды вызывают проблемы:
Связанные сеансы (использование
ssh
илиsu
команды на удаленном конце) вызывают прокрутку истории для записи команд с прокруткой вместо фактических используемых командРегулярные выражения могут быть улучшены и могут нуждаться в изменении для определенных сред:
cat -v
перед очисткой. В результате допустимый контент может быть удален, если вы когда-либо будете использовать строки, как^[[
в ваших командах.Нет завершения команды ssh, например, для имени хоста.Вы можете получить завершение оргии , если псевдоним этого скриптаssh
сalias ssh="sshlog"
Сценарий источника и установки:
Чтобы установить, вставьте следующее в ~ / bin / sshlog и сделайте исполняемым. Позвони с
sshlog <ssh command options>
. При желании псевдоним 'ssh' в файле .bashrc пользователя.Пример содержимого журнала:
источник
У меня есть менее сложный ответ, и, конечно, не кейлоггер. Я не понимаю, как вы независимы от журналов сервера (это означает, что все действия должны выполняться на сервере, а все журналы - это журналы на стороне сервера), и поэтому я подумал, что хорошей идеей является переход к общесистемному bashrc. Подсказка:
В Debian вы должны отредактировать файл: /etc/bash.bashrc, а в centos файл: / etc / bashrc
Если вы хотите начать регистрацию для сеанса, в котором вы находитесь, вам нужно найти файл, который вы отредактировали, например, выполнить:
в системе Debian или
в системе сентос.С этого момента каждая команда каждого сеанса ssh будет записываться в / var / log / syslog в системе debian и в / var / log / messages в системе centos.
Если вы хотите записать их в отдельный файл и не связываться с другими файлами журнала, вы можете использовать:
вместо предыдущего примера PROMPT_COMMAND, а затем настройте rsyslogd при необходимости.Например, в системе Debian отредактируйте файл /etc/rsyslog.conf : измените строку:
в и добавьте следующую строку в конец файла:затем выполните:
источник
Как насчет
strace -o /tmp/ssh_log -ff -s8192 -T -ttt -fp $(pidof sshd)
? Это регистрирует все сеансы SSH. Вам может понадобиться инструмент для последующего анализа журнала, или просто использоватьgrep
иawk
т. Д.-f
: след разветвленных детей-ff
: регистрировать каждого ребенка отдельноssh_log.PID
-s8192
: увеличить лимит регистрации строк (при необходимости)-T -ttt
: микросекундная штамповка в секундах с начала эпохи-p N
: прикрепить к пидуN
источник