É possível obter a conclusão da tabulação com o sftp?

14

Às vezes, preciso copiar rapidamente um arquivo do meu servidor remoto para minha máquina local. Aqui está o meu fluxo de trabalho atual:

  1. Eu faço SSH no meu servidor remoto, localizo o arquivo e copio seu caminho completo.
  2. Eu abro a nova guia do terminal e digito:

sftp user@hostname:/path/to/file (onde / caminho / para / arquivo é o caminho que eu copiei anteriormente)

Não é um problema, mas seria muito bom se eu pudesse pular a etapa 1 e encontrar o caminho para o arquivo usando a conclusão da tabulação diretamente ao digitar o comando sftp.

Para ilustrar, eu poderia começar a digitar sftp user@hostname:/ press TAB e obter uma lista de pastas em /. Eu poderia então continuar digitando ho press TAB e ele completaria automaticamente em home , etc. etc.

Não tenho certeza se esse recurso existe e, do contrário, é teoricamente possível escrever um script de conclusão de tabulação personalizada conforme descrito? Quaisquer indicações sobre por onde começar?

    
por Olivier Lalonde 24.11.2010 / 02:17

4 respostas

7

Graças à resposta da shellholic, eu consegui fazer (um pouco) funcionar para o sftp. Primeiro, crie o arquivo /etc/bash_completion.d/sftp com o seguinte conteúdo:

# custom sftp(1) based on scp
# see https://sobrelinux.info/questions/8249/is-it-possible-to-get-tab-completion-with-sftp":"'

    _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
                    [ "" ] && configfile="$(dequote "")"
                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

Em seguida, no bash, você precisa executar . /etc/bash_completion.d/sftp para carregar o script.

Tudo o que eu realmente fiz foi copiar / colar o script de conclusão do scp de /etc/bash_completion.d/ssh e substituir as ocorrências do scp pelo sftp.

    
por Olivier Lalonde 24.11.2010 / 03:41
3

Outra alternativa: use lftp em vez disso, que tenha uma excelente complementação de tabulação (mas será assim que você iniciar, não no shell). Ele pode falar sobre sftp e muitos outros protocolos.

    
por poolie 24.11.2010 / 08:39
2

Não use sftp , use scp e funcione. Você precisará de uma chave ssh.

    
por shellholic 24.11.2010 / 03:08
1

Ouvi dizer que um programa chamado with-readline permitirá que o programa de linha de comando sftp do OpenSSH utilize a conclusão da tabulação. Não consigo verificar se funciona, mas estou querendo a mesma funcionalidade há anos.

informações sobre com readline e sftp:       link

com link de linha de leitura:       link

Deixe-me saber como isso funciona para você.

    
por Harvey 23.08.2011 / 12:56