Add a clean-room reimplementation of a script originally

found in openssh's contrib directory.

This version has more features and is better written.
I intend to submit this upstream as well.

Reviewed by:	bapt
Reviewed by:	des
Approved by:	cperciva
MFC after:	1 week
This commit is contained in:
Eitan Adler 2012-10-22 03:57:00 +00:00
parent c51f92a216
commit 2beb708522
4 changed files with 210 additions and 0 deletions

View File

@ -146,6 +146,7 @@ SUBDIR= alias \
sockstat \
sort \
split \
ssh-copy-id \
stat \
stdbuf \
su \

View File

@ -0,0 +1,24 @@
# $FreeBSD$
SCRIPTS= ssh-copy-id.sh
MAN= ssh-copy-id.1
.include <bsd.prog.mk>
# $FreeBSD$
SCRIPTS= ssh-copy-id.sh
MAN= ssh-copy-id.1
.include <bsd.prog.mk>
# $FreeBSD$
SCRIPTS= ssh-copy-id.sh
MAN= ssh-copy-id.1
.include <bsd.prog.mk>
# $FreeBSD$
SCRIPTS= ssh-copy-id.sh
MAN= ssh-copy-id.1
.include <bsd.prog.mk>

View File

@ -0,0 +1,80 @@
.\"-
.\" 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.
.\" 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$
.\"
.Dd October 3, 2012
.Dt SSH-COPY-ID 1
.Os
.Sh NAME
.Nm ssh-copy-id
.Nd copy public keys to a remote host
.Sh SYNOPSIS
.Nm
.Op Fl l
.Op Fl i Ar keyfile
.Op Fl o Ar option
.Op Fl p Ar port
.Oo Ar user Ns @ Oc Ns Ar hostname
.Sh DESCRIPTION
The
.Nm
utility copies public keys to a remote host's
.Pa authorized_keys
file.
.Pp
The following options are available:
.Bl -tag -width indent
.It Fl i Ar file
Copy the key contained in
.Ar file .
This option can be specified multiple times and can be combined with
the
.Fl l
option.
.It Fl l
Copy the keys currently held by
.Xr ssh-agent 1 .
This is the default if the
.Fl i
option was not specified.
.It Fl o Ar ssh-option
Pass this option directly to
.Xr ssh 1 .
This option can be specified multiple times.
.It Fl p Ar port
Connect to the specified port on the remote host instead of the
default.
.El
.Pp
The remaining arguments are a list of remote hosts to connect to,
each one optionally qualified by a user name.
.Sh HISTORY
The
.Nm
utility was written by
.An Eitan Adler Aq eadler@FreeBSD.org
as a drop-in replacement for an existing utility included with
OpenSSH.

View File

@ -0,0 +1,105 @@
#!/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$
usage() {
echo "usage: ssh-copy-id [-l] [-i keyfile] [-o option] [-p port] [user@]hostname" >&2
exit 1
}
sendkey() {
local h="$1"
shift 1
local k="$@"
echo "$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
if ! grep -sqwF "$key" "$keyfile"; then
echo "$alg $key $comment" |
tee -a "$keyfile" >/dev/null ;
fi ;
done
'\'
}
agentKeys() {
keys="$(ssh-add -L | grep -v 'The agent has no identities.')$nl$keys"
}
keys=""
host=""
hasarg=""
user=""
port=""
nl="
"
options=""
while getopts 'i:lo:p:' arg; do
case $arg in
i)
hasarg="x"
if [ -f "$OPTARG" ]; then
keys="$(cat $OPTARG)$nl$keys"
fi
;;
l)
hasarg="x"
agentKeys
;;
p)
port="-p $OPTARG"
;;
o)
options="$options -o '$OPTARG'"
;;
*)
usage
;;
esac
done >&2
shift $((OPTIND-1))
if [ -z "$hasarg" ]; then
agentKeys
fi
if [ -z "$keys" -o "$keys" = "$nl" ]; then
echo "no keys found" >&2
exit 1
fi
if [ -z "$@" ]; then
usage
fi
for host in "$@"; do
sendkey "$host" "$keys"
done