@@ -5,11 +5,14 @@ _comp_cmd_ssh_keygen()
5
5
local cur prev words cword comp_args
6
6
_comp_initialize -n := -- " $@ " || return
7
7
8
+ local IFS=$' \t\n ' # for ${words[*]}
9
+ local noargopts=' !(-*|*[ aCIJjMNPSVWzbEFRDwfGKsTmnOrtY]*)'
10
+ # shellcheck disable=SC2254
8
11
case $prev in
9
- -* [aCIJjMNPSVWz])
12
+ -${noargopts} [aCIJjMNPSVWz])
10
13
return
11
14
;;
12
- -* b)
15
+ -${noargopts} b)
13
16
local -a sizes=()
14
17
case " ${words[*]} " in
15
18
* " -t dsa" ? ( * ))
@@ -26,28 +29,28 @@ _comp_cmd_ssh_keygen()
26
29
_comp_compgen -- -W ' "${sizes[@]}"'
27
30
return
28
31
;;
29
- -* E)
32
+ -${noargopts} E)
30
33
_comp_compgen -- -W ' md5 sha256'
31
34
return
32
35
;;
33
- -* [FR])
36
+ -${noargopts} [FR])
34
37
# TODO: trim this down to actual entries in known hosts files
35
38
_comp_compgen_known_hosts -- " $cur "
36
39
return
37
40
;;
38
- -* [Dw])
41
+ -${noargopts} [Dw])
39
42
_comp_compgen_filedir so
40
43
return
41
44
;;
42
- -* [fGKsT])
45
+ -${noargopts} [fGKsT])
43
46
_comp_compgen_filedir
44
47
return
45
48
;;
46
- -* m)
49
+ -${noargopts} m)
47
50
_comp_compgen -- -W ' PEM PKCS8 RFC4716'
48
51
return
49
52
;;
50
- -* n)
53
+ -${noargopts} n)
51
54
[[ ${words[*]} != * \ -* Y\ * ]] || return
52
55
if [[ ${words[*]} == * \ -* h\ * ]]; then
53
56
_comp_compgen_known_hosts -- " ${cur##* ,} "
@@ -58,19 +61,41 @@ _comp_cmd_ssh_keygen()
58
61
fi
59
62
return
60
63
;;
61
- -* O)
64
+ -${noargopts} O)
62
65
if [[ $cur != * = * ]]; then
63
- _comp_compgen -- -W ' clear critical: extension: force-command=
64
- no-agent-forwarding no-port-forwarding no-pty no-user-rc
65
- no-x11-forwarding permit-agent-forwarding
66
- permit-port-forwarding permit-pty permit-user-rc
67
- permit-X11-forwarding no-touch-required source-address=
68
- verify-required
69
-
70
- lines= start-line= checkpoint= memory= start= generator=
71
-
72
- application= challenge= device= no-touch-required resident
73
- user= write-attestation='
66
+ local -a opts=()
67
+ case ${words[*]} in
68
+ * \ -${noargopts} M\ * )
69
+ opts=(
70
+ lines= start-line= checkpoint= memory= start=
71
+ generator=
72
+ )
73
+ ;;
74
+ * \ -${noargopts} r\ * )
75
+ opts=(hashalg=)
76
+ ;;
77
+ * \ -${noargopts} s\ * )
78
+ opts=(
79
+ clear critical: extension: force-command=
80
+ no-agent-forwarding no-port-forwarding no-pty
81
+ no-user-rc no-x11-forwarding permit-agent-forwarding
82
+ permit-port-forwarding permit-pty permit-user-rc
83
+ permit-X11-forwarding no-touch-required
84
+ source-address= verify-required
85
+ )
86
+ ;;
87
+ * \ -${noargopts} t\ + ([a-z0-9])-sk\ * )
88
+ opts=(
89
+ application= challenge= device= no-touch-required
90
+ resident user= verify-required write-attestation=
91
+ )
92
+ ;;
93
+ * \ -${noargopts} Y\ * )
94
+ opts=(hashalg= print-pubkey verify-time)
95
+ ;;
96
+ esac
97
+ (( ${# opts[@]} )) &&
98
+ _comp_compgen -- -W ' "${opts[@]}"'
74
99
75
100
[[ ${COMPREPLY-} == * [:= ] ]] && compopt -o nospace
76
101
_comp_ltrim_colon_completions " $cur "
@@ -90,15 +115,28 @@ _comp_cmd_ssh_keygen()
90
115
user=* )
91
116
_comp_compgen -c " ${cur#* =} " -- -u
92
117
;;
118
+ hashalg=* )
119
+ local -a args=()
120
+ case ${words[*]} in
121
+ * \ -* Y\ * )
122
+ args=(sha256 sha512)
123
+ ;;
124
+ * \ -* r\ * )
125
+ args=(sha1 sha256)
126
+ ;;
127
+ esac
128
+ (( ${# args[@]} )) &&
129
+ _comp_compgen -c " ${cur#* =} " -- -W ' "${args[@]}"'
130
+ ;;
93
131
esac
94
132
fi
95
133
return
96
134
;;
97
- -* r)
98
- [[ ${words[*]} != * \ -* Y\ * ]] || _comp_compgen_filedir
135
+ -${noargopts} r)
136
+ [[ ${words[*]} != * \ -${noargopts} Y\ * ]] || _comp_compgen_filedir
99
137
return
100
138
;;
101
- -* t)
139
+ -${noargopts} t)
102
140
# Prefer `ssh` from same dir for resolving options, etc
103
141
local pathcmd protocols
104
142
pathcmd=$( type -P -- " $1 " ) && local PATH=${pathcmd%/* } :$PATH
@@ -110,7 +148,7 @@ _comp_cmd_ssh_keygen()
110
148
_comp_compgen -- -W " $types "
111
149
return
112
150
;;
113
- -* Y)
151
+ -${noargopts} Y)
114
152
_comp_compgen -- -W ' find-principals check-novalidate sign verify'
115
153
return
116
154
;;
@@ -122,7 +160,7 @@ _comp_cmd_ssh_keygen()
122
160
_comp_compgen_help -- " -?" # OpenSSH < 7
123
161
fi
124
162
125
- if [[ ${words[*]} == * \ -* s\ * ]]; then
163
+ if [[ ${words[*]} == * \ -${noargopts} s\ * ]]; then
126
164
_comp_compgen -a filedir pub
127
165
fi
128
166
} &&
0 commit comments