Package: bash-completion Version: 20080705 Severity: normal Attached are improvements to _known_hosts, ssh, scp and sftp: - Added support for `-F configfile' to _known_hosts. I've done this especially to make it easier to configure an ssh testsuite when writing automated tests. - Allow `Host(Name)' in ssh config file to be indented - Allow `Host(Name)' in ssh config file to have trailing comment. Note that SSH allows a comment after `Host' but not after `HostName'. In the latter case you'll get an error message when trying to scp/ssh/sftp: garbage at end of line; "#".
Regards, Freddy Vulto -- System Information: Debian Release: 4.0 APT prefers stable APT policy: (500, 'stable') Architecture: i386 (i686) Shell: /bin/sh linked to /bin/bash Kernel: Linux 2.6.18-6-686 Locale: LANG=en_US, LC_CTYPE=en_US (charmap=ISO-8859-1)
=== modified file 'bash_completion' --- bash_completion 2008-10-10 19:01:59 +0000 +++ bash_completion 2008-10-31 22:47:29 +0000 @@ -2503,28 +2511,42 @@ # This function performs host completion based on ssh's known_hosts files, # defaulting to standard host completion if they don't exist. -# +# Arguments: -a Use aliases +# -c Use `:' suffix +# -F configfile Use `configfile' for configuration settings _known_hosts() { - local cur curd ocur user suffix aliases global_kh user_kh hosts i host + local configfile cur curd ocur user suffix aliases global_kh user_kh hosts i host local -a kh khd config COMPREPLY=() cur=`_get_cword` ocur=$cur - [ "$1" = -a ] || [ "$2" = -a ] && aliases='yes' - [ "$1" = -c ] || [ "$2" = -c ] && suffix=':' + local OPTIND=1 + while getopts "acF:" flag "$@"; do + case $flag in + a) aliases='yes' ;; + c) suffix=':' ;; + F) configfile="$OPTARG" ;; + esac + done + [[ $cur == [EMAIL PROTECTED] ]] && [EMAIL PROTECTED]@ && [EMAIL PROTECTED] kh=() # ssh config files - [ -r /etc/ssh/ssh_config ] && - config=( "[EMAIL PROTECTED]" "/etc/ssh/ssh_config" ) - [ -r "${HOME}/.ssh/config" ] && - config=( "[EMAIL PROTECTED]" "${HOME}/.ssh/config" ) - [ -r "${HOME}/.ssh2/config" ] && - config=( "[EMAIL PROTECTED]" "${HOME}/.ssh2/config" ) + if [ -n "$configfile" ]; then + [ -r "$configfile" ] && + config=( "[EMAIL PROTECTED]" "$configfile" ) + else + [ -r /etc/ssh/ssh_config ] && + config=( "[EMAIL PROTECTED]" "/etc/ssh/ssh_config" ) + [ -r "${HOME}/.ssh/config" ] && + config=( "[EMAIL PROTECTED]" "${HOME}/.ssh/config" ) + [ -r "${HOME}/.ssh2/config" ] && + config=( "[EMAIL PROTECTED]" "${HOME}/.ssh2/config" ) + fi if [ [EMAIL PROTECTED] -gt 0 ]; then # expand path (if present) to global known hosts file @@ -2536,29 +2558,33 @@ # Global known_hosts files [ -r "$global_kh" ] && kh=( "[EMAIL PROTECTED]" "$global_kh" ) - [ -r /etc/ssh/ssh_known_hosts ] && - kh=( "[EMAIL PROTECTED]" /etc/ssh/ssh_known_hosts ) - [ -r /etc/ssh/ssh_known_hosts2 ] && - kh=( "[EMAIL PROTECTED]" /etc/ssh/ssh_known_hosts2 ) - [ -r /etc/known_hosts ] && - kh=( "[EMAIL PROTECTED]" /etc/known_hosts ) - [ -r /etc/known_hosts2 ] && - kh=( "[EMAIL PROTECTED]" /etc/known_hosts2 ) - [ -d /etc/ssh2/knownhosts ] && - khd=( "[EMAIL PROTECTED]" /etc/ssh2/knownhosts/*pub ) + if [ -z "$configfile" ]; then + [ -r /etc/ssh/ssh_known_hosts ] && + kh=( "[EMAIL PROTECTED]" /etc/ssh/ssh_known_hosts ) + [ -r /etc/ssh/ssh_known_hosts2 ] && + kh=( "[EMAIL PROTECTED]" /etc/ssh/ssh_known_hosts2 ) + [ -r /etc/known_hosts ] && + kh=( "[EMAIL PROTECTED]" /etc/known_hosts ) + [ -r /etc/known_hosts2 ] && + kh=( "[EMAIL PROTECTED]" /etc/known_hosts2 ) + [ -d /etc/ssh2/knownhosts ] && + khd=( "[EMAIL PROTECTED]" /etc/ssh2/knownhosts/*pub ) + fi # User known_hosts files [ -r "$user_kh" ] && kh=( "[EMAIL PROTECTED]" "$user_kh" ) - [ -r ~/.ssh/known_hosts ] && - kh=( "[EMAIL PROTECTED]" ~/.ssh/known_hosts ) - [ -r ~/.ssh/known_hosts2 ] && - kh=( "[EMAIL PROTECTED]" ~/.ssh/known_hosts2 ) - [ -d ~/.ssh2/hostkeys ] && - khd=( "[EMAIL PROTECTED]" ~/.ssh2/hostkeys/*pub ) + if [ -z "$configfile" ]; then + [ -r ~/.ssh/known_hosts ] && + kh=( "[EMAIL PROTECTED]" ~/.ssh/known_hosts ) + [ -r ~/.ssh/known_hosts2 ] && + kh=( "[EMAIL PROTECTED]" ~/.ssh/known_hosts2 ) + [ -d ~/.ssh2/hostkeys ] && + khd=( "[EMAIL PROTECTED]" ~/.ssh2/hostkeys/*pub ) + fi # If we have known_hosts files to use - if [ [EMAIL PROTECTED] -gt 0 -o [EMAIL PROTECTED] -gt 0 ]; then + if [ [EMAIL PROTECTED] -gt 0 -o [EMAIL PROTECTED] -gt 0 -o -n "$configfile" ]; then # Escape slashes and dots in paths for awk cur=${cur//\//\\\/} cur=${cur//\./\\\.} @@ -2602,7 +2628,7 @@ fi # append any available aliases from config files if [ [EMAIL PROTECTED] -gt 0 ] && [ -n "$aliases" ]; then - local host_aliases=$( sed -ne 's/^[Hh][Oo][Ss][Tt]\([Nn][Aa][Mm][Ee]\)\?['"$'\t '"']\+\([^*?]*\)$/\2/p' "[EMAIL PROTECTED]" ) + local host_aliases=$( sed -ne 's/^[ \t]*[Hh][Oo][Ss][Tt]\([Nn][Aa][Mm][Ee]\)\?['"$'\t '"']\+\([^#*?]*\)\(#.*\)\?$/\2/p' "[EMAIL PROTECTED]" ) hosts=$( compgen -W "$host_aliases" -- $ocur ) COMPREPLY=( "[EMAIL PROTECTED]" $hosts ) fi @@ -2614,7 +2640,7 @@ for (( i=0; i < [EMAIL PROTECTED]; i++ )); do COMPREPLY[i]=$user${COMPREPLY[i]}$suffix done - else + elif [ -z "$configfile" ]; then # Just do normal hostname completion COMPREPLY=( $( compgen -A hostname -S "$suffix" -- $cur ) ) fi === modified file 'contrib/ssh' --- contrib/ssh 2008-09-27 10:58:42 +0000 +++ contrib/ssh 2008-10-31 22:58:15 +0000 @@ -3,7 +3,7 @@ have ssh && { _ssh() { - local cur prev + local cur optconfigfile prev local -a config COMPREPLY=() @@ -11,6 +11,9 @@ prev=${COMP_WORDS[COMP_CWORD-1]} case "$prev" in + -F) + _filedir + ;; -*c) COMPREPLY=( $( compgen -W 'blowfish 3des 3des-cbc blowfish-cbc \ arcfour cast128-cbc' -- $cur ) ) @@ -22,9 +25,24 @@ COMPREPLY=( $( compgen -u -- $cur ) ) ;; *) - _known_hosts -a - - [ $COMP_CWORD -eq 1 ] || \ + # Search COMP_WORDS for '-F configfile' argument + set -- "[EMAIL PROTECTED]" + while [ $# -gt 0 ]; do + if [ "${1:0:2}" = -F ]; then + if [ ${#1} -gt 2 ]; then + optconfigfile="$i" + else + shift + optconfigfile="-F$1" + fi + break + fi + shift + done + + _known_hosts -a $optconfigfile + + [ $COMP_CWORD -eq 1 -o -n "$optconfigfile" ] || \ COMPREPLY=( "[EMAIL PROTECTED]" $( compgen -c -- $cur ) ) esac @@ -36,7 +54,7 @@ # _scp() { - local cur userhost path + local cur optconfigfile userhost path COMPREPLY=() cur=`_get_cword ":"` @@ -63,8 +81,23 @@ -e 's/[*@|=]$//g' -e 's/[^\/]$/& /g' ) ) return 0 fi + + # Search COMP_WORDS for '-F configfile' argument + set -- "[EMAIL PROTECTED]" + while [ $# -gt 0 ]; do + if [ "${1:0:2}" = -F ]; then + if [ ${#1} -gt 2 ]; then + optconfigfile="$i" + else + shift + optconfigfile="-F$1" + fi + break + fi + shift + done - [[ "$cur" == */* ]] || _known_hosts -c -a + [[ "$cur" == */* ]] || _known_hosts -c -a $optconfigfile local IFS=$'\t\n' COMPREPLY=( "[EMAIL PROTECTED]" $( command ls -aF1d $cur* \ 2>/dev/null | sed \