#!/usr/bin/env bash # setup-ssh-access.sh # Benutzung: # ./setup-ssh-access.sh user@host[:port] [--key ~/.ssh/id_rsa] [--remote-gen] # # Beispiele: # ./setup-ssh-access.sh alice@example.com # ./setup-ssh-access.sh alice@example.com:2222 --key ~/.ssh/my_rsa --remote-gen set -euo pipefail # Defaults KEY_PRIV="${HOME}/.ssh/id_rsa" KEY_PUB="${KEY_PRIV}.pub" REMOTE="" PORT="" REMOTE_GEN=false usage() { cat < erzeuge ~/.ssh/id_rsa (ohne passphrase)" ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa -N "" -C "$(whoami)@$(hostname)-remote" || exit 1 else echo "Remote bereits mit Schlüsselpaar ausgestattet: ~/.ssh/id_rsa existiert" fi REMOTE_CMD fi # 3) Schlüssel auf remote kopieren: bevorzugt ssh-copy-id falls installiert if command -v ssh-copy-id >/dev/null 2>&1; then echo "Benutze ssh-copy-id (falls verfügbar) um Public Key zu kopieren..." # ssh-copy-id erwartet die public key (handle port) if [ -n "$PORT" ]; then # ssh-copy-id hat -p, aber auf manchen Plattformen nicht; fallback per SSH+cat if ssh-copy-id -p "$PORT" -i "$KEY_PUB" "${REMOTE}" >/dev/null 2>&1; then echo "ssh-copy-id erfolgreich." else echo "ssh-copy-id mit -p schlug fehl oder ist nicht kompatibel -> fallback" # fallthrough to manual method below COPY_FALLBACK=true fi else if ssh-copy-id -i "$KEY_PUB" "${REMOTE}"; then echo "ssh-copy-id erfolgreich." COPY_FALLBACK=false else echo "ssh-copy-id schlug fehl -> fallback" COPY_FALLBACK=true fi fi else COPY_FALLBACK=true fi # 4) fallback: sichere Methode: auf remote ~/.ssh anlegen und Datei anhängen if [ "${COPY_FALLBACK:-true}" = true ]; then echo "Benutze Fallback: Public Key per SSH anhängen..." # send public key content to remote and append to ~/.ssh/authorized_keys # We use a safe here-doc redirection so permissions can be set server-side ssh "${SSH_OPTS[@]}" "$REMOTE" "mkdir -p ~/.ssh && chmod 700 ~/.ssh && touch ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys" || { echo "Fehler beim Erstellen von ~/.ssh auf Remote"; exit 3; } # Append (avoid duplicates) PUB_CONTENT="$(cat "$KEY_PUB")" # check duplicate and append only if not present ssh "${SSH_OPTS[@]}" "$REMOTE" bash -s </dev/null || echo "$PUB_CONTENT" >> "\$AUTHORIZED" chmod 600 "\$AUTHORIZED" REMOTE_CHECK fi echo "Fertig. Versuche, dich mit dem neuen Key einzuloggen:" echo " ssh ${PORT:+-p $PORT }$REMOTE" echo "Hinweis: Falls du eine Passphrase möchtest, kannst du die lokale Key mit ssh-keygen -p ändern." exit 0