Mikael Magnusson wrote: > 2008/9/19 Bismark <bismark@xxxxxxxxxx>: >> I'm trying to right a command completion function and I'm stuck. I've >> been looking through examples and the documentation but having no luck. >> >> What I'm looking for is for the parameters for an option to a command to >> have a description. I've gotten the completion to work for the command >> but when I complete the option I only get the values. >> >> $ medusa - >> option >> -C -- File containing combo entries. (see man page) >> -H -- Reads Target specifications from a file. >> -P -- Reads Passwords from a file. >> -U -- Reads Usernames from a file. >> -e -- Additional password checks >> -h -- Target hostname or IP address. >> -p -- Password. >> -u -- Username. >> >> $ medusa -e >> Additional password checks >> n ns s >> >> I would like it to display something like the following >> >> $ medusa -e >> Additional password checks >> n -- No Password >> s -- Username = Password >> ns -- No Password & Username = Password >> >> What is the best way to go about doing this? > > It would of course help a lot if you also posted your code, but at a guess, > where you have -d array in your compdef call, change it to -ld array, where > array is the array with your descriptions, i think. Maybe the problem is > you don't have a -d array at all. ie > mydescriptions=('No Password' 'Username = Password' etc) > compdef blabla -ld mydescriptions blabla I'm doing this for Medusa http://www.foofus.net/jmk/medusa/medusa.html by the way. Yes including the code probably would have helped, sorry about that. I think I have it working now though I do not know if it's the proper or most efficient way to do it. What I have so far is below: ####### _medusa ###### #compef medusa local expl context state line ret=1 _select_module() { local modules modules=( $(medusa -d | grep + | awk '/.mod/ {print $2}' | cut -d"." -f 1) ) _wanted select-module expl 'Module' compadd "$@" -a - modules } _arguments \ '-h[Target hostname or IP address.]:Hostname or IP Address' \ '-H[Read Targets from a file.]:Hosts file:_files' \ '-u[Username.]:Username' \ '-U[Read Usernames from a file.]:Username file:_files' \ '-p[Password.]:Password' \ '-P[Read Passwords from a file.]:Password file:_files' \ '-C[File containing combo entries. (see man page)]:Combo file:_files' \ "-e[Additional password checks]:Additional password checks:_values 'Additional password checks' 'n[No Password]' 's[Password = Username]' 'ns[No Password & Password = Username]'" \ '-O[File to append log information to.]:xiLlog file:_files' \ '-M[Name of the module to execute (without the .mod extension)]:Module:_select_module' \ '*-m[Parameter to pass to the module.]:Module Parameters' \ '-d[Dump all known modules.]:Dump Modules' \ '-n[Use for non-default TCP port number.]:tcp port' \ '-s[Enable SSL.]:Enable SSL' \ '-g[Give up after trying to connect for NUM seconds (default 3).]:Retry seconds' \ '-r[Sleep number of seconds between retry attempts (default 3).]:Sleep seconds' \ '-R[Attempted retries before giving up. The total number of attempts will be retries + 1.]:Retries' \ '-t[Total number of logins to be tested concurrently]:Concurrent Logins' \ '-T[Total number of hosts to be tested concurrently.]:Concurrent Hosts' \ '-L[Parallelize logins using one username per thread.]:Parallelize' \ '-f[Stop scanning host after first valid username/password found.]:Stop scan after host' \ '-F[Stop audit after first valid username/password found on any host.]:Stop scan after username' \ '-b[Suppress startup banner]:Suppress Banner' \ '-q[Display module’s usage information.]:Module Usage' \ '-v[Verbose level (0 - 6)]:Verbosity:(0 1 2 3 4 5 6)' \ '-w[Error debug level (0 - 10)]:Debug:(0 1 2 3 4 5 6 7 8 9 10)' \ '-V[Display version]:Version' && return 0 #### end _medusa #### I also have a couple of other questions along with this one. 1) I know how to setup mutually exclusive arguments, is it possible to configure prerequisite arguments? In medusa you have to select a module '-M <module>' and then the individual modules themselves can have additional arguments '-m <argument>', but -m doesn't do anything unless -M is given. 2) If it is possible to do #1 can you get the value passed to -M to help complete the values for the -m argument? Thanks, Bismark
Attachment:
signature.asc
Description: OpenPGP digital signature