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:
parent
c51f92a216
commit
2beb708522
@ -146,6 +146,7 @@ SUBDIR= alias \
|
||||
sockstat \
|
||||
sort \
|
||||
split \
|
||||
ssh-copy-id \
|
||||
stat \
|
||||
stdbuf \
|
||||
su \
|
||||
|
24
usr.bin/ssh-copy-id/Makefile
Normal file
24
usr.bin/ssh-copy-id/Makefile
Normal 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>
|
80
usr.bin/ssh-copy-id/ssh-copy-id.1
Normal file
80
usr.bin/ssh-copy-id/ssh-copy-id.1
Normal 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.
|
105
usr.bin/ssh-copy-id/ssh-copy-id.sh
Executable file
105
usr.bin/ssh-copy-id/ssh-copy-id.sh
Executable 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
|
Loading…
Reference in New Issue
Block a user