È possibile ottenere il completamento della scheda con sftp?


15

A volte ho bisogno di copiare rapidamente un file dal mio server remoto sul mio computer locale. Ecco il mio flusso di lavoro attuale:

  1. SSH nel mio server remoto, trovo il file e copio il suo percorso completo.
  2. Apro la nuova scheda del terminale e digito:

sftp user@hostname:/path/to/file (dove / path / to / file è il percorso che ho copiato in precedenza)

Non è un problema, ma sarebbe davvero bello se potessi saltare il passaggio 1 e trovare il percorso del file usando il completamento della scheda direttamente durante la digitazione del comando sftp.

Per illustrare, potrei iniziare a digitare sftp user@hostname:/premere TABe ottenere un elenco di cartelle in /. Potrei quindi continuare a digitare hopremere TABe si completerebbe automaticamente su home, ecc. Ecc.

Non sono sicuro che tale funzionalità esista e in caso contrario, è teoricamente possibile scrivere uno script di completamento della scheda personalizzato come descritto? Qualche suggerimento su dove iniziare?

Risposte:


7

Grazie alla risposta di Shellholic, sono stato in grado di farlo funzionare (in qualche modo) per sftp. Innanzitutto, crea il file /etc/bash_completion.d/sftpcon il seguente contenuto:

# 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

Quindi in bash è necessario eseguire . /etc/bash_completion.d/sftpper caricare lo script.

Tutto quello che ho fatto è stato copiare / incollare lo script di completamento di SCP /etc/bash_completion.d/sshe sostituire le occorrenze di SCP con SFTP.


4

Un'altra alternativa: usare lftpinvece, che ha un superbo completamento della scheda integrato (ma sarà una volta che lo avvierai, non nella shell.) Può parlare sftp e molti altri protocolli.


2

Non usare sftp, usare scpe funziona. Avrai bisogno di una chiave ssh.


Grazie, sono stato effettivamente in grado di farlo funzionare per sftp usando lo script di completamento automatico di scp. Sto cercando di usare sftp il più possibile perché dovrebbe sostituire scp.
Olivier Lalonde,

non hai davvero bisogno di una coppia di chiavi per scp, vero?
Nanne,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.