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

15

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 user@hostname:/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 mit der Eingabe von sftp user@hostname:/press beginnen TABund eine Liste der Ordner in / erhalten. Ich könnte dann weiter hodrücken TABund es würde sich automatisch vervollständigen homeusw. usw.

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?

Olivier Lalonde
quelle

Antworten:

7

Dank Shellholics Antwort konnte ich dafür sorgen, dass es (etwas) für SFTP funktioniert. Erstellen Sie zunächst die Datei /etc/bash_completion.d/sftpmit dem folgenden 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 Bash ausführen . /etc/bash_completion.d/sftp, um das Skript zu laden.

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

Olivier Lalonde
quelle
4

Eine andere Alternative: Verwenden Sie lftpstattdessen, die über eine hervorragende integrierte Registerkartenvervollständigung verfügt (diese wird jedoch ausgeführt, sobald Sie sie starten, und nicht in der Shell.) Sie kann SFTP und viele andere Protokolle unterstützen.

Poolie
quelle
2

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

Shellholic
quelle
Danke, ich war tatsächlich in der Lage, es mit dem Skript der automatischen Vervollständigung von scp für sftp zum Laufen zu bringen. Ich versuche, sftp so oft wie möglich zu verwenden, um scp zu ersetzen.
Olivier Lalonde
Sie brauchen wirklich kein Schlüsselpaar für SCP, oder?
Nanne
1

Ich habe gehört, dass ein Programm mit dem Namen with-readline es dem Standard-OpenSSH-Befehlszeilenprogramm sftp ermöglicht , die Tabulatorvervollständigung zu verwenden. 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.

Harvey
quelle