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.
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
cataus. 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
$-eini, ist die Shell interaktiv. - Das abschließende
EOFmuss 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
figletinstallierst, kannst du beim Start etwa mitfiglet -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.