Zum Inhalt springen
xaweho

Knowledge Base · fortgeschritten

SSH und Headless-Workflows

Mac per SSH steuern: Public-Key-Auth, Tmux-Sessions, Xcode-Builds via Kommandozeile, GitHub-Actions-Runner. Wenn Du keinen Desktop brauchst.

fortgeschritten ·

Für CI/CD-Workflows, automatisierte Builds und Server-Aufgaben brauchst Du keinen Bildschirm — SSH reicht. Der Mac ist im Grunde ein Unix-System, alles was Du auf Linux per SSH machst, geht auch auf macOS. Hier die Setup-Schritte und typische Workflows.

SSH ist standardmäßig aktiv

Bei uns ist SSH bei allen Mac minis aktiviert. Du kannst sofort loggen:

ssh user@<deine-mac-ip>

Login mit dem macOS-User-Passwort aus unserer Setup-Mail.

Bei aktivem AnyDesk + SSH: beide funktionieren parallel.

Public-Key-Authentifizierung einrichten

Für sichere und automatisierte SSH-Logins ist Public-Key-Auth Pflicht. Passwort-Login solltest Du danach deaktivieren.

Auf Deinem Rechner: Schlüssel generieren

Wenn Du noch keinen SSH-Key hast:

ssh-keygen -t ed25519 -C "macmini-xaweho"

Standard-Pfad bestätigen (~/.ssh/id_ed25519). Optional Passphrase setzen.

Public-Key auf den Mac

Variante 1: ssh-copy-id

ssh-copy-id user@<deine-mac-ip>

Passwort eingeben → Public-Key wird auf Mac kopiert.

Variante 2: manuell

Public-Key kopieren:

cat ~/.ssh/id_ed25519.pub

Auf Mac (per AnyDesk oder SSH mit Passwort): in ~/.ssh/authorized_keys einfügen:

mkdir -p ~/.ssh
chmod 700 ~/.ssh
echo "ssh-ed25519 AAAA... macmini-xaweho" >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys

Test

ssh user@<deine-mac-ip>

Sollte ohne Passwort-Abfrage funktionieren.

Passwort-Login deaktivieren

Auf Mac als Admin:

sudo nano /etc/ssh/sshd_config

Folgende Zeilen suchen/anpassen:

PasswordAuthentication no
PubkeyAuthentication yes
ChallengeResponseAuthentication no

SSH-Daemon neu laden:

sudo launchctl stop com.openssh.sshd
sudo launchctl start com.openssh.sshd

Ab jetzt nur noch Login per Public-Key. Sicherer.

SSH-Konfig auf Deinem Rechner

In ~/.ssh/config:

Host macmini
    HostName <deine-mac-ip>
    User user
    IdentityFile ~/.ssh/id_ed25519
    ServerAliveInterval 60

Dann reicht:

ssh macmini

Tmux für persistente Sessions

Wenn Du lange laufende Builds startest, willst Du nicht, dass die durch Disconnect abbrechen.

Lösung: tmux (kommt standardmäßig auf macOS).

ssh macmini
tmux new -s build
# in der tmux-Session
xcodebuild -workspace ./MyApp.xcworkspace -scheme MyApp ...
# Ctrl+B, dann D zum Detachen

SSH-Verbindung kann dann disconnected werden — der Build läuft weiter. Beim nächsten Connect:

ssh macmini
tmux attach -t build

Du siehst den Build-Fortschritt wie nichts gewesen wäre.

Xcode per CLI

Xcode hat ein CLI-Tool: xcodebuild.

Beispiel-Build:

xcodebuild -workspace MyApp.xcworkspace \
  -scheme MyApp \
  -configuration Release \
  -archivePath ~/Builds/MyApp.xcarchive \
  archive

Fastlane-User können mit fastlane direkt auf dem Mac arbeiten.

Für Apple-Code-Signierung muss Apple-ID + Developer-Cert eingerichtet sein — das geht nur mit GUI-Login (AnyDesk / Screen Sharing) beim ersten Setup. Danach läuft’s headless.

GitHub Actions Runner registrieren

Self-hosted GitHub-Actions-Runner auf dem Mac für iOS-Builds:

Auf GitHub

Repository → Settings → Actions → Runners → New self-hosted runner → macOS auswählen.

GitHub gibt Dir Befehle mit Token.

Auf dem Mac per SSH

mkdir actions-runner && cd actions-runner
curl -o actions-runner-osx-arm64-2.x.x.tar.gz -L https://github.com/actions/runner/releases/download/v2.x.x/...
tar xzf actions-runner-osx-arm64-2.x.x.tar.gz
./config.sh --url https://github.com/<deine-org>/<dein-repo> --token <token>
./run.sh

Für Hintergrund-Service:

sudo ./svc.sh install
sudo ./svc.sh start

Runner läuft als macOS-Service, nimmt automatisch Workflows an.

GitLab CI Runner

Analog für GitLab:

brew install gitlab-runner
gitlab-runner register
# Server-URL und Token aus GitLab eingeben
gitlab-runner run

Für Hintergrund-Service:

gitlab-runner install
gitlab-runner start

Andere CI/CD-Plattformen

  • Bitrise: hat eigenen Setup-Guide für Self-hosted Mac-Runner
  • CircleCI: Cloud-only für macOS, kein Self-hosted
  • Buildkite: sehr gut für Mac-Self-hosted, einfaches Setup

