#!/bin/sh -e # I hereby place this script in the public domain -- Colin Percival # Usage if [ $# -lt 1 ]; then echo "usage: $0 host [fingerprint ...]" >/dev/stderr exit 1; fi # Extract host name from command line. HOST=$1 shift; # Print a warning if no fingerprints were provided. if [ $# -lt 1 ]; then echo "$0: No fingerprints provided for host $HOST" >/dev/stderr exit 0; fi # Create a directory for our temporary files. D=`mktemp -d "${TMP:-/tmp}/ssh-knownhost.XXXXXX"` || exit 1 # No good keys yet. : > $D/goodkeys # Handle SSH keys of various sorts. for KTYPE in rsa1 rsa dsa ecdsa; do ssh-keyscan -t $KTYPE $HOST > $D/hostkey.$KTYPE 2>/dev/null if [ -s $D/hostkey.$KTYPE ]; then KPRINT=`ssh-keygen -lf $D/hostkey.$KTYPE | cut -f 2 -d ' '` GOODKEY=0 for KEY in "$@"; do if [ "$KEY" = "$KPRINT" ]; then GOODKEY=1 fi done if [ $GOODKEY = 1 ]; then cat $D/hostkey.$KTYPE >> $D/goodkeys else echo "$0: $KTYPE key for $HOST not in provided list" \ >/dev/stderr fi fi rm $D/hostkey.$KTYPE done # Add new keys to our known_hosts file. sort < $D/goodkeys > $D/goodkeys.tmp mv $D/goodkeys.tmp $D/goodkeys sort < ~/.ssh/known_hosts | comm -13 - $D/goodkeys > $D/newkeys cat $D/newkeys >> ~/.ssh/known_hosts # Clean up rm $D/goodkeys $D/newkeys rmdir $D