|
Lines 60-68
most_recent_id="$(cd "$HOME" ; ls -t .ssh/id*.pub 2>/dev/null | grep -v -- '-cer
Link Here
|
| 60 |
DEFAULT_PUB_ID_FILE="${most_recent_id:+$HOME/}$most_recent_id" |
60 |
DEFAULT_PUB_ID_FILE="${most_recent_id:+$HOME/}$most_recent_id" |
| 61 |
|
61 |
|
| 62 |
usage () { |
62 |
usage () { |
| 63 |
printf 'Usage: %s [-h|-?|-f|-n] [-i [identity_file]] [-p port] [[-o <ssh -o options>] ...] [user@]hostname\n' "$0" >&2 |
63 |
printf 'Usage: %s [-h|-?|-f|-n|-s] [-i [identity_file]] [-p port] [[-o <ssh -o options>] ...] [user@]hostname\n' "$0" >&2 |
| 64 |
printf '\t-f: force mode -- copy keys without trying to check if they are already installed\n' >&2 |
64 |
printf '\t-f: force mode -- copy keys without trying to check if they are already installed\n' >&2 |
| 65 |
printf '\t-n: dry run -- no keys are actually copied\n' >&2 |
65 |
printf '\t-n: dry run -- no keys are actually copied\n' >&2 |
|
|
66 |
printf '\t-s: use sftp -- use sftp instead of executing remote-commands. Can be useful if the remote only allows sftp\n' >&2 |
| 66 |
printf '\t-h|-?: print this help\n' >&2 |
67 |
printf '\t-h|-?: print this help\n' >&2 |
| 67 |
exit 1 |
68 |
exit 1 |
| 68 |
} |
69 |
} |
|
Lines 133-139
do
Link Here
|
| 133 |
} |
134 |
} |
| 134 |
shift |
135 |
shift |
| 135 |
;; |
136 |
;; |
| 136 |
-f|-n|-h|-\?) |
137 |
-f|-n|-s|-h|-\?) |
| 137 |
OPT="$1" |
138 |
OPT="$1" |
| 138 |
OPTARG= |
139 |
OPTARG= |
| 139 |
shift |
140 |
shift |
|
Lines 172-177
do
Link Here
|
| 172 |
-n) |
173 |
-n) |
| 173 |
DRY_RUN=1 |
174 |
DRY_RUN=1 |
| 174 |
;; |
175 |
;; |
|
|
176 |
-s) |
| 177 |
USE_SFTP=1 |
| 178 |
;; |
| 175 |
-h|-\?) |
179 |
-h|-\?) |
| 176 |
usage |
180 |
usage |
| 177 |
;; |
181 |
;; |
|
Lines 293-303
case "$REMOTE_VERSION" in
Link Here
|
| 293 |
*) |
297 |
*) |
| 294 |
# Assuming that the remote host treats ~/.ssh/authorized_keys as one might expect |
298 |
# Assuming that the remote host treats ~/.ssh/authorized_keys as one might expect |
| 295 |
populate_new_ids 0 |
299 |
populate_new_ids 0 |
| 296 |
# in ssh below - to defend against quirky remote shells: use 'exec sh -c' to get POSIX; |
300 |
|
| 297 |
# 'cd' to be at $HOME; add a newline if it's missing; and all on one line, because tcsh. |
301 |
if ! [ "$DRY_RUN" ] && ! [ "$USE_SFTP" ]; then |
| 298 |
[ "$DRY_RUN" ] || printf '%s\n' "$NEW_IDS" | \ |
302 |
# in ssh below - to defend against quirky remote shells: use 'exec sh -c' to get POSIX; |
|
|
303 |
# 'cd' to be at $HOME; add a newline if it's missing; and all on one line, because tcsh. |
| 304 |
printf '%s\n' "$NEW_IDS" | \ |
| 299 |
ssh "$@" "exec sh -c 'cd ; umask 077 ; mkdir -p .ssh && { [ -z "'`tail -1c .ssh/authorized_keys 2>/dev/null`'" ] || echo >> .ssh/authorized_keys ; } && cat >> .ssh/authorized_keys || exit 1 ; if type restorecon >/dev/null 2>&1 ; then restorecon -F .ssh .ssh/authorized_keys ; fi'" \ |
305 |
ssh "$@" "exec sh -c 'cd ; umask 077 ; mkdir -p .ssh && { [ -z "'`tail -1c .ssh/authorized_keys 2>/dev/null`'" ] || echo >> .ssh/authorized_keys ; } && cat >> .ssh/authorized_keys || exit 1 ; if type restorecon >/dev/null 2>&1 ; then restorecon -F .ssh .ssh/authorized_keys ; fi'" \ |
| 300 |
|| exit 1 |
306 |
|| exit 1 |
|
|
307 |
fi |
| 308 |
if ! [ "$DRY_RUN" ] && [ "$USE_SFTP" ] ; then |
| 309 |
KEYS_TMPFILE=$(mktemp --dry-run authorized_keys.XXXXXXXXXXXX) |
| 310 |
trap "rm -f $KEYS_TMPFILE" EXIT |
| 311 |
SHARED_CON_TMPFILE=$(mktemp --dry-run ssh-copy-id-shared-connection.XXXXXXXXXXXX) |
| 312 |
ssh -f -N -M -S $SHARED_CON_TMPFILE "$@" |
| 313 |
trap "ssh -S $SHARED_CON_TMPFILE -O exit 'notnecessary' >/dev/null 2>&1" EXIT |
| 314 |
echo "mkdir .ssh" | sftp -b - -o "ControlPath=${SHARED_CON_TMPFILE}" "notnecessary" >/dev/null 2>&1 |
| 315 |
echo "chmod 700 .ssh" | sftp -b - -o "ControlPath=${SHARED_CON_TMPFILE}" "notnecessary" >/dev/null 2>&1 |
| 316 |
echo "get .ssh/authorized_keys $KEYS_TMPFILE" | sftp -b - -o "ControlPath=$SHARED_CON_TMPFILE" "notnecessary" >/dev/null 2>&1 |
| 317 |
# add a newline or create file if it's missing, same like above |
| 318 |
[ -z "$(tail -1c $KEYS_TMPFILE 2>/dev/null)" ] || echo >> $KEYS_TMPFILE |
| 319 |
printf '%s\n' "$NEW_IDS" >> $KEYS_TMPFILE |
| 320 |
echo "put $KEYS_TMPFILE .ssh/authorized_keys" | sftp -b - -o "ControlPath=$SHARED_CON_TMPFILE" "notnecessary" >/dev/null 2>&1 || exit 1 |
| 321 |
echo "chmod 600 .ssh/authorized_keys" | sftp -b - -o "ControlPath=${SHARED_CON_TMPFILE}" "notnecessary" >/dev/null 2>&1 |
| 322 |
fi |
| 301 |
ADDED=$(printf '%s\n' "$NEW_IDS" | wc -l) |
323 |
ADDED=$(printf '%s\n' "$NEW_IDS" | wc -l) |
| 302 |
;; |
324 |
;; |
| 303 |
esac |
325 |
esac |