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.
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émi, o shell é interativo. - O
EOFfinal 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 comofiglet -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.