# -*- mode: shell-script; sh-basic-offset: 8; indent-tabs-mode: t -*- # ex: ts=8 sw=8 noet filetype=sh # # ssh(1) completion # have ssh && { _ssh() { local cur prev local optconfigfile local -a config COMPREPLY=() cur=`_get_cword` 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 ) ) ;; -*i) _filedir ;; -*l) COMPREPLY=( $( compgen -u -- $cur ) ) ;; *) # Search COMP_WORDS for '-F configfile' argument set -- "${COMP_WORDS[@]}" while [ $# -gt 0 ]; do if [ "${1:0:2}" = -F ]; then if [ ${#1} -gt 2 ]; then optconfigfile="$(dequote "$1")" else shift [ "$1" ] && optconfigfile="$(dequote "-F$1")" fi break fi shift done _known_hosts -a "$optconfigfile" [ $COMP_CWORD -eq 1 -o -n "$optconfigfile" ] || \ COMPREPLY=( "${COMPREPLY[@]}" $( compgen -c -- $cur ) ) esac return 0 } shopt -u hostcomplete && complete -F _ssh ssh slogin sftp xhost autossh # scp(1) completion # _scp() { local cur userhost path local optconfigfile COMPREPLY=() COMPREPLY=() cur="${COMP_WORDS[COMP_CWORD]}" prev="${COMP_WORDS[COMP_CWORD-1]}" # let the user press tab immediately to get home dir if [[ "$cur" == *:* ]]; then userhost=$prev path=$(ssh -o 'Batchmode yes' $userhost pwd 2>/dev/null) # escape spaces; remove executables, aliases, pipes and sockets; # add space at end of file names COMPREPLY=( $( ssh -o 'Batchmode yes' $userhost \ command ls -aF1d "$path*" 2>/dev/null | \ sed -e "s/[][(){}<>\",:;^&\!$=?\`|\\ ']/\\\\\\\\\\\\&/g" \ -e 's/[*@|=]$//g' -e 's/[^\/]$/& /g' ) ) return 0 fi if [[ "$prev" == *:* ]]; then local IFS=$'\t\n' # remove backslash escape from : cur=${cur/\\:/:} userhost=${COMP_WORDS[COMP_CWORD-2]} path=${cur#*:} # unescape spaces path=${path//\\\\ / } # escape spaces; remove executables, aliases, pipes and sockets; # add space at end of file names COMPREPLY=( $( ssh -o 'Batchmode yes' $userhost \ command ls -aF1d "$path*" 2>/dev/null | \ sed -e "s/[][(){}<>\",:;^&\!$=?\`|\\ ']/\\\\\\\\\\\\&/g" \ -e 's/[*@|=]$//g' -e 's/[^\/]$/& /g' ) ) return 0 fi # Search COMP_WORDS for '-F configfile' argument set -- "${COMP_WORDS[@]}" while [ $# -gt 0 ]; do if [ "${1:0:2}" = -F ]; then if [ ${#1} -gt 2 ]; then optconfigfile="$(dequote "$1")" else shift [ "$1" ] && optconfigfile="$(dequote "-F$1")" fi break fi shift done [[ "$cur" == */* ]] || _known_hosts -c -a "$optconfigfile" # This approach is used instead of _filedir to get a space appended # after local file/dir completions, and $nospace retained for others. local IFS=$'\t\n' COMPREPLY=( "${COMPREPLY[@]}" $( command ls -aF1d $cur* \ 2>/dev/null | sed \ -e "s/[][(){}<>\",:;^&\!$=?\`|\\ ']/\\\\&/g" \ -e 's/[*@|=]$//g' -e 's/[^\/]$/& /g' ) ) return 0 } complete -F _scp $nospace scp sshfs # ssh-copy-id(1) completion # _ssh_copy_id() { local cur prev COMPREPLY=() cur=`_get_cword` prev=${COMP_WORDS[COMP_CWORD-1]} case "$prev" in -*i) _filedir ;; *) _known_hosts -a [ $COMP_CWORD -eq 1 ] || \ COMPREPLY=( "${COMPREPLY[@]}" $( compgen -- $cur ) ) esac return 0 } complete -F _ssh_copy_id $filenames ssh-copy-id }