Skip to content
GitLab
Next
About GitLab
GitLab: the DevOps platform
Explore GitLab
Install GitLab
How GitLab compares
Get started
GitLab docs
GitLab Learn
Pricing
Talk to an expert
/
Help
What's new
7
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Projects
Groups
Topics
Snippets
Register
Sign in
Toggle navigation
Menu
Philip Hands
ssh-copy-id
Commits
f0da1a1b
Commit
f0da1a1b
authored
Sep 17, 2020
by
Philip Hands
Browse files
adopt shellcheck recommendations (as in bug #2902)
parent
4e24cf24
Pipeline
#191185044
passed with stage
in 52 seconds
Changes
1
Pipelines
2
Hide whitespace changes
Inline
Side-by-side
ssh-copy-id
View file @
f0da1a1b
...
...
@@ -34,13 +34,15 @@
# Shell script to install your public key(s) on a remote machine
# See the ssh-copy-id(1) man page for details
# shellcheck shell=dash
# check that we have something mildly sane as our shell, or try to find something better
if
false
^
printf
"%s: WARNING: ancient shell, hunting for a more modern one... "
"
$0
"
then
SANE_SH
=
${
SANE_SH
:-
/usr/bin/ksh
}
if
printf
'true ^ false\n'
|
"
$SANE_SH
"
then
printf
"'%s' seems viable.
\n
"
"
$SANE_SH
"
printf
"'%s' seems viable.
\
\
n"
"
$SANE_SH
"
exec
"
$SANE_SH
"
"
$0
"
"
$@
"
else
cat
<<-
EOF
...
...
@@ -52,12 +54,13 @@ then
a bug describing your setup, and the shell you used to make it work.
EOF
printf
"
%s: ERROR: Less dimwitted shell required.
\n
"
"
$0
"
printf
'
%s: ERROR: Less dimwitted shell required.\n
'
"
$0
"
exit
1
fi
fi
DEFAULT_PUB_ID_FILE
=
$(
ls
-t
${
HOME
}
/.ssh/id
*
.pub 2>/dev/null |
grep
-v
--
'-cert.pub$'
|
head
-n
1
)
# shellcheck disable=SC2010
DEFAULT_PUB_ID_FILE
=
$(
ls
-t
"
${
HOME
}
"
/.ssh/id
*
.pub 2>/dev/null |
grep
-v
--
'-cert.pub$'
|
head
-n
1
)
usage
()
{
printf
'Usage: %s [-h|-?|-f|-n] [-i [identity_file]] [-p port] [-F alternative ssh_config file] [[-o <ssh -o options>] ...] [user@]hostname\n'
"
$0
"
>
&2
...
...
@@ -69,18 +72,18 @@ usage () {
# escape any single quotes in an argument
quote
()
{
printf
"
%s
\n
"
"
$1
"
|
sed
-e
"s/'/'
\\\\
''/g"
printf
'
%s\n
'
"
$1
"
|
sed
-e
"s/'/'
\\\\
''/g"
}
use_id_file
()
{
local
L_ID_FILE
=
"
$1
"
if
[
-z
"
$L_ID_FILE
"
]
;
then
printf
"
%s: ERROR: no ID file found
\n
"
"
$0
"
printf
'
%s: ERROR: no ID file found\n
'
"
$0
"
exit
1
fi
if
expr
"
$L_ID_FILE
"
:
"
.*
\.
pub$
"
>
/dev/null
;
then
if
expr
"
$L_ID_FILE
"
:
'
.*\.pub$
'
>
/dev/null
;
then
PUB_ID_FILE
=
"
$L_ID_FILE
"
else
PUB_ID_FILE
=
"
$L_ID_FILE
.pub"
...
...
@@ -93,7 +96,7 @@ use_id_file() {
ErrMSG
=
$(
{
: <
"
$f
"
;
}
2>&1
)
||
{
local
L_PRIVMSG
=
""
[
"
$f
"
=
"
$PRIV_ID_FILE
"
]
&&
L_PRIVMSG
=
" (to install the contents of '
$PUB_ID_FILE
' anyway, look at the -f option)"
printf
"
\n
%s: ERROR: failed to open ID file '%s': %s
\n
"
"
$0
"
"
$f
"
"
$(
printf
"
%s
\n
%s
\n
"
"
$ErrMSG
"
"
$L_PRIVMSG
"
|
sed
-e
's/.*: *//'
)
"
printf
"
\
\
n%s: ERROR: failed to open ID file '%s': %s
\
\
n"
"
$0
"
"
$f
"
"
$(
printf
'
%s\n%s\n
'
"
$ErrMSG
"
"
$L_PRIVMSG
"
|
sed
-e
's/.*: *//'
)
"
exit
1
}
done
...
...
@@ -110,10 +113,10 @@ do
case
"
$OPT
"
in
i
)
[
"
${
SEEN_OPT_I
}
"
]
&&
{
printf
"
\n
%s: ERROR: -i option must not be specified more than once
\n\n
"
"
$0
"
usage
}
[
"
${
SEEN_OPT_I
}
"
]
&&
{
printf
'
\n%s: ERROR: -i option must not be specified more than once\n\n
'
"
$0
"
usage
}
SEEN_OPT_I
=
"yes"
use_id_file
"
${
OPTARG
:-
$DEFAULT_PUB_ID_FILE
}
"
;;
...
...
@@ -146,16 +149,18 @@ if [ $# != 1 ] ; then
fi
# drop trailing colon
USER_HOST
=
"
$
@
"
USER_HOST
=
"
$
*
"
# tack the hostname onto SSH_OPTS
SSH_OPTS
=
"
${
SSH_OPTS
:+
$SSH_OPTS
}
'
$(
quote
"
$USER_HOST
"
)
'"
# and populate "$@" for later use (only way to get proper quoting of options)
eval set
--
"
$SSH_OPTS
"
# shellcheck disable=SC2086
if
[
-z
"
$(
eval
$GET_ID
)
"
]
&&
[
-r
"
${
PUB_ID_FILE
:
=
$DEFAULT_PUB_ID_FILE
}
"
]
;
then
use_id_file
"
$PUB_ID_FILE
"
fi
# shellcheck disable=SC2086
if
[
-z
"
$(
eval
$GET_ID
)
"
]
;
then
printf
'%s: ERROR: No identities found\n'
"
$0
"
>
&2
exit
1
...
...
@@ -166,6 +171,7 @@ fi
populate_new_ids
()
{
local
L_SUCCESS
=
"
$1
"
# shellcheck disable=SC2086
if
[
"
$FORCED
"
]
;
then
NEW_IDS
=
$(
eval
$GET_ID
)
return
...
...
@@ -175,17 +181,20 @@ populate_new_ids() {
eval set
--
"
$SSH_OPTS
"
umask
0177
local
L_TMP_ID_FILE
=
$(
mktemp
~/.ssh/ssh-copy-id_id.XXXXXXXXXX
)
local
L_TMP_ID_FILE
L_TMP_ID_FILE
=
$(
mktemp
~/.ssh/ssh-copy-id_id.XXXXXXXXXX
)
if
test
$?
-ne
0
||
test
"x
$L_TMP_ID_FILE
"
=
"x"
;
then
printf
'%s: ERROR: mktemp failed\n'
"
$0
"
>
&2
exit
1
fi
local
L_CLEANUP
=
"rm -f
\"
$L_TMP_ID_FILE
\"
\"
${
L_TMP_ID_FILE
}
.stderr
\"
"
# shellcheck disable=SC2064
trap
"
$L_CLEANUP
"
EXIT TERM INT QUIT
printf
'%s: INFO: attempting to log in with the new key(s), to filter out any that are already installed\n'
"
$0
"
>
&2
# shellcheck disable=SC2086
NEW_IDS
=
$(
eval
$GET_ID
|
{
while
read
ID
||
[
"
$ID
"
]
;
do
while
read
-r
ID
||
[
"
$ID
"
]
;
do
printf
'%s\n'
"
$ID
"
>
"
$L_TMP_ID_FILE
"
# the next line assumes $PRIV_ID_FILE only set if using a single id file - this
...
...
@@ -218,7 +227,7 @@ populate_new_ids() {
fi
if
[
-z
"
$NEW_IDS
"
]
;
then
printf
'\n%s: WARNING: All keys were skipped because they already exist on the remote system.\n'
"
$0
"
>
&2
printf
'\t\t(if you think this is a mistake, you may want to use -f option)\n\n'
"
$0
"
>
&2
printf
'\t\t(if you think this is a mistake, you may want to use -f option)\n\n'
>
&2
exit
0
fi
printf
'%s: INFO: %d key(s) remain to be installed -- if you are prompted now it is to install the new keys\n'
"
$0
"
"
$(
printf
'%s\n'
"
$NEW_IDS
"
|
wc
-l
)
"
>
&2
...
...
@@ -241,7 +250,7 @@ installkeys_sh() {
INSTALLKEYS_SH
=
$(
tr
'\t\n'
' '
<<-
EOF
)
cd;
umask 077;
mkdir -p
$(
dirname
${
AUTH_KEY_FILE
}
)
&&
mkdir -p
$(
dirname
"
${
AUTH_KEY_FILE
}
"
)
&&
{ [ -z
\`
tail -1c
${
AUTH_KEY_FILE
}
2>/dev/null
\`
] || echo >>
${
AUTH_KEY_FILE
}
; } &&
cat >>
${
AUTH_KEY_FILE
}
||
exit 1;
...
...
@@ -257,12 +266,13 @@ EOF
REMOTE_VERSION
=
$(
ssh
-v
-o
PreferredAuthentications
=
','
-o
ControlPath
=
none
"
$@
"
2>&1 |
sed
-ne
's/.*remote software version //p'
)
# shellcheck disable=SC2029
case
"
$REMOTE_VERSION
"
in
NetScreen
*
)
populate_new_ids 1
for
KEY
in
$(
printf
"%s"
"
$NEW_IDS
"
|
cut
-d
' '
-f2
)
;
do
KEY_NO
=
$((
$
KEY_NO
+
1
))
printf
"
%s
\n
"
"
$KEY
"
|
grep
ssh-dss
>
/dev/null
||
{
KEY_NO
=
$((
KEY_NO
+
1
))
printf
'
%s\n
'
"
$KEY
"
|
grep
ssh-dss
>
/dev/null
||
{
printf
'%s: WARNING: Non-dsa key (#%d) skipped (NetScreen only supports DSA keys)\n'
"
$0
"
"
$KEY_NO
"
>
&2
continue
}
...
...
@@ -270,7 +280,7 @@ case "$REMOTE_VERSION" in
if
[
$?
=
255
]
;
then
printf
'%s: ERROR: installation of key #%d failed (please report a bug describing what caused this, so that we can make this message useful)\n'
"
$0
"
"
$KEY_NO
"
>
&2
else
ADDED
=
$((
$
ADDED
+
1
))
ADDED
=
$((
ADDED
+
1
))
fi
done
if
[
-z
"
$ADDED
"
]
;
then
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment