#!/bin/bash usage() { echo echo Usage: "${0}" "[options]" "[user@]host" "[identity-file]" echo echo " -h, --help, --usage display this text" echo " -n <[user@]host>, --via <[user@]host>" echo " establish connection via" echo " specified account" exit 1 } gop=`getopt -o n:h --long via:,help,usage -n propakey -- "$@"` [ $? = 0 ] || usage eval set -- "${gop}" via="" while true ; do case "$1" in -n|--via) via="$2" ; shift 2 ;; -h|--help|--usage) echo "usage" ; usage ;; --) shift ; break ;; *) echo "Huh" ; usage ;; esac done dest="$1" [ -z "${dest}" ] && usage keyfile="${2}" if [ -e "${keyfile}.pub" ] ; then keyfile="${keyfile}.pub" else if [ -e "${HOME}/.ssh/${keyfile}.pub" ] ; then keyfile="${HOME}/.ssh/${keyfile}.pub" else if [ ! -z "${keyfile}" ] ; then echo "Identity file not found" exit 2 fi for f in ${HOME}/.ssh/{id_dsa,id_rsa,identity}.pub ; do if [ -e $f ] ; then keyfile="$f"; break; fi done fi fi echo "Propagating ssh key to ${dest}" [ -z "${via}" ] || echo " via ${via}" echo "Using identity file '${keyfile}'" read kt k r <"${keyfile}" cmd="ssh ${dest} \ \"/bin/bash -c '\ umask 077 ;\ test ! -d .ssh && (mkdir .ssh || exit 1) ;\ ( test -r .ssh/authorized_keys && grep -q ${k} .ssh/authorized_keys > .ssh/authorized_keys ) \ '\"" <"${keyfile}" if [ -z "${via}" ] ; then eval ${cmd} <"${keyfile}" else ssh ${via} ${cmd} <"${keyfile}" fi