Как сделать скриншот виртуального терминала?
Навеяно DOS'овскими скрин-грабберами
Screen Thief, Snarf, Foto и множеством других
Для снятия скриншота выбранного виртуального терминала, есть замечательная утилита fbgrab.
Применение предельно простое:
# fbgrab -c 4 -s 3 -z 9 -v ~/tmp/sshot.png
-c - номер виртуального терминала
-s - ожидание в секундах перед снятием скриншота
-z - степень компрессии
-v - verbose, увеличить вывод подробностей
Опции -s -z -v необязательны.
Подробнее об использовании в help и man.
fbgrab выполняется только от root:
$ fbgrab -c 4 -z 9 sshot.png
Couldn't open /dev/console
$ ll /dev/console
crw------- 1 root root 5, 1 янв 17 23:48 /dev/console
Программу можно использовать например, для подготовки презентации сугубо консольных программ, отчёта об ошибках или снятия скриншота 12-го терминала.
Просмотр скриншотов в консоли, любой из двух программ (см. help и man для подробностей):
$ apt-cache search ^|grep '^fbi\|^fbv'
fbi - Image viewer for Linux framebuffer console
fbv - Framebuffer image viewer
Как снять "скриншот" 12-го терминала в текстовом формате?
Нет ничего проще:
man vcs
Снять содержимое 2-го виртуального терминала в файл в текстовом формате без символов перевода строки LF (0Ah):
(Просмотр текста только из виртуального терминала)
# cat /dev/vcs2 > vcs2.txt
Снять содержимое 12-го виртуального терминала в файл в текстовом формате с символами перевода строки LF (0Ah):
# fold -w 128 /dev/vcs12 > vcs12.txt
где
-w -- количество символов в строке виртуального терминала; вставить символ перевода строки через каждые 128 символов текста,
Значение для -w определяется так:Разрешение виртуального терминала - смотреть по X
# fbset -i | grep '^mode\|geom'
mode "1024x768"
geometry 1024 768 1024 768 32
Используемый фонт в виртуальном терминале
(здесь количество пикселов по X на матрицу символа - 8, - один байт)
# grep -rH SYSFONT /etc/sysconfig/
/etc/sysconfig/consolefont:SYSFONT=UniCyr_8x16
Делим разрешение виртуального терминала по X на ширину в пикселах матрицы символа виртуального терминала
# echo $((1024/8))
128
и получаем количество символов в строке виртуального терминала, т.е. параметр для -w
Или для фреймбуфера 1366x768, это 48 строк и 170 колонок символов
$ stty -a | head -n 1 | cut -d ' ' -f 4-7
rows 48; columns 170;
Но помните, что этот размер не фиксированный. Он зависит от размера матрицы символа.
В принципе, для определения -w таким способом, чтобы распарсить это значение, можно написать простенький скрипт, который будет выводить количество символов в строке виртуально терминала.
Более простой способ определения количества символов в строке виртуального терминала:Запустить в виртуальном терминале mcedit и набить любые символы в строке до конца строки без смещения отображения строки.
Редактор mcedit, начинает счёт позиции курсора в строке с нуля.
В пределах окна mcedit, при разрешении виртуального терминала по X 1024 пиксела, последняя позиция курсора - 127-й символ в строке. Значит значение для -w в fold будет в этом случае равно 127+1 (счёт позиции символа с нуля!).
Но у этого варианта снятия "скриншота" в текстовом формате есть недостаток:
кириллические символы не отображаются. (первые четыре строки редактора mcedit в виртуальном терминале):
[-M--] 0 L:[ 1+ 6 7/ 12] *(400 / 618b) 1083 0x43B [*][X]
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
zxzxzz<EF><E7><EF><E7><EF><E7><EF><E7><EF><E7><EF><E7><EF><E7><EF><E7><EF><E7><EF><E7><EF><E7><EF><E7><EF><E7>
<EF><E7><EF><E7><EF><E7><EF><E7><EF><E7><EF><E7><EF><E7><EF><E7><EF><E7><EF><E7><EF><E7>
Например символ:
Dec Hex Sym
239 EF я