Последние записи
- Получение ProductKey установленной Windows
- Как парсить https сайт ?
- Смена регистра строки текста на BAT (CMD)
- Вывод разноцветного текста на BAT (CMD)
- Узнать дату окончания сертификата
- Как создать полноценный сайт на Open Server
- Получить температуру процессора на bat-файлах
- Динамические массивы в Lazarus / Delphi — индексация элементов
- Многозадачность на бат-файлах
- Дата и время изменения файла
Интенсив по Python: Работа с API и фреймворками 24-26 ИЮНЯ 2022. Знаете Python, но хотите расширить свои навыки?
Slurm подготовили для вас особенный продукт! Оставить заявку по ссылке - https://slurm.club/3MeqNEk
Online-курс Java с оплатой после трудоустройства. Каждый выпускник получает предложение о работе
И зарплату на 30% выше ожидаемой, подробнее на сайте академии, ссылка - ttps://clck.ru/fCrQw
5th
Сен
CMD/BAT: Управляющие последовательности ANSI/ECMA-48
Posted by obzor under Windows
Управляющие последовательности ANSI — символы, встраиваемые в текст, для управления форматом, цветом и другими опциями вывода в текстовом терминале.
В Microsoft Windows поддержка управляющих последовательностей ANSI появилась начиная с Windows 10.
Для управления выводом текста в консоль используются специальные ESC-коды. Выглядят они так:
ESC[<параметры><буква-команда>
ESC[ — признак начала управляющей последовательности. ESC — непечатный символ с кодом 27 (U+001B). Набирается посредством Alt+27 или Alt+027, на экране выглядит как вопросик в квадрате или иначе, в зависимости от редактора.
<параметры> — цифры (иногда с ; ), указывают режим или количество.
<буква-команда> — финализирующий символ, указывающий какое именно действие.
Так как набирать непечатный символ ESC не очень удобно, да и скопировать текст с непечатными символами может быть проблематично (допустим, невозможно поделиться кодом на форуме), то можно программно получить префикс для CSI-кодов. Вот код для получения CSI-префикса:
:: Получаем префикс CSI = ESC + [
for /f "delims=" %%a in ('echo prompt $E[^| cmd /q /d /k') do set "CSI=%%a"
Цвет и начертание текста
Список поддерживаемых CSI-кодов:
CSI30-37m — цвет текста (палитра 8)
0 — Black
1 — Red
2 — Green
3 — Yellow
4 — Blue
5 — Magenta
6 — Cyan
7 — White
CSI90-97m — яркий цвет текста (палитра 8)
CSI38;5;0-255m — цвет текста (палитра 256)
0–7: базовые цвета
8–15: яркие
16–231: 6×6×6 RGB-куб
232–255: градации серого
CSI38;2;R;G;Bm — RGB-цвет текста
R, G, B = 0-255
CSI39m — цвет текста по умолчанию
CSI40-47m — цвет фона (палитра 8)
CSI100-107m — яркий цвет фона (палитра 8)
CSI48;5;0-255m — цвет фона (палитра 256)
CSI48;2;R;G;Bm — RGB-цвет фона
CSI49m — цвет фона по умолчанию
CSI1m — яркий
CSI22m — яркий откл.
CSI7m — инверсный (негатив)
CSI27m — инверсный откл.
CSI4m — подчеркнутый
CSI24m — подчеркнутый откл.
Код CSI53m (надчеркнутый) не поддерживается. Имитация: выводить строкой выше подчеркнутый
Код CSI51m (обрамленный) не поддерживается. Имитация: использовать подчеркнутый и вертикальные слеши |
Код CSI8m (скрытый) не поддерживается. Имитация: CSI30;40m (черный текст на черном фоне или другие совпадающие цвета). Скрытый текст не виден в консоли, но может быть скопирован в буфер обмена посредством выделения
CSI0m — выключение всех атрибутов
Комбинирование
CSI-коды можно комбинировать через ;
Например:
echo %CSI%42;96mГолубой на зеленом (комбинирование)%CSI%0m
Демонстрационный пример:
@echo off
setlocal enabledelayedexpansion
cls
:: Получаем префикс CSI = ESC + [
for /f "delims=" %%a in ('echo prompt $E[^| cmd /q /d /k') do set "CSI=%%a"
:: CSI30-37m - цвет текста (палитра 8)
:: 0 - Black
:: 1 - Red
:: 2 - Green
:: 3 - Yellow
:: 4 - Blue
:: 5 - Magenta
:: 6 - Cyan
:: 7 - White
:: CSI39m - цвет текста по умолчанию
echo %CSI%31mКрасный текст%CSI%39m
:: CSI90-97m - яркий цвет текста (палитра 8)
echo %CSI%91mЯрко-красный текст%CSI%39m
:: CSI40-47m - цвет фона (палитра 8)
:: CSI49m - цвет фона по умолчанию
echo %CSI%44mСиний фон%CSI%49m
:: CSI100-107m - яркий цвет фона (палитра 8)
echo %CSI%104mЯрко-синий фон%CSI%49m
:: Комбинирование через ;
echo %CSI%42;96mГолубой на зеленом (комбинирование)%CSI%39;49m
:: CSI1m - яркий
:: CSI22m - яркий откл.
echo %CSI%32mВыделение текста %CSI%1mярким цветом%CSI%22m и обычный%CSI%39m
:: CSI7m - инверсный (негатив)
:: CSI27m - инверсный откл.
:: CSI0m - выключение всех атрибутов
echo %CSI%43;95mТекст %CSI%7m инверсный (негатив) %CSI%27m и обычный%CSI%0m
:: CSI4m - подчеркнутый
:: CSI24m - подчеркнутый откл.
echo %CSI%4mПодчеркнутый%CSI%24m
:: Код CSI53m (надчеркнутый) не поддерживается
:: Имитация: выводить строкой выше подчеркнутый
echo.
echo Код CSI%CSI%4m53m (надчеркн%CSI%24mутый) не поддерживается, но можно имитировать
echo Пример надчеркнутого текста
:: Код CSI51m (обрамленный) не поддерживается
:: Имитация: использовать подчеркнутый и вертикальные слеши |
echo %CSI%4m %CSI%24m
echo %CSI%4m^|Обрамленный текст^|%CSI%24m
echo.
:: Код CSI8m (скрытый) не поддерживается
:: Имитация: CSI30;40m (черный текст на черном фоне или другие совпадающие цвета)
:: Скрытый текст не виден в консоли, но может быть скопирован в буфер обмена посредством выделения
echo Скрытый невидимый текст тут: %CSI%30;40mсекретный код 123%CSI%0m
echo Можно выделить область со скрытым текстом: %CSI%37;47mсекретный код 123%CSI%0m
:: CSI38;5;0-255m - цвет текста (палитра 256)
:: 0-7: базовые цвета
:: 8-15: яркие
:: 16-231: 6?6?6 RGB-куб
:: 232-255: градации серого
echo.
echo 256-цветная палитра текста:
for /L %%i in (0,1,255) do (
set /A "nl=%%i %% 16"
<nul set /p ="%CSI%38;5;%%im#"
if !nl! EQU 15 echo.
)
echo %CSI%39m
:: CSI48;5;0-255m - цвет фона (палитра 256)
echo 256-цветная палитра фона:
for /L %%i in (0,1,255) do (
set /A "nl=%%i %% 16"
<nul set /p ="%CSI%48;5;%%im %CSI%49m"
if !nl! EQU 15 echo.
)
:: CSI38;2;R;G;Bm - RGB-цвет текста
:: R, G, B = 0-255
echo.
echo RGB-цвет текста:
for /L %%i in (10,2,248) do (
<nul set /p ="%CSI%38;2;%%i;0;0m#"
)
echo %CSI%39m
:: CSI48;2;R;G;Bm - RGB-цвет фона
echo.
echo RGB-цвет фона:
for /L %%i in (10,2,248) do (
set /a b=255-%%i
<nul set /p ="%CSI%48;2;0;%%i;!b!m "
)
echo %CSI%49m
pause
Управление курсором и очисткой
Список поддерживаемых CSI-кодов:
CSIH / CSIf — курсор в левый верхний угол
CSI#;#H — в строку;колонку (позиция курсора, левый верхний угол — 1;1)
CSI#;#f — то же самое (альтернативная форма)
CSI#A — вверх # строк
CSI#B — вниз # строк
CSI#C — вправо # колонок
CSI#D — влево # колонок
CSI#E — на начало строки, ниже на #
CSI#F — на начало строки, выше на #
CSI#G — в колонку #
CSI#H — в начало строки #
CSIs — сохранить позицию курсора
CSIu — восстановить позицию курсора
CSI6n — выводит текущее положение курсора в формате ^[[n;mR, где n — строка, m — столбец
Ответ попадает в буфер ввода. Пока непонятно, как его считать…
CSI?25l — скрыть курсор
CSI?25h — показать курсор
CSI#T — прокрутить экран вверх на #
Работает не совсем понятно…
CSI#S — прокрутить экран вниз на #
CSIJ — очистка экрана (по умолчанию от курсора до конца, аналог CSI0J)
CSI1J — очистка экрана от начала экрана до курсора
CSI2J — очистка всего экрана
Комбинация CSI2J+CSIH — аналог команды CLS
CSIK — очистка строки (по умолчанию от курсора до конца, аналог CSI0K)
CSI1K — от начала строки до курсора
CSI2K — очистка всей строки
CSI#L — вставить # пустых строк
CSI#M — удалить # строк
CSI#P — удалить (со смещением в строке) # символов в текущей строке
CSI#X — очистить (без смещения в строке) # символов в текущей строке
CSI#d — перемещает курсор вниз на # строк?
Демонстрационный пример:
@echo off
setlocal enabledelayedexpansion
cls
:: Получаем префикс CSI = ESC + [
for /f "delims=" %%a in ('echo prompt $E[^| cmd /q /d /k') do set "CSI=%%a"
:: CSIH / CSIf - курсор в левый верхний угол
echo Первая строка текста
echo %CSI%HВторая
pause
cls
:: CSI#;#H - в строку;колонку (позиция курсора, левый верхний угол - 1;1)
for /L %%i in (1,1,15) do (
echo %CSI%%%i;%%iH%%i
)
:: CSI#;#f - то же самое (альтернативная форма)
for /L %%i in (15,-1,1) do (
set /a y=30-%%i
echo %CSI%%%i;!y!f%%i
)
pause
cls
:: CSI#A - вверх # строк
:: CSI#B - вниз # строк
:: CSI#C - вправо # колонок
:: CSI#D - влево # колонок
:: CSI#E - на начало строки, ниже на #
:: CSI#F - на начало строки, выше на #
:: CSI#G - в колонку #
:: CSI#H - в начало строки #
echo %CSI%20C[1]%CSI%10B[2]%CSI%10D[3]%CSI%5A[4]%CSI%10E[5]%CSI%5F[6]%CSI%5G[7]%CSI%3H[8]
pause
cls
:: CSIs - сохранить позицию курсора
:: CSIu - восстановить позицию курсора
echo %CSI%10;8HHello, %CSI%s
echo %CSI%HGoodby...
echo %CSI%uWorld.
pause
cls
:: CSI6n - выводит текущее положение курсора в формате ^[[n;mR, где n — строка, m — столбец
:: Ответ попадает в буфер ввода. Пока непонятно, как его считать...
echo %CSI%15;15fOK%CSI%6n
set /p pos=Положение курсора:
echo %pos:~2,-1%
pause
cls
:: CSI?25l - скрыть курсор
set /p name=%CSI%?25lВведите свое имя:
:: CSI?25h - показать курсор
echo Привет, %name%%CSI%?25h
set /p age=Ваш возраст:
pause
cls
dir %windir%
pause
:: CSI#T - прокрутить экран вверх на #
:: Работает не совсем понятно...
echo %CSI%5T
pause
:: CSI#S - прокрутить экран вниз на #
echo %CSI%20S
pause
cls
dir %windir%
pause
:: CSIJ - очистка экрана (по умолчанию от курсора до конца, аналог CSI0J)
echo %CSI%10A%CSI%J
pause
cls
dir %windir%
:: CSI1J - очистка экрана от начала экрана до курсора
echo %CSI%10A%CSI%1J
pause
:: CSI2J - очистка всего экрана
echo %CSI%2J
dir %windir%
pause
:: CSI2J+CSIH - аналог команды CLS
echo %CSI%2J%CSI%HCLS
pause
:: CSIK - очистка строки (по умолчанию от курсора до конца, аналог CSI0K)
echo Пример длинной строки в которой мы удалим конец строки после ее вывода на экран%CSI%25D%CSI%K
pause
:: CSI1K - от начала строки до курсора
echo Пример длинной строки в которой мы удалим начало строки после ее вывода на экран%CSI%25D%CSI%1K
pause
:: CSI2K - очистка всей строки
echo Пример длинной строки, которую мы удалим целиком%CSI%2K
:: CSI#L - вставить # пустых строк
:: CSI#M - удалить # строк
:: CSI#P - удалить (со смещением в строке) # символов в текущей строке
:: CSI#X - очистить (без смещения в строке) # символов в текущей строке
:: CSI#d - перемещает курсор вниз на # строк?
pause
Применяем CSI-коды в приглашении командной строки
CSI-коды отлично работают в промпте. Вот пример батника, который поменяет цвет приглашения на ярко-желтый:
@echo off
:: Получаем префикс CSI = ESC + [
for /f "delims=" %%a in ('echo prompt $E[^| cmd /q /d /k') do set "CSI=%%a"
:: Ярко-желтое приглашение командной строки
prompt %CSI%93m$P$G%CSI%0m
Вывод текста с CSI-кодами из файла
Имеется возможность сохранить текст с управляющими последовательностями ANSI в файл для последующего вывода в консоль командой type.
Особенность: CSI-код в файле выглядит таким образом: ESC[, где ESC — непечатный символ с кодом 27 (0x1B). Набирается посредством Alt+27 или Alt+027, на экране выглядит как вопросик в квадрате или иначе, в зависимости от редактора.
Файл необходимо сохранять в однобайтовой кодировке OEM 866 для корректного отображения русских букв.
Простой пример для демонстрации:
@echo off
echo Hello, World.
type example.ans
pause
Выводит на экран содержимое файла example.ans. Интересно отметить, что внутри файла example.ans добавлена очистка экрана. В итоге надпись «Hello, World.», которая выведена раньше печати данного файла, будет стерта.
По сути ans-файл это обычный текстовый файл, но с добавлением управляющих последовательностей ANSI. Редактируется в любом блокноте, позволяющим вставлять непечатный символы. Использование расширение .ans лишь информирует о том, что там не плоский текст. А так расширение файла роли не играет.
Файл example.ans во вложении (извлечь из архива).
| example.zip (612 байт) |
Скрытый ввод текста (ввод пароля)
Используя CSI-коды можно реализовать скрытый ввод пароля. Следующий код позволяет это сделать:
:: Скрытый ввод пароля
set /p password="Ввыдите пароль: %CSI%?25l%CSI%30;40m"
<nul set /p ="%CSI%1A%CSI%2K%CSI%0m%CSI%?25h"
Пояснение:
Код CSI30;40m устанавливает черный цвет текста на черном фоне, в итоге вводимые символы не видны.
Код CSI?25l отключает отображение курсора, в итоге не видно и количество вводимых символов.
После ввода выполняются следующие CSI-коды:
Код CSI1A подымает курсор на одну строку выше (то есть в строку, где только что вводили пароль).
Код CSI2K полностью удаляет строку. Это необходимо сделать, так как хоть пароль и не виден (черный на черном), но он остается на экране, от куда может быть скопирован в буфер обмена посредством выделения области экрана.
Код CSI0m отменяет черный текст на черном фоне.
Код CSI?25h включает отображение курсора.
Уязвимости:
1. Пароль выводится на экран черным цветом по черному фону, но фактически он там есть. Удаляется с экрана только после завершения ввода.
2. В переменной %password% сохраняется пароль в открытом виде. Желательно очистить переменную с помощью: set password=
3. Пароль остается в истории ввода. То есть если при следующем запросе ввода нажать стрелку вверх, то на ввод поступи только что введенный пароль. Пока не ясно, как это побороть…
4. Если проверка пароля происходит внутри bat-файла, то изучение исходного кода позволит раскрыть пароль.
5. Также изменение исходного кода позволит просто обойти проверку пароля.
Полноценный пример, демонстрирующий авторизацию по паролю:
@echo off
setlocal enabledelayedexpansion
:: Получаем префикс CSI = ESC + [
for /f "delims=" %%a in ('echo prompt $E[^| cmd /q /d /k') do set "CSI=%%a"
:: Скрытый ввод пароля
set /p password="Ввыдите пароль: %CSI%?25l%CSI%30;40m"
<nul set /p ="%CSI%1A%CSI%2K%CSI%0m%CSI%?25h"
:: Проверка пароля
if "%password%"=="123" (
set auth=1
) else (
set auth=
)
:: На всякий случай очищаем пароль
set password=
:: Проверка авторизации
if "%auth%"=="1" (
echo %CSI%92mДоступ РАЗРЕШЕН%CSI%39m
) else (
echo %CSI%91mДоступ ЗАПРЕЩЕН%CSI%39m
)
Похожие статьи
Купить рекламу на сайте за 1000 руб
пишите сюда - alarforum@yandex.ru
Да и по любым другим вопросам пишите на почту

пеллетные котлы

Пеллетный котел Emtas
Наши форумы по программированию:
- Форум Web программирование (веб)
- Delphi форумы
- Форумы C (Си)
- Форум .NET Frameworks (точка нет фреймворки)
- Форум Java (джава)
- Форум низкоуровневое программирование
- Форум VBA (вба)
- Форум OpenGL
- Форум DirectX
- Форум CAD проектирование
- Форум по операционным системам
- Форум Software (Софт)
- Форум Hardware (Компьютерное железо)


