__complete_ssh_host() {
    local ssh_known_file ssh_known_list partial_word
    ssh_known_file="${HOME}/.ssh/known_hosts"
    [[ -r "${ssh_known_file}" ]] || return 1
    ssh_known_list=$(awk '{print $1}' "${HOME}"/.ssh/known_hosts | tr ',' '\n' | sort | uniq)
    partial_word="${COMP_WORDS[COMP_CWORD]}";
    mapfile -t COMPREPLY < <(compgen -W "${ssh_known_list}" -- "${partial_word}")
    return 0
}

complete -F __complete_ssh_host ssh
complete -f -F __complete_ssh_host scp