Apakah mungkin untuk mendapatkan penyelesaian tab dengan sftp?

15

Kadang-kadang saya perlu dengan cepat menyalin file dari server jauh ke mesin lokal saya. Inilah alur kerja saya saat ini:

  1. Saya SSH ke server jauh saya, cari file dan salin path lengkapnya.
  2. Saya membuka tab terminal dan ketik:

sftp user@hostname:/path/to/file (di mana / path / ke / file adalah jalur yang sebelumnya saya salin)

Ini tidak terlalu menyakitkan, tetapi akan sangat menyenangkan jika saya bisa melewati langkah 1 dan menemukan path ke file menggunakan penyelesaian tab secara langsung ketika mengetik perintah sftp.

Sebagai ilustrasi, saya bisa mulai mengetikkan sftp user@hostname:/pers TABdan mendapatkan daftar folder di /. Saya kemudian bisa terus mengetik hopers TABdan itu akan auto-lengkap untuk home, dll dll

Saya tidak yakin apakah fitur tersebut ada dan sebaliknya, apakah secara teori dimungkinkan untuk menulis skrip penyelesaian tab khusus seperti yang dijelaskan? Adakah petunjuk di mana untuk memulai?

Olivier Lalonde
sumber

Jawaban:

7

Berkat jawaban shellholic, saya bisa membuatnya (agak) bekerja untuk sftp. Pertama, buat file /etc/bash_completion.d/sftpdengan konten berikut:

# custom sftp(1) based on scp
# see http://askubuntu.com/questions/14645/is-it-possible-to-get-tab-completion-with-sftp
#
_sftp()
{
    local configfile cur userhost path prefix

    COMPREPLY=()
    cur=`_get_cword ":"`

    _expand || return 0

    if [[ "$cur" == *:* ]]; then
        local IFS=$'\t\n'
        # remove backslash escape from :
        cur=${cur/\\:/:}
        userhost=${cur%%?(\\):*}
        path=${cur#*:}
        # unescape spaces
        path=${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/[][(){}<>\",:;^&\!$=?\`|\\ ']/\\\\\\\\\\\\&/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 $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' -e "s/^/$prefix/") )

    return 0
}
complete -o nospace -F _sftp sftp

Kemudian dalam bash Anda harus menjalankan . /etc/bash_completion.d/sftpuntuk memuat skrip.

Yang benar-benar saya lakukan adalah menyalin / menempelkan skrip penyelesaian scp dari /etc/bash_completion.d/sshdan mengganti kejadian scp dengan sftp.

Olivier Lalonde
sumber
4

Alternatif lain: gunakan lftpsaja, yang memiliki penyelesaian tab bawaan yang luar biasa (tapi itu akan menjadi begitu Anda memulainya, bukan di shell.) Ia dapat berbicara sftp dan banyak protokol lainnya.

Poolie
sumber
2

Jangan gunakan sftp, gunakan scpdan itu berfungsi. Anda akan membutuhkan kunci ssh.

shellholic
sumber
Terima kasih, saya sebenarnya bisa membuatnya bekerja untuk sftp menggunakan skrip penyelesaian otomatis scp. Saya mencoba menggunakan sftp sebanyak mungkin yang seharusnya menggantikan scp.
Olivier Lalonde
Anda tidak benar-benar membutuhkan pasangan kunci untuk scp, bukan?
Nanne
1

Saya mendengar bahwa sebuah program bernama with-readline akan memungkinkan program baris perintah OpenSSH standar sftp untuk memanfaatkan penyelesaian tab. Saya tidak dapat memverifikasi bahwa itu berfungsi, tetapi saya sudah menginginkan fungsi yang sama selama bertahun-tahun sekarang.

info tentang dengan-readline dan sftp: http://www.greenend.org.uk/rjk/2005/withreadline.html

dengan-readline tautan: http://www.greenend.org.uk/rjk/2005/with-readline-0.1.tar.bz2

Biarkan saya tahu cara kerjanya untuk Anda.

Harvey
sumber