Alle Tools

Dev

Ein ASCII-Banner fürs Terminal: bash, zsh, fish, PowerShell und SSH-Login

Nutze ein Heredoc mit Anführungszeichen oder eine Datei, damit Backslashes erhalten bleiben, und gib nur in interaktiven Shells aus, damit scp weiter funktioniert.

Zuletzt aktualisiert:

Ein Banner mit deinem Namen oder dem Rechnernamen bei jedem Öffnen des Terminals ist ein netter Akzent und zeigt auf einen Blick, an welchem Computer du sitzt. Diese Anleitung zeigt, wie du ein auf lab.ascii erstelltes Banner in die Startdateien deiner Shell bringst.

Die Beispiele nutzen „DEV“ in der Schrift Small. Sie enthält Backslashes (\), du siehst also sofort, wenn etwas kaputtgeht.

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

Zwei Dinge vorab

Backslashes erhalten

Gibst du ein Banner mit echo "..." aus, behandelt die Shell \ und $ als Sonderzeichen, und Teile der Art können verschwinden oder sich ändern. Nutze stattdessen:

  • Ein Heredoc mit Anführungszeichen: Setze die Endmarke in Anführungszeichen, etwa cat <<'EOF', dann gibt die Shell alles exakt so aus, wie es dasteht.
  • Eine Datei: Speichere das Ergebnis mit dem TXT-Button und gib es mit cat aus. Dann muss kein Zeichen maskiert werden.

Nur in interaktiven Shells ausgeben

scp, rsync und sftp starten auf dem entfernten Rechner eine Shell, die deine Startdateien lesen kann. Wird dabei ein Banner ausgegeben, können Dateiübertragungen fehlschlagen. Gib das Banner nur in interaktiven Shells aus, also solchen, die ein Mensch geöffnet hat.

bash: ~/.bashrc

Füge das ans Ende von ~/.bashrc an:

if [[ $- == *i* ]]; then
cat <<'EOF'
 ___  _____   __
|   \| __\ \ / /
| |) | _| \ V /
|___/|___| \_/
EOF
fi
  • Enthält $- ein i, ist die Shell interaktiv.
  • Das abschließende EOF muss am Zeilenanfang stehen. Mit Leerzeichen davor erkennt bash es nicht.

Hast du die TXT-Datei als ~/.banner.txt gespeichert, reicht eine Zeile:

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

Die Standard-Shell auf macOS ist zsh, auf dem Mac nutzt du also den zsh-Abschnitt unten.

zsh: ~/.zshrc

zsh liest ~/.zshrc nur in interaktiven Shells, eine zusätzliche Prüfung ist nicht nötig. Das gleiche Heredoc funktioniert:

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

Nutzt du Powerlevel10k mit Instant Prompt, erscheint beim Start eventuell eine Warnung über Konsolenausgabe. Verschiebe den Banner-Code über den Instant-Prompt-Block am Anfang von ~/.zshrc.

fish: fish_greeting

fish führt beim Start die Funktion fish_greeting aus, um seine Begrüßung zu zeigen. Definiere deine eigene, und das Banner ersetzt die Standardnachricht. Schreib das in ~/.config/fish/config.fish:

function fish_greeting
    cat ~/.banner.txt
end

In fish machen Strings in einfachen Anführungszeichen aus \\ ein einzelnes \, daher ist das Ausgeben einer Datei sicherer, als das Banner in einen String zu kopieren.

Farbe hinzufügen

Gib vor dem Banner einen ANSI-Farbcode und danach einen Reset-Code aus. In bash oder zsh:

printf '\033[36m'   # cyan
cat ~/.banner.txt
printf '\033[0m'    # back to normal
Code Farbe
\033[31m Rot
\033[32m Grün
\033[33m Gelb
\033[35m Magenta
\033[36m Cyan
\033[1m Fett

Vergisst du das abschließende \033[0m, bleibt alles, was du danach tippst, farbig.

PowerShell: $PROFILE

PowerShell führt beim Start die Datei unter $PROFILE aus. Gibt es sie noch nicht, leg sie an und öffne sie im Editor:

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

Füge das ein und speichere:

$banner = @'
 ___  _____   __
|   \| __\ \ / /
| |) | _| \ V /
|___/|___| \_/
'@
Write-Host $banner -ForegroundColor Cyan
  • Zwischen @' und '@ wird nichts verändert. Das abschließende '@ muss am Zeilenanfang stehen.
  • Meldet ein neues Fenster, dass „die Ausführung von Skripts auf diesem System deaktiviert ist“, ändere die Ausführungsrichtlinie für deinen Benutzer: Set-ExecutionPolicy -Scope CurrentUser RemoteSigned.
  • Banner mit Blockzeichen wie █ ═ oder nicht-lateinischem Text können in Windows PowerShell 5.1 kaputtgehen. Speichere das Profil im Editor als UTF-8 mit BOM oder nutze PowerShell 7.

SSH-Login-Bildschirm: /etc/motd

Auf einem Linux-Server wird der Text in /etc/motd bei jedem SSH-Login allen angezeigt, die sich verbinden.

sudo nano /etc/motd

Füge das Banner ein, speichere, und es erscheint ab dem nächsten Login. Steht der Servername im Banner, verwechselt man Produktion und Staging kaum noch. Da du nicht weißt, welches Terminal jeder nutzt, wähle eine ASCII-Schrift wie Standard, Slant oder Small statt Blockzeichen. Ubuntu zeigt außerdem Nachrichten, die von den Skripten in /etc/update-motd.d/ erzeugt werden.

In deinem eigenen CLI-Tool

Dieselbe Regel gilt für ein Tool in Python oder Node.js: Gib das Banner nicht aus, wenn die Ausgabe in eine Datei oder an ein anderes Programm geht.

import sys

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

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

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

Die Anleitung zum README-Banner erklärt das Maskieren von Strings genauer.

Welche Schrift passt am besten?

Terminals sind meist 80 Spalten breit, und viele teilen ihr Fenster in zwei Hälften. Ein Banner mit höchstens 60 Spalten passt daher fast überall. Für lange Namen wähle eine schmale Schrift wie Small oder Small Slant. Breiten vergleichst du in Die passende FIGlet-Schrift wählen.

Wenn du das Programm figlet installierst, kannst du beim Start etwa mit figlet -f slant "$(hostname)" ein Banner zeichnen. Es muss aber auf jedem Rechner installiert sein, und nicht mitgelieferte Schriften brauchen einen eigenen Download. Ein fertiges Banner einzufügen braucht dagegen gar keine Installation.