Ein Wiki privater Natur

SSH-basierte Helfer: Clipboard und E-Mail ohne lokale Installation

Anwendungsfall: Praktische Lösungen, um auf minimalistischen Servern ohne GUI (X oder Wayland) bzw. ohne Mailserver-Installation trotzdem einfach Inhalte ins Clipboard zu übertragen oder E-Mails zu versenden.


📋 Remote-Clipboard via SSH

Szenario: Du willst von einem Headless-Server ohne GUI schnell Inhalte in das Clipboard eines entfernten Desktop-PCs übertragen.

1. Voraussetzungen auf dem Desktop-PC

Installiere xsel (alternativ: xclip):

sudo apt install xsel

2. SSH-Key mit restriktiver Berechtigung

In der Datei ~/.ssh/authorized_keys auf deinem Desktop-PC:

command="xsel -i --clipboard --display :1",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-rsa AAAAB3... user@host # Remote Clipboard via SSH

3. Komfortables Alias auf dem Server (Quelle)

In .bashrc:

alias remoteclip='ssh user@desktop-pc "xsel -i --clipboard --display :1"'

Nutzung:

echo "Das ist im Clipboard!" | remoteclip
ls -l /etc | remoteclip

Ergebnis: Die Ausgabe landet direkt im Clipboard des entfernten Rechners.


📧 Remote-Mail-Versand via SSH

Szenario: Ein Server ohne Mailprogramm (postfix, ssmtp) soll dennoch E-Mails versenden können, etwa für Statusmeldungen oder Warnungen.

1. Voraussetzungen auf dem Mail-versendenden Rechner

Installiere ein einfaches Mailprogramm (mailutils oder bsd-mailx):

sudo apt install mailutils

2. SSH-Key mit restriktiver Berechtigung

In der Datei ~/.ssh/authorized_keys:

command="/usr/local/bin/remotemail",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-rsa AAAAB3... host@example # Remote-Mail via SSH

3. Wrapper-Skript erstellen

Erstelle die Datei /usr/local/bin/remotemail mit folgendem Inhalt:

#!/bin/bash
HOST=$(hostname)
SUBJECT=${SSH_ORIGINAL_COMMAND:-"Servermeldung von $HOST"}
mail -s "$SUBJECT" admin@example.com

Rechte setzen:

chmod +x /usr/local/bin/remotemail

4. Alias oder Skript auf dem Server (Quelle)

In .bashrc:

alias sendmail='ssh -T user@example.com "$(hostname):ssh mailuser@mailhost'

Nutzung:

Einfacher Versand:

echo "Speicherplatz knapp!" | sendmail

Versand mit individuellem Betreff:

echo "Platte /dev/sda ist fast voll!" | ssh mailuser@mailhost "Warnung: HDD kritisch!"

Ergebnis: Du erhältst zuverlässig eine E-Mail, ganz ohne lokale Mail-Server-Konfiguration.

SSH: "Too many authentication failures" - Workaround

Problem

Nach Anpassen von ~/.ssh/config mit IdentityFile und IdentitiesOnly yes
bleibt der Fehler bestehen:

Received disconnect from x.x.x.x port 22:2: Too many authentication failures

Ursache

Der SSH-Client probiert beim Verbindungsaufbau alle verfügbaren Keys durch
die im ssh-agent oder unter ~/.ssh/ liegen - auch wenn IdentityFile gesetzt
ist. Der Server bricht nach zu vielen Fehlversuchen die Verbindung ab.

IdentitiesOnly yes in der Config löst das - aber nur wenn die Config auch
wirklich neu eingelesen wird.

Sofort-Lösung

Einmalig eine Verbindung per Hostname statt IP aufbauen:

ssh red-prod

Dadurch wird die ~/.ssh/config frisch eingelesen. Danach funktioniert
auch die direkte IP-Variante wieder:

ssh root@192.168.100.122

Richtige Lösung - ~/.ssh/config

Host red-prod
    HostName 192.168.100.122
    User root
    IdentityFile ~/.ssh/id_red_prod
    IdentitiesOnly yes

IdentitiesOnly yes ist entscheidend - damit wird ausschließlich der
angegebene Key verwendet, alle anderen werden ignoriert.


Bonus: SSH ControlMaster

ControlMaster ist ein optionales SSH-Feature das Verbindungen multiplext -
mehrere SSH-Sessions teilen sich eine TCP-Verbindung. Das spart Zeit beim
wiederholten Einloggen.

Aktivieren in ~/.ssh/config

Host *
    ControlMaster auto
    ControlPath ~/.ssh/cm-%r@%h:%p
    ControlPersist 10m

Vorteile

Cache leeren wenn nötig

Wenn ControlMaster aktiv ist und die Config geändert wurde:

# Einzelne Verbindung beenden
ssh -O exit red-prod

# Alle ControlPath-Sockets auf einmal
rm ~/.ssh/cm-*

Hinweis

Ohne ControlMaster in der Config (Standard) werden keine cm-* Dateien
angelegt - der Hostname-Trick oben funktioniert dann aus einem anderen Grund:
Der Client liest beim Hostname-Lookup die Config neu ein und wendet
IdentitiesOnly yes korrekt an.

🛡️ Sicherheitshinweise