The main args completion no longer uses a bash while loop for splitting up the arguments making it much faster. I have also removed the use of FZF for looking up modes. This has been moved into the overidepartialcompletion file in includes.
82 lines
2.6 KiB
Text
82 lines
2.6 KiB
Text
#compdef hashcat
|
|
#
|
|
#
|
|
tokens=(${(z)LBUFFER})
|
|
|
|
if [[ "${LBUFFER[-1]}" == " " ]]; then
|
|
previousArg="${tokens[-1]}"
|
|
else
|
|
previousArg="${tokens[-2]}"
|
|
fi
|
|
|
|
|
|
trim(){
|
|
cat - | sed 's/^[[:space:]]*//' | sed 's/[[:space:]]*$//'
|
|
}
|
|
|
|
_args(){
|
|
hashcat --help | sed -n '/Options/,/Hash modes/p' | tail -n +5 | head -n -2 | awk -F '|' '{sub(/[ \t]+$/, "", $1); sub(/[ \t]+$/, "", $3); print $1 ":" $3 ":" $2}' | awk -F ':' '{ if ($1 ~ ",") { first=$1; second=$1; sub(/,.*/,"",first); sub(/.*,/,"",second); print first ":" $2 ":" $3 "\n" second ":" $2 ":" $3 } else {print $0} }' | trim
|
|
}
|
|
|
|
_hashes(){
|
|
hashcat --example-hashes | grep -E '(mode|Name|^$)' | awk -F ': ' '{print $NF}' | sed 's/Hash mode #//' | awk -v RS="\n\n" -F="\t" '{gsub("\n",":",$0);print $0}'
|
|
}
|
|
|
|
_basic_section(){
|
|
hashcat --help | sed -n '/'"$1"'/,/- \[/p' | tail -n +5 | head -n -2 | awk -F '|' '{gsub(/ /, "", $1); print $1 ":" $2}'
|
|
}
|
|
_modes(){
|
|
hashcat --help | sed -n '/Attack Modes/,/- \[/p' | tail -n +5 | head -n -2 | awk -F '|' '{gsub(/ /, "", $1); print $1 ":" $2}'
|
|
}
|
|
|
|
_brain_client_features(){
|
|
hashcat --help | sed -n '/Attack Modes/,/- \[/p' | tail -n +5 | head -n -2 | awk -F '|' '{gsub(/ /, "", $1); print $1 ":" $2}'
|
|
}
|
|
|
|
best_guess(){
|
|
# This get all possible arguments in the form argument:description:type
|
|
allArgs="$(_args)"
|
|
curr="$(echo "$allArgs" | grep -E "^$previousArg:")"
|
|
if [ -z "$(echo "$curr" | cut -d':' -f3)" ]; then
|
|
# If the type is empty, there should be no positional options
|
|
# Complete full list of arguments
|
|
args=("${(f)$(echo "$allArgs" | cut -d':' -f1-2)}")
|
|
_describe "Help" args
|
|
else
|
|
case "$(echo "$curr" | cut -d':' -f3)" in
|
|
# If it takes a file, prompt to choose a file
|
|
File) _files ;;
|
|
# Otherwise, just show a message containing the description
|
|
*) _message -r "$(echo "$curr" | cut -d':' -f2)" ;;
|
|
esac
|
|
fi
|
|
}
|
|
|
|
case "$previousArg" in
|
|
-m|--hash-type)
|
|
hashes=("${(f)$(_hashes)}")
|
|
_describe "Hashes" hashes ;;
|
|
-a|--attack-mode)
|
|
ops=("${(f)$(_basic_section "Attack Modes")}")
|
|
_describe "Modes" ops ;;
|
|
--brain-client-features)
|
|
ops=("${(f)$(_basic_section "Brain Client Features")}")
|
|
_describe "Modes" ops ;;
|
|
--outfile-format)
|
|
ops=("${(f)$(_basic_section "Outfile Formats")}")
|
|
_describe "Modes" ops ;;
|
|
--debug-mode)
|
|
ops=("${(f)$(_basic_section "Rule Debugging Modes")}")
|
|
_describe "Modes" ops ;;
|
|
#--)
|
|
# ops=("${(f)$(_basic_section "Built-in Charsets")}")
|
|
# _describe "Modes" ops ;;
|
|
-D|--opencl-device-types)
|
|
ops=("${(f)$(_basic_section "OpenCL Device Types")}")
|
|
_describe "Modes" ops ;;
|
|
-w|--workload-profile)
|
|
ops=("${(f)$(_basic_section "Workload Profiles")}")
|
|
_describe "Modes" ops ;;
|
|
|
|
*) best_guess ;;
|
|
esac
|