diff options
author | eadler <eadler@FreeBSD.org> | 2012-10-22 03:57:00 +0000 |
---|---|---|
committer | eadler <eadler@FreeBSD.org> | 2012-10-22 03:57:00 +0000 |
commit | 81826d4eaa973b897985a61a91c923c3e973b890 (patch) | |
tree | d479d19cefea9c4186759288ae1a7a48565dff64 /usr.bin/ssh-copy-id | |
parent | fec307dd7b1bf7d627d9d6aff6944448a61f2010 (diff) | |
download | FreeBSD-src-81826d4eaa973b897985a61a91c923c3e973b890.zip FreeBSD-src-81826d4eaa973b897985a61a91c923c3e973b890.tar.gz |
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
Diffstat (limited to 'usr.bin/ssh-copy-id')
-rw-r--r-- | usr.bin/ssh-copy-id/Makefile | 24 | ||||
-rw-r--r-- | usr.bin/ssh-copy-id/ssh-copy-id.1 | 80 | ||||
-rwxr-xr-x | usr.bin/ssh-copy-id/ssh-copy-id.sh | 105 |
3 files changed, 209 insertions, 0 deletions
diff --git a/usr.bin/ssh-copy-id/Makefile b/usr.bin/ssh-copy-id/Makefile new file mode 100644 index 0000000..2b9bf72 --- /dev/null +++ b/usr.bin/ssh-copy-id/Makefile @@ -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> diff --git a/usr.bin/ssh-copy-id/ssh-copy-id.1 b/usr.bin/ssh-copy-id/ssh-copy-id.1 new file mode 100644 index 0000000..2b2bbc2 --- /dev/null +++ b/usr.bin/ssh-copy-id/ssh-copy-id.1 @@ -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. diff --git a/usr.bin/ssh-copy-id/ssh-copy-id.sh b/usr.bin/ssh-copy-id/ssh-copy-id.sh new file mode 100755 index 0000000..8f087d3 --- /dev/null +++ b/usr.bin/ssh-copy-id/ssh-copy-id.sh @@ -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 |