_known_hosts_real: Support > 1 files per *KnownHostsFile line (Debian: #650514).

This commit is contained in:
Ville Skyttä 2011-12-05 21:58:04 +02:00
parent da4956af1f
commit 17c9722733
4 changed files with 20 additions and 11 deletions

View File

@ -1425,21 +1425,28 @@ _known_hosts_real()
# Known hosts files from configs
if [[ ${#config[@]} -gt 0 ]]; then
local OIFS=$IFS IFS=$'\n'
local OIFS=$IFS IFS=$'\n' j
local -a tmpkh
# expand paths (if present) to global and user known hosts files
# TODO(?): try to make known hosts files with more than one consecutive
# spaces in their name work (watch out for ~ expansion
# breakage! Alioth#311595)
tmpkh=( $( awk 'sub("^[ \t]*([Gg][Ll][Oo][Bb][Aa][Ll]|[Uu][Ss][Ee][Rr])[Kk][Nn][Oo][Ww][Nn][Hh][Oo][Ss][Tt][Ss][Ff][Ii][Ll][Ee][ \t]+", "") { print $0 }' "${config[@]}" | sort -u ) )
for i in "${tmpkh[@]}"; do
# Remove possible quotes
i=${i//\"}
# Eval/expand possible `~' or `~user'
__expand_tilde_by_ref i
[[ -r $i ]] && kh+=( "$i" )
done
IFS=$OIFS
for i in "${tmpkh[@]}"; do
# First deal with quoted entries...
while [[ $i =~ ^([^\"]*)\"([^\"]*)\"(.*)$ ]]; do
i=${BASH_REMATCH[1]}${BASH_REMATCH[3]}
j=${BASH_REMATCH[2]}
__expand_tilde_by_ref j # Eval/expand possible `~' or `~user'
[[ -r $j ]] && kh+=( "$j" )
done
# ...and then the rest.
for j in $i; do
__expand_tilde_by_ref j # Eval/expand possible `~' or `~user'
[[ -r $j ]] && kh+=( "$j" )
done
done
fi
if [[ -z $configfile ]]; then

View File

@ -1,4 +1,4 @@
# With quotes and tilde
UserKnownHostsFile "~/fixtures/_known_hosts_real/known_hosts2"
# Without quotes, with tilde
UserKnownHostsFile ~/fixtures/_known_hosts_real/known_hosts3
# Without quotes, with tilde, and another on the same line
UserKnownHostsFile ~/fixtures/_known_hosts_real/known_hosts3 fixtures/_known_hosts_real/known_hosts4

View File

@ -0,0 +1 @@
four

View File

@ -80,7 +80,8 @@ set test "Files starting with tilde (~) should work"
set hosts [get_hosts -unsorted]
# Hosts `two*' are defined in ./fixtures/_known_hosts_real/known_hosts2
# Host `three' is defined in ./fixtures/_known_hosts_real/known_hosts3
lappend hosts two two2 two3 two4 three
# Host `four' is defined in ./fixtures/_known_hosts_real/known_hosts4
lappend hosts two two2 two3 two4 three four
set hosts [join [bash_sort $hosts] "\\s+"]
# Setup environment
set cmd {OLDHOME=$HOME; HOME=$SRCDIRABS}