How to log all the output displayed at screen?
running Ubuntu 18.04 on a non headles server dedicated only to cryptocurrency mining. The server, after some moments of mining, beeps and reboots. While it does that, there is some kind of error message that i cant get to read, is a lot like if you blink it youll miss kinda thing. It last less than a second on screen before rebooting. I’ve tried checking every log at var/log and also journalctl looking for this error message with no luck. Tried to log all the output of the miner to >> minerlog.log with no luck. If i SSH to the server through putty, the error message is not shown, so logging a putty sesion doesnt work either. My question is, then, is there a way to log all the text displayed in the monitor to a file so i can check lather whats that error message? or if a log like that alredy exists? I;ve searched everywhere for an answer, so if this is a repeated question, do please inform me where it was repeated, thank you.
2 Answers 2
The standard tool is the script command. Here a description from the manual, man script :
DESCRIPTION
script makes a typescript of everything displayed on your terminal. It is useful for students who need a hardcopy record of an interactive session as proof of an assignment, as the typescript file can be printed out later with lpr(1).
If you need more professional tools you can search for one on this link.
Linux screen log to file
(none)
Same as the log command except that the default setting for new windows is changed. Initial setting is ‘off’.
Command: log [state]
( C-a H )
Begins/ends logging of the current window to the file screenlog. n in the window’s default directory, where n is the number of the current window. This filename can be changed with the ‘ logfile ’ command. If no parameter is given, the logging state is toggled. The session log is appended to the previous contents of the file if it already exists. The current contents and the contents of the scrollback history are not included in the session log. Default is ‘ off ’.
Command: logfile filename Command: logfile flush secs
(none)
Defines the name the log files will get. The default is ‘ screenlog.%n ’. The second form changes the number of seconds screen will wait before flushing the logfile buffer to the file-system. The default value is 10 seconds.
Command: logtstamp [state] Command: logtstamp after secs Command: logtstamp string string
(none)
This command controls logfile time-stamp mechanism of screen. If time-stamps are turned ‘ on ’, screen adds a string containing the current time to the logfile after two minutes of inactivity. When output continues and more than another two minutes have passed, a second time-stamp is added to document the restart of the output. You can change this timeout with the second form of the command. The third form is used for customizing the time-stamp string (‘ — %n:%t — time-stamp — %M/%d/%y %c:%s —\n ’ by default).
Использование screen для логирования действий (аудита) пользователей в Linux
. this may break programs which run the login shell defined in /etc/passwd for various commands…
. It then becomes hard to do anything with your account other than log in. Also, your sysadmin probably doesn’t have screen in /etc/shells.
Создаём скрипт для запуска screen, чтобы при запуске командной оболочки bash (ведь у вас bash, правда?) все пользователи использовали этот файл и загружались в screen по умолчанию с включённым логированием. При выходе из screen – сессия закрывается:
vi /usr/local/bin/get_in.sh
#!/bin/sh SCREEN=/usr/bin/screen KILL=/bin/kill ## Check if we are already in screen ($STY is set) if [ -z "$STY" ]; then $SCREEN -LARR -S Shared -c /etc/screenrc ## Force SHELL close on exit - we don't want to allow users to escape logging outside screen $KILL -SIGHUP $PPID fi
Что мы имеем:
-L — направить весь лог в файл (куда именно — см. директиву logfile в файле /etc/screenrc ниже)
-A — Адаптировать размеры окон к размеру текущего терминала. Взято отсюда.
-RR — Переподключить сессию и, если необходимо, отсоединить (detach) её или создать заново. Используется первая сессия, если больше чем одна доступна. В случае отключения по ^a + d, при повторном входе откроется эта же сессия этого же пользователя.
-c — мы чётко указываем, какой конфигурационный файл использовать, чтобы избежать возможности отключения логирования и переназначения опций пользователями, к примеру созданием файла в ~/.screenrc.
-S — Назначаем сессии понятное имя. У каждого пользователя может быть одно и то же имя.
Делаем скрипт исполняемым:
chmod 0755 /usr/local/bin/get_in.sh
Делаем так, чтобы все использовали этот скрипт. Для этого в конец файла /etc/bash.bashrc добавляем строку:
/usr/local/bin/get_in.sh
Корректируем файл /etc/screenrc:
## Выбираем, хотим ли мы видеть заметку о правообладателях во время запуска. По умолчанию включено (on), как вы заметили. startup_message off # default: on ## Отключаем визуальный сигнал - включается обычное "пикание" как в shell vbell off ## Размер буфера прокрутки увеличиваем до 4096. Значение по умолчанию - 100. defscrollback 4096 # default: 100 ## Устанавливаем командную оболочку (shell), которая будет использоваться при создании новых окон. Переназначает значение переменной окружения $SHELL. Если команда начинается с символа '-' , то командная оболочка будет запущена как login-shell. defshell -/bin/bash ## Влияет на копирование текста комадной ^a+[ . crlf off # default: off ## Добавляет симпатичную строку состояния внизу экрана. caption always "% %H | %%?%-w%?%%n*%f %t%?(%u)%?%%?%+w%? %=|% %l %| %%%D, %m/%d/%Y | %%%c %" ## Set terminal cap info termcapinfo xterm* 'hs:ts=\E]0;:fs=\007:ds=\E]0;\007' hardstatus off ## Отключаем возможность отключения логирования из самой сессии screen (^a + H) bind H ## Устанавливаем расположение и именование лог-файлов logfile /var/log/screen/$USER@%H-%Y%m%d-%c:%s.log ## By default, screen uses an 8-color terminal emulator. Use the following line to enable more colors, which is useful if you are using a more-capable terminal emulator: term screen-256color ## Устанавливает функцию записи отметок времени в лог-файл logtstamp on
Не забываем создать директорию для логов:
В Debian, чтобы в screen работало автозавершение команд (bash_completion), необходимо раскомментировать в /etc/bash.bashrc:
# enable bash completion in interactive shells if [ -f /etc/bash_completion ] && ! shopt -oq posix; then . /etc/bash_completion fi
Уважаемый 1ex подсказал решение, как с помощью wrapper-а для ssh логировать команды, выполняемые без входа в интерактивный режим bash вида: ssh user@host «ls -l». Для этого необходимо:
в /etc/ssh/sshd_config указать ссылку на обработку wrapper-ом:
ForceCommand /etc/ssh/hook.sh
#!/bin/sh if [ ! -z "$" ]; then echo "User "$" remotely runs a command: $" >> /var/log/screen/$USER@`hostname`-`date +%Y%m%d-%H:%M:%S`-command.log bash -c "$SSH_ORIGINAL_COMMAND" else cat /etc/motd $ fi
Этим мы добиваемся, чтобы все такие команды (и только команды — без информации, что выводится на экране) логировались в ту же директорию и будут дополнены суффиксом «-command»:
Ну вот и всё. Теперь при подключении все пользователи (включая root — будьте осторожны, если потеряете возможность входа!) будут работать в screen, который запускается из bash. При выходе из screen, родительский bash закрывается и соединение прерывается. Если необходимо оставить работать процессы в фоне, то для выхода используем ^a+d. При следующем подключении эта сессия подключится автоматически.
Для дальнейшего изучения:
- Так как в логи пишется вывод команд — они могут занимать большое количество места. Необходимо предусмотреть методы сжатия для уменьшения объёма/трафика
- Лучшее место для логов — удалённая машина и далее обработку производить там, так как логи на локальной машине создаются с uid/guid пользователя и могут быть им удалены/изменены. Предполагается использование syslog.
- Возможно, есть методы обойти screen и, соответственно, логирования при этой конфигурации. Хотелось бы услышать их и внести изменения
Используемые источники:
Update:
SCREEN=`which screen` KILL=`which kill`
SCREEN=/usr/bin/screen KILL=/bin/kill
На данный момент существуют 2 метода обхода логирования команд:
1) Подсказана kiltum: команды типа ssh user@host «ls -l» не логируются. В этом случае команды выполняются как /bin/bash -c , при этом нужный /etc/bash.bashrc не читается.
Уважаемый 1ex подсказал решение с помощью wrapper-а для ssh. Теперь все команды такого типа логируются. Изменения в текст внесены.
2) Подсказана ForeverYoung: команда screen -X log отключает логирование.
Возможности отключить эту особенность пока что нету, поэтому необходимо применять административные меры к пользователям, кто запускает эту команду (сама эта команда всё равно будет записана в лог).
Лучшие решения приветствуются.
ИТОГИ:
Как выяснилось screen не совсем предназначен для решения такого рода задач, а именно принудительного логирования команд и их вывода без возможности отключения логирования. Это приводит к тому, что приходится дополнительно править другие файлы.
Как порекомендовал уважаемый amarao для решения такого рода задач лучше посмотреть на другие решения:
а) сниффинга всего трафика, проходящего через псевдотерминалы (более серьёзно). kiltumподсказал conspy. Slipeer предложил Snoopy Logger.
б) систем аудита (SELinux/Apparmor/etc), которые будут записывать реально всё выполняемое.
Но эти решения выходят за рамки данной статьи.
Считаю, что несмотря на недостатки, использование screen для логирования действий пользователей и выводимой на экран информации в Linux оправдано, ввиду несложности реализации, а главное — простоты чтения логов (в отличие от auditd, напимер).