File-Transfer per SCP / SFTP

# Datei vom Mac runter
scp macmini:~/Builds/MyApp.ipa ./

# Datei zum Mac hoch
scp ./local-file.txt macmini:~/

# Rekursiver Sync
rsync -avz ./local-folder/ macmini:~/Projects/

Für regelmäßigen Sync: rsync mit --delete für 1:1-Spiegelung.

Tunneling: Web-UIs auf dem Mac erreichen

Wenn ein Tool auf dem Mac eine Web-UI auf Port 8080 hat, aber nicht öffentlich erreichbar sein soll:

ssh -L 8080:localhost:8080 macmini

Dann auf Deinem Rechner Browser → http://localhost:8080 → Du siehst die Mac-Web-UI durch SSH-Tunnel.

Praktisch für:

  • Selenium-Hub
  • Test-Server
  • Lokale Dev-Tools

SSH-Multiplexing

Wenn Du oft SSH zum gleichen Mac aufmachst, beschleunigt Multiplexing das Verbinden:

In ~/.ssh/config:

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

Erste Verbindung dauert normal, weitere innerhalb 10 Min sind quasi instant.

SSH-Key auf mehreren Geräten

Wenn Du von Mac UND iPad auf den Mini willst: separater SSH-Key pro Gerät.

In ~/.ssh/authorized_keys auf dem Mini:

ssh-ed25519 AAAA... mike-macbook
ssh-ed25519 AAAA... mike-ipad
ssh-ed25519 AAAA... mike-buildserver

Beim Geräte-Verlust: einzelnen Key entfernen.

Mosh als Alternative zu SSH

Mosh ist UDP-basierte SSH-Variante, robuster bei wackligen Verbindungen (Mobilfunk, Roaming):

brew install mosh
mosh user@<deine-mac-ip>

Auf Mac-Seite Mosh installiert haben — schreib uns Ticket falls nötig.

Vorteil: Verbindung bricht nicht bei kurzen Internet-Aussetzern, Reconnect ist unsichtbar.

SSH-Ablauf-Konfiguration

Für ungenutzte SSH-Sessions automatisch trennen:

In /etc/ssh/sshd_config auf dem Mac:

ClientAliveInterval 300
ClientAliveCountMax 3

Nach 15 Min Inaktivität trennt der Server.

Für Server-Aliase auf Deiner Seite (verhindert Disconnect bei langem Idle):

Host *
    ServerAliveInterval 60

Häufige Stolperfallen

„Permission denied (publickey)” trotz korrekt platziertem Key

  • Datei-Permissions auf Mac: ~/.ssh muss 700, authorized_keys muss 600 sein
  • Key-Format korrekt? ssh-ed25519 AAAA... ohne Zeilenumbruch

SSH-Verbindung extrem langsam beim Verbinden

  • DNS-Reverse-Lookup deaktivieren in /etc/ssh/sshd_config:
    UseDNS no
  • Dann SSH-Service neu laden

xcodebuild per SSH funktioniert nicht — „Failed to authorize …”

Apple braucht „GUI-Session” für manche Code-Signing-Operationen. Workaround:

  • Per AnyDesk einmalig einloggen, Apple ID + Developer-Cert konfigurieren
  • Danach läuft xcodebuild headless

„Operation not permitted” bei Datei-Zugriff

macOS hat System Integrity Protection und App Sandbox. Manche Pfade sind geschützt.

Lösung: per AnyDesk → Systemeinstellungen → Datenschutz & Sicherheit → SSH und Terminal Vollzugriff geben.

Häufige Fragen

Kann ich SSH-Tunnel als VPN-Ersatz nutzen? Eingeschränkt. SSH-Dynamic-Port-Forwarding (ssh -D 1080) macht SOCKS-Proxy. Für richtige VPN-Funktion lieber WireGuard.

Wie viele parallele SSH-Sessions? Default macOS: 10. In MaxSessions in sshd_config erhöhbar.

SSH-Logs auf dem Mac einsehen? sudo tail -f /var/log/system.log | grep sshd zeigt SSH-Login-Versuche.

Mac per SSH neu starten?

sudo shutdown -r now

Kann ich SSH-Port von 22 auf was anderes setzen? In /etc/ssh/sshd_config Port 2222 einstellen, dann mit ssh -p 2222 ... verbinden. Sicherheit-Effekt minimal — bessere Lösung: Public-Key-Auth + Fail2Ban.

Fail2Ban auf macOS? Wir aktivieren auf Wunsch ein Pendant. Schreib uns Ticket — wir konfigurieren pf-Firewall mit Brute-Force-Schutz.

SSH-Agent-Forwarding sicher? Mit Vorsicht nutzen. Wenn Du ForwardAgent yes nutzt, kann ein Angreifer auf dem Mac auf Deine lokalen SSH-Keys zugreifen. Standard: aus.

WoL — Mac per Wake-on-LAN starten? Mac mini supports Wake-on-LAN. Wir können WoL-Setup machen — schreib uns Ticket bei Bedarf.

Weiter geht’s

Passende Produkte
Tags
macmini ssh headless ci-cd

Hat dieser Artikel Dir geholfen?

Wenn nicht, schreib uns ein Ticket. Wenn ja, freuen wir uns über eine Empfehlung — beide bekommen 25 € Guthaben aufs Kundenkonto.