Sftp ile sekme tamamlama mümkün mü?


15

Bazen bir dosyayı uzak sunucumdan yerel makineme hızlı bir şekilde kopyalamam gerekir. İşte mevcut iş akışım:

  1. SSH'yi uzak sunucuma gönder, dosyayı bul ve tam yolunu kopyala.
  2. Yeni terminal sekmesini açıyorum ve şunu yazıyorum:

sftp user@hostname:/path/to/file (burada / path / to / file daha önce kopyaladığım yoldur)

Böyle bir acı değil ama adım 1'i atlayabilir ve sftp komutunu yazarken doğrudan sekme tamamlamayı kullanarak dosyanın yolunu bulabilirsem gerçekten güzel olurdu.

Göstermek için, sftp user@hostname:/basmaya başlayabilir TABve / içindeki klasörlerin bir listesini alabilirim. Sonra hobasın yazmaya devam edebilir TABve homevb. İçin otomatik tamamlanır .

Böyle bir özellik var mı emin değilim ve aksi takdirde, teorik olarak tarif edildiği gibi bir özel sekme tamamlama komut dosyası yazmak mümkün mü? Nereden başlayacağınıza dair herhangi bir işaretçi var mı?

Yanıtlar:


7

Shellholic'in cevabı sayesinde, bir şekilde sftp için çalıştırabildim. İlk olarak, dosyayı /etc/bash_completion.d/sftpaşağıdaki içerikle oluşturun:

# 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

Daha sonra bash'da . /etc/bash_completion.d/sftpkomut dosyasını yüklemek için yürütmeniz gerekir .

Gerçekten yaptığım scp tamamlama komut dosyasını kopyalayın / yapıştırın /etc/bash_completion.d/sshve scp oluşumlarını sftp ile değiştirin.


4

Başka bir alternatif: lftpsekme tamamlamada mükemmel bir şekilde yerleşik olan kullanın (ancak kabukta değil, başlattığınızda bir kez olacaktır.) Sftp ve diğer birçok protokolden bahsedebilir.


2

Kullanmayın sftp, kullanın scpve işe yarıyor. Bir ssh anahtarına ihtiyacınız olacak.


Teşekkürler, aslında scp'nin otomatik tamamlama komut dosyasını kullanarak sftp için çalışmasını başardım. Ben scp yerine olması gerektiği gibi sftp mümkün olduğunca kullanmaya çalışıyorum.
Olivier Lalonde

scp için gerçekten bir anahtar çiftine ihtiyacınız yok, değil mi?
Nanne

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.