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


15

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

  1. Eu SSH no meu servidor remoto, localize o arquivo e copie seu caminho completo.
  2. Abro uma nova guia do terminal e digito:

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

Não é tão trabalhoso, mas seria muito bom pular a etapa 1 e encontrar o caminho para o arquivo usando o preenchimento de tabulação diretamente ao digitar o comando sftp.

Para ilustrar, eu poderia começar a digitar sftp user@hostname:/pressione TABe obter uma lista de pastas em /. Eu poderia então digitar a hoimprensa TABe ela seria concluída automaticamente home, etc. etc.

Não tenho certeza se esse recurso existe e, caso contrário, é teoricamente possível escrever um script de conclusão de guia personalizado, conforme descrito? Alguma dica de onde começar?

Respostas:


7

Graças à resposta do shellholic, eu consegui fazê-lo (um pouco) funcionar para o sftp. Primeiro, crie o arquivo /etc/bash_completion.d/sftpcom o seguinte conteúdo:

# 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

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

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


4

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


2

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


Obrigado, consegui fazê-lo funcionar para o sftp usando o script de conclusão automática do scp. Estou tentando usar o sftp, tanto quanto possível, como ele deveria substituir o scp.
precisa

você realmente não precisa de um par de chaves para o scp, precisa?
Nanne

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.