259 lines
7.3 KiB
Bash
259 lines
7.3 KiB
Bash
# ssh(1) completion
|
|
|
|
have ssh &&
|
|
{
|
|
|
|
_ssh_options() {
|
|
COMPREPLY=( $( compgen -W 'AddressFamily BatchMode BindAddress \
|
|
ChallengeResponseAuthentication CheckHostIP Cipher Ciphers \
|
|
ClearAllForwardings Compression CompressionLevel ConnectionAttempts \
|
|
ConnectTimeout ControlMaster ControlPath DynamicForward EscapeChar \
|
|
ExitOnForwardFailure ForwardAgent ForwardX11 ForwardX11Trusted \
|
|
GatewayPorts GlobalKnownHostsFile GSSAPIAuthentication \
|
|
GSSAPIDelegateCredentials HashKnownHosts Host HostbasedAuthentication \
|
|
HostKeyAlgorithms HostKeyAlias HostName IdentityFile IdentitiesOnly \
|
|
KbdInteractiveDevices LocalCommand LocalForward LogLevel MACs \
|
|
NoHostAuthenticationForLocalhost NumberOfPasswordPrompts \
|
|
PasswordAuthentication PermitLocalCommand Port \
|
|
PreferredAuthentications Protocol ProxyCommand PubkeyAuthentication \
|
|
RekeyLimit RemoteForward RhostsRSAAuthentication RSAAuthentication \
|
|
SendEnv ServerAliveInterval ServerAliveCountMax SmartcardDevice \
|
|
StrictHostKeyChecking TCPKeepAlive Tunnel TunnelDevice \
|
|
UsePrivilegedPort User UserKnownHostsFile VerifyHostKeyDNS \
|
|
VisualHostKey XAuthLocation' -- "$cur" ) )
|
|
}
|
|
|
|
_ssh()
|
|
{
|
|
local cur prev configfile
|
|
local -a config
|
|
|
|
COMPREPLY=()
|
|
cur=`_get_cword :`
|
|
prev=${COMP_WORDS[COMP_CWORD-1]}
|
|
|
|
case "$prev" in
|
|
-F|-i|-S)
|
|
_filedir
|
|
return 0
|
|
;;
|
|
-c)
|
|
COMPREPLY=( $( compgen -W '3des-cbc aes128-cbc aes192-cbc \
|
|
aes256-cbc aes128-ctr aes192-ctr aes256-ctr arcfour128 \
|
|
arcfour256 arcfour blowfish-cbc cast128-cbc' -- "$cur" ) )
|
|
return 0
|
|
;;
|
|
-m)
|
|
COMPREPLY=( $( compgen -W 'hmac-md5 hmac-sha1 umac-64@openssh.com \
|
|
hmac-ripemd160 hmac-sha1-96 hmac-md5-96' -- "$cur" ) )
|
|
return 0
|
|
;;
|
|
-l)
|
|
COMPREPLY=( $( compgen -u -- "$cur" ) )
|
|
return 0
|
|
;;
|
|
-o)
|
|
_ssh_options
|
|
return 0
|
|
;;
|
|
-w)
|
|
_available_interfaces
|
|
return 0
|
|
;;
|
|
-b)
|
|
COMPREPLY=( $( compgen -W "$( PATH="$PATH:/sbin" ifconfig | \
|
|
sed -ne 's/.*addr:\([^[:space:]]*\).*/\1/p' )" -- "$cur" ) )
|
|
return 0
|
|
;;
|
|
esac
|
|
|
|
if [[ "$cur" == -F* ]]; then
|
|
cur=${cur#-F}
|
|
_filedir
|
|
# Prefix completions with '-F'
|
|
COMPREPLY=( "${COMPREPLY[@]/#/-F}" )
|
|
cur=-F$cur # Restore cur
|
|
elif [[ "$cur" == -* ]]; then
|
|
COMPREPLY=( $( compgen -W '-1 -2 -4 -6 -A -a -C -f -g -K -k -M \
|
|
-N -n -q -s -T -t -V -v -X -v -Y -y -b -b -c -D -e -F \
|
|
-i -L -l -m -O -o -p -R -S -w' -- "$cur" ) )
|
|
else
|
|
# Search COMP_WORDS for '-F configfile' or '-Fconfigfile' argument
|
|
set -- "${COMP_WORDS[@]}"
|
|
while [ $# -gt 0 ]; do
|
|
if [ "${1:0:2}" = -F ]; then
|
|
if [ ${#1} -gt 2 ]; then
|
|
configfile="$(dequote "${1:2}")"
|
|
else
|
|
shift
|
|
[ "$1" ] && configfile="$(dequote "$1")"
|
|
fi
|
|
break
|
|
fi
|
|
shift
|
|
done
|
|
_known_hosts_real -a -F "$configfile" "$cur"
|
|
if [ $COMP_CWORD -ne 1 ]; then
|
|
COMPREPLY=( "${COMPREPLY[@]}" $( compgen -c -- "$cur" ) )
|
|
fi
|
|
fi
|
|
|
|
return 0
|
|
}
|
|
shopt -u hostcomplete && complete -F _ssh ssh slogin autossh
|
|
|
|
# sftp(1) completion
|
|
#
|
|
_sftp()
|
|
{
|
|
local cur prev configfile
|
|
|
|
COMPREPLY=()
|
|
cur=`_get_cword`
|
|
prev=${COMP_WORDS[COMP_CWORD-1]}
|
|
|
|
case "$prev" in
|
|
-b|-F|-P)
|
|
_filedir
|
|
return 0
|
|
;;
|
|
-o)
|
|
_ssh_options
|
|
return 0
|
|
;;
|
|
esac
|
|
|
|
if [[ "$cur" == -F* ]]; then
|
|
cur=${cur#-F}
|
|
_filedir
|
|
# Prefix completions with '-F'
|
|
COMPREPLY=( "${COMPREPLY[@]/#/-F}" )
|
|
cur=-F$cur # Restore cur
|
|
elif [[ "$cur" == -* ]]; then
|
|
COMPREPLY=( $( compgen -W '-1 -C -v -B -b -F -o -P -R -S -s' \
|
|
-- "$cur" ) )
|
|
else
|
|
# 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
|
|
configfile="$(dequote "${1:2}")"
|
|
else
|
|
shift
|
|
[ "$1" ] && configfile="$(dequote "$1")"
|
|
fi
|
|
break
|
|
fi
|
|
shift
|
|
done
|
|
_known_hosts_real -a -F "$configfile" "$cur"
|
|
fi
|
|
|
|
return 0
|
|
}
|
|
shopt -u hostcomplete && complete -F _sftp sftp
|
|
|
|
|
|
# scp(1) completion
|
|
#
|
|
_scp()
|
|
{
|
|
local configfile cur userhost path prefix
|
|
|
|
COMPREPLY=()
|
|
cur=`_get_cword ":"`
|
|
|
|
_expand || return 0
|
|
|
|
# things we want to backslash escape
|
|
local esc="[][(){}<>\",:;^&\!$=?\`|\\ ']"
|
|
|
|
if [[ "$cur" == *:* ]]; then
|
|
local IFS=$'\t\n'
|
|
# remove backslash escape from the first colon
|
|
cur=${cur/\\:/:}
|
|
userhost=${cur%%?(\\):*}
|
|
path=${cur#*:}
|
|
# unescape (3 backslashes to 1 for chars we escaped)
|
|
path=$( sed -e 's/\\\\\\\('$esc'\)/\\\1/g' <<<"$path" )
|
|
if [ -z "$path" ]; then
|
|
# default to home dir of specified user on remote host
|
|
path=$(ssh -o 'Batchmode yes' $userhost pwd 2>/dev/null)
|
|
fi
|
|
# 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/'$esc'/\\\\\\&/g' -e 's/[*@|=]$//g' -e 's/[^\/]$/& /g' ) )
|
|
return 0
|
|
fi
|
|
|
|
if [[ "$cur" = -F* ]]; then
|
|
cur=${cur#-F}
|
|
prefix=-F
|
|
else
|
|
# Search COMP_WORDS for '-F configfile' or '-Fconfigfile' argument
|
|
set -- "${COMP_WORDS[@]}"
|
|
while [ $# -gt 0 ]; do
|
|
if [ "${1:0:2}" = -F ]; then
|
|
if [ ${#1} -gt 2 ]; then
|
|
configfile="$(dequote "${1:2}")"
|
|
else
|
|
shift
|
|
[ "$1" ] && configfile="$(dequote "$1")"
|
|
fi
|
|
break
|
|
fi
|
|
shift
|
|
done
|
|
|
|
[[ "$cur" == */* ]] || _known_hosts_real -c -a -F "$configfile" "$cur"
|
|
fi
|
|
# This approach is used instead of _filedir to get a space appended
|
|
# after local file/dir completions, and -o nospace retained for others.
|
|
local IFS=$'\t\n'
|
|
COMPREPLY=( "${COMPREPLY[@]}" $( command ls -aF1d $cur* 2>/dev/null | \
|
|
sed -e "s/$esc/\\\\&/g" -e 's/[*@|=]$//g' -e 's/[^\/]$/& /g' \
|
|
-e "s/^/$prefix/") )
|
|
|
|
return 0
|
|
}
|
|
complete -F _scp -o 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
|
|
return 0
|
|
;;
|
|
esac
|
|
|
|
if [[ "$cur" == -* ]]; then
|
|
COMPREPLY=( $( compgen -W '-i' -- "$cur" ) )
|
|
else
|
|
_known_hosts_real -a "$cur"
|
|
fi
|
|
|
|
return 0
|
|
}
|
|
complete -F _ssh_copy_id -o filenames ssh-copy-id
|
|
}
|
|
|
|
# Local variables:
|
|
# mode: shell-script
|
|
# sh-basic-offset: 4
|
|
# sh-indent-comment: t
|
|
# indent-tabs-mode: nil
|
|
# End:
|
|
# ex: ts=4 sw=4 et filetype=sh
|