Czy można uzyskać uzupełnienie tabulacji za pomocą sftp?

15

Czasami muszę szybko skopiować plik ze zdalnego serwera na komputer lokalny. Oto mój obecny obieg pracy:

  1. SSH do mojego zdalnego serwera, znajdź plik i skopiuj pełną ścieżkę.
  2. Otwieram nową kartę terminala i wpisuję:

sftp user@hostname:/path/to/file (gdzie / path / to / file to ścieżka, którą wcześniej skopiowałem)

To nie jest taki ból, ale byłoby naprawdę miło, gdybym mógł pominąć krok 1 i znaleźć ścieżkę do pliku za pomocą uzupełniania tabulatorów bezpośrednio po wpisaniu polecenia sftp.

Aby to zilustrować, mógłbym zacząć pisać w sftp user@hostname:/prasie TABi uzyskać listę folderów w /. Mógłbym następnie przejść do typowania hoprasie TABi to by autouzupełnianie do homeitp itd.

Nie jestem pewien, czy taka funkcja istnieje, a poza tym, czy teoretycznie jest możliwe napisanie niestandardowego skryptu uzupełniania tabulatorów zgodnie z opisem? Jakieś wskazówki, od czego zacząć?

Olivier Lalonde
źródło

Odpowiedzi:

7

Dzięki odpowiedzi shellholic udało mi się (w pewnym stopniu) sprawić, by działało dla sftp. Najpierw utwórz plik /etc/bash_completion.d/sftpo następującej treści:

# 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

Następnie w bash musisz wykonać . /etc/bash_completion.d/sftp, aby załadować skrypt.

Wszystko, co naprawdę zrobiłem, to skopiowanie / wklejenie skryptu ukończenia scp /etc/bash_completion.d/sshi zastąpienie wystąpień scp sftp.

Olivier Lalonde
źródło
4

Inna alternatywa: użyj lftpzamiast tego, która ma doskonałe wbudowane uzupełnianie tabulatorów (ale będzie to po uruchomieniu, nie w powłoce). Może mówić o sftp i wielu innych protokołach.

poolie
źródło
2

Nie używaj sftp, używaj scpi działa. Będziesz potrzebował klucza ssh.

shellholic
źródło
Dzięki, udało mi się sprawić, że będzie działać dla sftp za pomocą skryptu automatycznego uzupełniania scp. Staram się używać sftp w jak największym stopniu, ponieważ ma to zastąpić scp.
Olivier Lalonde
tak naprawdę nie potrzebujesz pary kluczy do scp, prawda?
Nanne