it-swarm.com.de

Ist es möglich, mit sftp eine Tab-Vervollständigung zu erhalten?

Manchmal muss ich eine Datei schnell von meinem Remote-Server auf meinen lokalen Computer kopieren. Hier ist mein aktueller Workflow:

  1. Ich stelle eine SSH-Verbindung zu meinem Remote-Server her, suche die Datei und kopiere den vollständigen Pfad.
  2. Ich öffne einen neuen Terminal-Tab und tippe:

sftp [email protected]:/path/to/file (wobei/path/to/file der Pfad ist, den ich zuvor kopiert habe)

Es ist nicht so schmerzhaft, aber es wäre wirklich schön, wenn ich Schritt 1 überspringen und den Pfad zur Datei mithilfe der Tabulatorvervollständigung direkt finden könnte, wenn ich den Befehl sftp eingebe.

Zur Veranschaulichung könnte ich sftp [email protected]:/ drücken TAB und eine Liste der Ordner in/erhalten. Ich könnte dann weiter ho drücken TAB und es würde automatisch zu home usw. usw. vervollständigen.

Ich bin nicht sicher, ob eine solche Funktion vorhanden ist. Ist es ansonsten theoretisch möglich, ein benutzerdefiniertes Skript zum Vervollständigen von Registerkarten wie beschrieben zu schreiben? Gibt es Hinweise, wo Sie anfangen sollen?

15
Olivier Lalonde

Dank Shellholics Antwort konnte ich dafür sorgen, dass es für SFTP (etwas) funktioniert. Erstellen Sie zunächst die Datei /etc/bash_completion.d/sftp mit folgendem Inhalt:

# 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

Dann müssen Sie in der Bash . /etc/bash_completion.d/sftp ausführen, um das Skript zu laden.

Alles, was ich wirklich getan habe, war das scp-Vervollständigungsskript aus /etc/bash_completion.d/ssh zu kopieren/einzufügen und scp-Vorkommen durch sftp zu ersetzen.

7
Olivier Lalonde

Eine andere Alternative: Verwenden Sie stattdessen lftp, das über eine hervorragende integrierte Registerkartenvervollständigung verfügt (dies geschieht jedoch erst, wenn Sie es starten, nicht in der Shell.) Es kann SFTP und viele andere Protokolle sprechen.

4
poolie

Verwenden Sie nicht sftp, verwenden Sie scp und es funktioniert. Sie benötigen einen SSH-Schlüssel.

2
shellholic

Ich habe gehört, dass ein Programm mit dem Namen with-readline dem Standard-OpenSSH-Befehlszeilenprogramm sftp die Verwendung der Tabulatorvervollständigung ermöglicht. Ich kann nicht überprüfen, ob es funktioniert, aber ich möchte seit Jahren die gleiche Funktionalität.

infos zu with-readline und sftp: http://www.greenend.org.uk/rjk/2005/withreadline.html

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

Lassen Sie mich wissen, wie es bei Ihnen funktioniert.

1
Harvey