Todas as ferramentas

Dev

Banner ASCII no terminal: bash, zsh, fish, PowerShell e login SSH

Use um heredoc com aspas ou um arquivo para manter as barras invertidas, e mostre só em shells interativos para o scp continuar funcionando.

Atualizado em:

Um banner com seu nome ou o nome da máquina toda vez que você abre o terminal é um toque simpático e mostra de relance em qual computador você está. Este guia mostra como colocar um banner feito no lab.ascii nos arquivos de inicialização do seu shell.

Os exemplos usam “DEV” na fonte Small. Ela tem barras invertidas (\), então você nota na hora se algo estragar.

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

Duas coisas para saber antes

Preserve as barras invertidas

Se você mostrar o banner com echo "...", o shell trata \ e $ como caracteres especiais, e partes da arte podem sumir ou mudar. Use uma destas opções:

  • Um heredoc com aspas: coloque aspas no marcador final, como em cat <<'EOF', e o shell mostra tudo exatamente como escrito.
  • Um arquivo: salve o resultado com o botão TXT e mostre com cat. Assim nenhum caractere precisa de escape.

Mostre só em shells interativos

scp, rsync e sftp iniciam um shell na máquina remota, e esse shell pode ler seus arquivos de inicialização. Se um banner for impresso nessa hora, a transferência de arquivos pode falhar. Mostre o banner só em shells interativos, os que uma pessoa abriu.

bash: ~/.bashrc

Adicione isto ao fim do ~/.bashrc:

if [[ $- == *i* ]]; then
cat <<'EOF'
 ___  _____   __
|   \| __\ \ / /
| |) | _| \ V /
|___/|___| \_/
EOF
fi
  • Se $- contém i, o shell é interativo.
  • O EOF final precisa começar no início da linha. Com espaços antes, o bash não o reconhece.

Se você salvou o TXT como ~/.banner.txt, basta uma linha:

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

O shell padrão do macOS é o zsh, então no Mac use a seção do zsh abaixo.

zsh: ~/.zshrc

O zsh só lê o ~/.zshrc em shells interativos, então não precisa de verificação extra. O mesmo heredoc funciona:

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

Se você usa o Powerlevel10k com instant prompt, pode aparecer um aviso sobre saída no console durante a inicialização. Mova o código do banner para acima do bloco do instant prompt, no topo do ~/.zshrc.

fish: fish_greeting

O fish executa a função fish_greeting ao iniciar para mostrar a saudação. Defina a sua e o banner substitui a mensagem padrão. Coloque isto em ~/.config/fish/config.fish:

function fish_greeting
    cat ~/.banner.txt
end

No fish, strings entre aspas simples transformam \\ em uma única \, então mostrar um arquivo é mais seguro que colar o banner numa string.

Adicionando cor

Mostre um código de cor ANSI antes do banner e um código de reset depois. No bash ou zsh:

printf '\033[36m'   # cyan
cat ~/.banner.txt
printf '\033[0m'    # back to normal
Código Cor
\033[31m Vermelho
\033[32m Verde
\033[33m Amarelo
\033[35m Magenta
\033[36m Ciano
\033[1m Negrito

Se esquecer o \033[0m no final, tudo o que você digitar depois continua colorido.

PowerShell: $PROFILE

O PowerShell executa o arquivo em $PROFILE ao iniciar. Se o arquivo ainda não existe, crie e abra no Bloco de Notas:

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

Adicione isto e salve:

$banner = @'
 ___  _____   __
|   \| __\ \ / /
| |) | _| \ V /
|___/|___| \_/
'@
Write-Host $banner -ForegroundColor Cyan
  • Nada entre @' e '@ é alterado. O '@ final precisa começar no início da linha.
  • Se uma janela nova disser que “a execução de scripts está desabilitada neste sistema”, mude a política de execução do seu usuário: Set-ExecutionPolicy -Scope CurrentUser RemoteSigned.
  • Banners com caracteres de bloco como █ ═ ou com texto não latino podem quebrar no Windows PowerShell 5.1. Salve o perfil como UTF-8 com BOM no Bloco de Notas ou use o PowerShell 7.

Tela de login SSH: /etc/motd

Num servidor Linux, o texto de /etc/motd aparece em todo login SSH, para todo mundo que conecta.

sudo nano /etc/motd

Cole o banner, salve, e ele aparece a partir do próximo login. Pôr o nome do servidor no banner dificulta confundir produção com homologação. Você não sabe que terminal cada pessoa usa, então escolha uma fonte ASCII como Standard, Slant ou Small em vez de caracteres de bloco. O Ubuntu também mostra mensagens geradas pelos scripts em /etc/update-motd.d/.

Na sua própria ferramenta CLI

A mesma regra vale para uma ferramenta escrita em Python ou Node.js: não mostre o banner quando a saída vai para um arquivo ou outro programa.

import sys

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

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

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

O guia de banner para README explica o escape de strings com mais detalhes.

Qual fonte funciona melhor?

Terminais costumam ter 80 colunas, e muita gente divide a janela ao meio, então um banner de 60 colunas ou menos cabe em quase todo lugar. Para nomes longos, escolha uma fonte estreita como Small ou Small Slant. Compare larguras em Como escolher uma fonte FIGlet.

Se você instalar o programa figlet, pode desenhar um banner na inicialização com algo como figlet -f slant "$(hostname)". Mas ele precisa estar instalado em cada máquina, e fontes que não vêm com ele exigem download separado. Colar um banner pronto não exige instalação nenhuma.