added wildcard support in rmhost
This commit is contained in:
@@ -52,10 +52,13 @@ rmhost()
|
|||||||
case "$1" in
|
case "$1" in
|
||||||
-h|--help)
|
-h|--help)
|
||||||
printf "rmhost: Remove host/IP from known_hosts files.\n\n"
|
printf "rmhost: Remove host/IP from known_hosts files.\n\n"
|
||||||
printf "Usage: rmhost [--all-users] <hostname|ip> [hostname2|ip2 ...]\n\n"
|
printf "Usage: rmhost [--all-users] <pattern|ip> [pattern2|ip2 ...]\n\n"
|
||||||
printf "Options:\n"
|
printf "Options:\n"
|
||||||
printf " -a, --all-users Remove entries from all local users when run as root\n"
|
printf " -a, --all-users Remove entries from all local users when run as root\n"
|
||||||
printf " -h, --help Display this help screen\n"
|
printf " -h, --help Display this help screen\n\n"
|
||||||
|
printf "Wildcards:\n"
|
||||||
|
printf " Glob patterns (*, ?, [...]) are expanded against unhashed known_hosts entries.\n"
|
||||||
|
printf " Hashed entries (prefixed with |1|) are never matched by wildcards.\n"
|
||||||
return 0
|
return 0
|
||||||
;;
|
;;
|
||||||
-a|--all-users)
|
-a|--all-users)
|
||||||
@@ -106,6 +109,50 @@ rmhost()
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
for target in "$@"; do
|
for target in "$@"; do
|
||||||
|
# Wildcard: expand glob pattern against unhashed known_hosts entries
|
||||||
|
if [[ "$target" == *['*?[']* ]]; then
|
||||||
|
local -a _matched=()
|
||||||
|
local _wf _wl _wfield _whost _wmatch
|
||||||
|
local -a _wentries
|
||||||
|
for _wf in "${known_hosts_files[@]}"; do
|
||||||
|
[[ -f "$_wf" ]] || continue
|
||||||
|
while IFS= read -r _wl; do
|
||||||
|
[[ -z "$_wl" || "$_wl" == '#'* || "$_wl" == '|'* ]] && continue
|
||||||
|
_wfield="${_wl%% *}"
|
||||||
|
IFS=',' read -ra _wentries <<< "$_wfield"
|
||||||
|
for _whost in "${_wentries[@]}"; do
|
||||||
|
# Strip [host]:port notation to get the bare name for matching
|
||||||
|
if [[ "$_whost" == '['*']:'* ]]; then
|
||||||
|
_wmatch="${_whost#[}"
|
||||||
|
_wmatch="${_wmatch%%]:*}"
|
||||||
|
else
|
||||||
|
_wmatch="$_whost"
|
||||||
|
fi
|
||||||
|
# shellcheck disable=SC2053
|
||||||
|
[[ "$_wmatch" == $target ]] && _matched+=("$_whost")
|
||||||
|
done
|
||||||
|
done < "$_wf"
|
||||||
|
done
|
||||||
|
|
||||||
|
mapfile -t _matched < <(printf '%s\n' "${_matched[@]}" | sort -u)
|
||||||
|
|
||||||
|
if [[ ${#_matched[@]} -eq 0 ]]; then
|
||||||
|
disp W "No known_hosts entries match pattern '$target'."
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
local _key _known_hosts_file
|
||||||
|
for _key in "${_matched[@]}"; do
|
||||||
|
for _known_hosts_file in "${known_hosts_files[@]}"; do
|
||||||
|
disp I "Removing '$_key' from $_known_hosts_file..."
|
||||||
|
if ! ssh-keygen -R "$_key" -f "$_known_hosts_file" >/dev/null 2>&1; then
|
||||||
|
disp W "No known_hosts entry found for '$_key' in '$_known_hosts_file'."
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
done
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
local hst="$target"
|
local hst="$target"
|
||||||
local ip=""
|
local ip=""
|
||||||
local v4=1
|
local v4=1
|
||||||
|
|||||||
Reference in New Issue
Block a user