Все инструменты

Разработка

ASCII-баннер в терминале: bash, zsh, fish, PowerShell и вход по SSH

Используйте heredoc в кавычках или файл, чтобы сохранить обратные слеши, и выводите баннер только в интерактивных оболочках, чтобы не сломать scp.

Обновлено:

Баннер с вашим именем или именем машины при каждом открытии терминала — приятная деталь, к тому же сразу видно, на каком вы компьютере. В этом руководстве показано, как добавить баннер, созданный на lab.ascii, в файлы запуска вашей оболочки.

В примерах используется «DEV» шрифтом Small. В нём есть обратные слеши (\), так что вы сразу заметите, если он испортится.

 ___  _____   __
|   \| __\ \ / /
| |) | _| \ V /
|___/|___| \_/

Сначала две важные вещи

Сохраните обратные слеши

Если выводить баннер через echo "...", оболочка считает \ и $ специальными символами, и части арта могут пропасть или измениться. Используйте один из вариантов:

  • Heredoc в кавычках: возьмите конечный маркер в кавычки, как в cat <<'EOF', и оболочка выведет всё ровно так, как написано.
  • Файл: сохраните результат кнопкой TXT и выводите его через cat. Тогда ничего не нужно экранировать.

Выводите только в интерактивных оболочках

scp, rsync и sftp запускают оболочку на удалённой машине, и она может прочитать ваши файлы запуска. Если в этот момент выводится баннер, передача файлов может сорваться. Выводите баннер только в интерактивных оболочках, то есть открытых человеком.

bash: ~/.bashrc

Добавьте в конец ~/.bashrc:

if [[ $- == *i* ]]; then
cat <<'EOF'
 ___  _____   __
|   \| __\ \ / /
| |) | _| \ V /
|___/|___| \_/
EOF
fi
  • Если $- содержит i, оболочка интерактивная.
  • Закрывающий EOF должен стоять в начале строки. С пробелами перед ним bash его не распознает.

Если вы сохранили TXT-файл как ~/.banner.txt, хватит одной строки:

[[ $- == *i* && -r ~/.banner.txt ]] && cat ~/.banner.txt

Оболочка по умолчанию в macOS — zsh, поэтому на Mac смотрите раздел про zsh ниже.

zsh: ~/.zshrc

zsh читает ~/.zshrc только в интерактивных оболочках, так что дополнительная проверка не нужна. Тот же heredoc работает:

cat <<'EOF'
 ___  _____   __
|   \| __\ \ / /
| |) | _| \ V /
|___/|___| \_/
EOF

Если вы используете Powerlevel10k с instant prompt, при запуске может появиться предупреждение о выводе в консоль. Перенесите код баннера выше блока instant prompt в начале ~/.zshrc.

fish: fish_greeting

При запуске fish вызывает функцию fish_greeting, чтобы показать приветствие. Определите свою — и баннер заменит стандартное сообщение. Добавьте в ~/.config/fish/config.fish:

function fish_greeting
    cat ~/.banner.txt
end

В fish строки в одинарных кавычках превращают \\ в один \, поэтому выводить файл надёжнее, чем вставлять баннер в строку.

Добавляем цвет

Выведите ANSI-код цвета перед баннером и код сброса после. В bash или zsh:

printf '\033[36m'   # cyan
cat ~/.banner.txt
printf '\033[0m'    # back to normal
Код Цвет
\033[31m Красный
\033[32m Зелёный
\033[33m Жёлтый
\033[35m Пурпурный
\033[36m Голубой
\033[1m Жирный

Если забыть финальный \033[0m, всё, что вы введёте дальше, останется цветным.

PowerShell: $PROFILE

При запуске PowerShell выполняет файл $PROFILE. Если его ещё нет, создайте и откройте в Блокноте:

if (!(Test-Path $PROFILE)) { New-Item -Path $PROFILE -ItemType File -Force }
notepad $PROFILE

Добавьте это и сохраните:

$banner = @'
 ___  _____   __
|   \| __\ \ / /
| |) | _| \ V /
|___/|___| \_/
'@
Write-Host $banner -ForegroundColor Cyan
  • Между @' и '@ ничего не меняется. Закрывающий '@ должен стоять в начале строки.
  • Если новое окно сообщает, что «выполнение сценариев отключено в этой системе», измените политику выполнения для своего пользователя: Set-ExecutionPolicy -Scope CurrentUser RemoteSigned.
  • Баннеры с блочными символами вроде █ ═ или нелатинским текстом (в том числе кириллицей) могут ломаться в Windows PowerShell 5.1. Сохраните профиль в Блокноте как UTF-8 с BOM или используйте PowerShell 7.

Экран входа по SSH: /etc/motd

На Linux-сервере текст из /etc/motd показывается при каждом входе по SSH всем, кто подключается.

sudo nano /etc/motd

Вставьте баннер, сохраните — и он появится со следующего входа. Имя сервера в баннере помогает не перепутать продакшен и стейджинг. Вы не знаете, каким терминалом пользуется каждый, поэтому выбирайте ASCII-шрифт вроде Standard, Slant или Small, а не блочные символы. Ubuntu также показывает сообщения, которые генерируют скрипты в /etc/update-motd.d/.

В вашей собственной CLI-утилите

То же правило действует для утилиты на Python или Node.js: не выводите баннер, когда вывод идёт в файл или другую программу.

import sys

BANNER = r"""
 ___  _____   __
|   \| __\ \ / /
| |) | _| \ V /
|___/|___| \_/
"""

if sys.stdout.isatty():
    print(BANNER)
const banner = String.raw`
 ___  _____   __
|   \| __\ \ / /
| |) | _| \ V /
|___/|___| \_/
`;

if (process.stdout.isTTY) console.log(banner);

Подробнее об экранировании строк — в руководстве по баннеру для README.

Какой шрифт лучше?

Терминалы обычно шириной 80 столбцов, а многие делят окно пополам, так что баннер не шире 60 столбцов помещается почти везде. Для длинных имён выберите узкий шрифт, например Small или Small Slant. Сравнить ширину можно в статье Как выбрать шрифт FIGlet.

Если установить программу figlet, баннер можно рисовать при запуске командой вроде figlet -f slant "$(hostname)". Но её нужно ставить на каждую машину, а шрифты, не входящие в комплект, — скачивать отдельно. Вставка готового баннера не требует никакой установки.