]> git.ipfire.org Git - thirdparty/openssh-portable.git/commitdiff
restore optionality of -i's argument
authorPhilip Hands <phil@hands.com>
Sun, 4 Aug 2024 18:45:00 +0000 (20:45 +0200)
committerDarren Tucker <dtucker@dtucker.net>
Sat, 17 Aug 2024 01:19:37 +0000 (11:19 +1000)
SSH-Copy-ID-Upstream: f70e3abb510e4eeb040b47894e41828246c1b720

contrib/ssh-copy-id
contrib/ssh-copy-id.1

index 4798a4dbd9829ab76acce365d0688c0d10aa1e1b..6251201b2cbbee55cacf0309534c9d9721882996 100644 (file)
@@ -114,7 +114,9 @@ if [ -n "$SSH_AUTH_SOCK" ] && ssh-add -L >/dev/null 2>&1 ; then
   GET_ID="ssh-add -L"
 fi
 
-while getopts "i:o:p:F:t:fnsxh?" OPT
+OPTS="io:p:F:t:fnsxh?"
+
+while getopts "$OPTS" OPT
 do
   case "$OPT" in
     i)
@@ -123,6 +125,20 @@ do
         usage
       }
       SEEN_OPT_I="yes"
+
+      # Check for -i's optional parameter
+      eval "nextarg=\${$OPTIND}"
+      # shellcheck disable=SC2154
+      if [ $OPTIND = $# ]; then
+        if [ -r "$nextarg" ] && grep -iq ssh "$nextarg"; then
+          printf '\n%s: ERROR: Missing hostname. Use "-i -- %s" if you really mean to use this as the hostname\n\n' "$0" "$nextarg" >&2
+          usage
+        fi
+      elif ! expr -- "$nextarg" : "-[$(echo "$OPTS" | tr -d :)-]" >/dev/null ; then
+        # when not at the last arg, and not followed by an option, -i has an argument
+        OPTARG="$nextarg"
+        OPTIND=$((OPTIND + 1))
+      fi
       use_id_file "${OPTARG:-$DEFAULT_PUB_ID_FILE}"
       ;;
     o|F)
index 74eec2f8e2137e071c5dff20a83793504865b46c..cc74e432bfe8d232c1b32decc5a650c13aa2dec3 100644 (file)
@@ -67,7 +67,7 @@ command instead.
 .Pp
 The options are as follows:
 .Bl -tag -width Ds
-.It Fl i Ar identity_file
+.It Fl i Op Ar identity_file
 Use only the key(s) contained in
 .Ar identity_file
 (rather than looking for identities via