#!/bin/sh #- # Copyright (c) 2012 Eitan Adler # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer # in this position and unchanged. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF # SUCH DAMAGE. # # $FreeBSD: stable/11/usr.bin/ssh-copy-id/ssh-copy-id.sh 283001 2015-05-16 06:15:49Z eadler $ proc usage { echo "usage: ssh-copy-id [-lv] [-i keyfile] [-o option] [-p port] [user@]hostname" > !2 exit 1 } proc sendkey { local h="$1" local k="$2" printf "%s\n" $k | ssh $port -S none $options "$user$h" /bin/sh -c '''' \ set -e; \ umask 077; \ keyfile=$HOME/.ssh/authorized_keys ; \ mkdir -p -- "$HOME/.ssh/" ; \ while read alg key comment ; do \ [ -n "$key" ] || continue; \ if ! grep -sqwF "$key" "$keyfile"; then \ printf "$alg $key $comment\n" >> "$keyfile" ; \ fi ; \ done ; \ if [ -x /sbin/restorecon ]; then \ /sbin/restorecon -F "$HOME/.ssh/" "$keyfile" >/dev/null 2>&1 || true ; \ fi \ '''' } proc agentKeys { setglobal keys = ""$[ssh-add -L | grep -v 'The agent has no identities.]$nl$keys"" } setglobal keys = ''"" setglobal host = ''"" setglobal hasarg = ''"" setglobal user = ''"" setglobal port = ''"" setglobal nl = '" '" setglobal options = ''"" setglobal IFS = $nl while getopts 'i:lo:p:v' arg { match $arg { with i setglobal hasarg = '"x'" if test -r "$(OPTARG).pub" { setglobal keys = ""$[cat -- "$(OPTARG).pub]$nl$keys"" } elif test -r $OPTARG { setglobal keys = ""$[cat -- $OPTARG]$nl$keys"" } else { echo "File $OPTARG not found" > !2 exit 1 } with l setglobal hasarg = '"x'" agentKeys with p setglobal port = "-p$nl$OPTARG" with o setglobal options = "$options$nl-o$nl$OPTARG" with v setglobal options = ""$options$nl-v"" with * usage } } >&2 shift $shExpr('OPTIND-1') if test -z $hasarg { agentKeys } if test -z $keys || test $keys = $nl { echo "no keys found" > !2 exit 1 } if test "$Argc" -eq 0 { usage } for host in [@Argv] { sendkey $host $keys }