Est-il possible de terminer la tabulation avec sftp?

15

Parfois, j'ai besoin de copier rapidement un fichier de mon serveur distant vers ma machine locale. Voici mon flux de travail actuel:

  1. Je SSH dans mon serveur distant, trouve le fichier et copie son chemin complet.
  2. J'ouvre un nouvel onglet de terminal et saisis:

sftp user@hostname:/path/to/file (où / chemin / vers / fichier est le chemin que j'ai précédemment copié)

Ce n'est pas une telle douleur, mais ce serait vraiment bien si je pouvais ignorer l'étape 1 et trouver le chemin d'accès au fichier en utilisant la tabulation directement lors de la frappe de la commande sftp.

Pour illustrer, je pourrais commencer à taper sftp user@hostname:/press TABet obtenir une liste des dossiers dans /. Je pourrais alors continuer à taper la hopresse TABet elle se compléterait automatiquement home, etc., etc.

Je ne sais pas si une telle fonctionnalité existe et sinon, est-il théoriquement possible d'écrire un script de complétion d'onglet personnalisé comme décrit? Des conseils sur où commencer?

Olivier Lalonde
la source

Réponses:

7

Grâce à la réponse de shellholic, j'ai pu le faire (quelque peu) fonctionner pour sftp. Créez d'abord le fichier /etc/bash_completion.d/sftpavec le contenu suivant:

# 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

Ensuite, dans bash, vous devez exécuter . /etc/bash_completion.d/sftpafin de charger le script.

Tout ce que j'ai vraiment fait, c'est copier / coller le script d'achèvement de scp /etc/bash_completion.d/sshet remplacer les occurrences de scp par sftp.

Olivier Lalonde
la source
4

Une autre alternative: utilisez lftpplutôt, qui a une superbe finition de tabulation intégrée (mais ce sera une fois que vous le lancerez, pas dans le shell.) Il peut parler de sftp et de nombreux autres protocoles.

poolie
la source
2

N'utilisez pas sftp, utilisez scpet ça marche. Vous aurez besoin d'une clé ssh.

shellholic
la source
Merci, j'ai pu le faire fonctionner pour sftp en utilisant le script de complétion automatique de scp. J'essaie d'utiliser sftp autant que possible car il est censé remplacer scp.
Olivier Lalonde
vous n'avez pas vraiment besoin d'une paire de clés pour scp, n'est-ce pas?
Nanne
1

J'entends qu'un programme appelé with-readline permettra au programme de ligne de commande OpenSSH standard sftp d'utiliser la complétion de tabulation. Je ne peux pas vérifier que cela fonctionne, mais je veux cette même fonctionnalité depuis des années maintenant.

informations sur with-readline et sftp: http://www.greenend.org.uk/rjk/2005/withreadline.html

lien avec ligne de lecture: http://www.greenend.org.uk/rjk/2005/with-readline-0.1.tar.bz2

Faites moi savoir comment ça marche pour vous.

Harvey
la source