dotfiles/_home.macos/private_dot_local/bin/executable_auto-copy-ssh-id

59 lines
1.3 KiB
Bash

#! /usr/bin/env bash
set -e
if [ $# -eq 0 ]; then
printf '%s\n' \
"${0#/*} - | [Address [... Address]]" \
"" \
"Perform copy-ssh-id where key based ssh auth is failing" \
""
exit 2
fi
REMOTE_HOST=("${@:--}")
if [[ "${#REMOTE_HOST}" -eq 1 && "${REMOTE_HOST[0]}" == '-' ]]; then
read -a REMOTE_HOST
fi
ssh_do() {
local USER="${1}" HOST="${2:?}"
# BLINDLY Trust host keys ( https://stackoverflow.com/a/74410573/799379 )
[ 1 -eq "${NO_REFRESH:-0}" ] || (
ssh-keygen -F "$HOST" &>/dev/null \
&& ssh-keygen -R "$HOST" &>/dev/null \
|| true
)
ssh-keygen -F "$HOST" &>/dev/null || (
ssh-keyscan -Ht ed25519 "$HOST" \
|| ssh-keyscan -H "$HOST"
) | grep -v '^#' >> "$HOME/.ssh/known_hosts"
SSH_ASKPASS_REQUIRE=never \
ssh \
-o PasswordAuthentication=no \
-o LogLevel=ERROR \
-o BatchMode=yes \
-o ConnectTimeout=2 \
-ttn \
"${USER:+${USER}@}${HOST}" -- "${@:3}" \
|| (
local XC=$?
printf '\n'
printf 'Exit code: %s\n' "$XC" >&2
return $XC
)
}
for _host in "${REMOTE_HOST[@]}"; do
printf '%-40s: ' "$_host"
if ssh_do "" "$_host" hostname &>/dev/null; then
echo "ready"
else
printf 'Attempting to copy SSH key...\n\n'
ssh-copy-id "$_host"
fi
done