Чи можливо отримати заповнення вкладки за допомогою sftp?


15

Іноді мені потрібно швидко скопіювати файл із віддаленого сервера на локальну машину. Ось мій поточний робочий процес:

  1. Я SSH на віддалений сервер, знаходжу файл і копіюю його повний шлях.
  2. Відкриваю нову вкладку терміналу і набираю:

sftp user@hostname:/path/to/file (де / шлях / до / файл - шлях, який я скопіював раніше)

Це не такий біль, але було б дуже приємно, якби я міг пропустити крок 1 і знайти шлях до файлу, використовуючи безпосередньо заповнення вкладки під час введення команди sftp.

Для ілюстрації я міг би почати набирати sftp user@hostname:/прес TABі отримати список папок у /. Тоді я міг би набрати друкарську hoмашину, TABі вона автоматично завершиться home, тощо.

Я не впевнений, чи існує така функція, і в іншому випадку, чи теоретично можливо написати спеціальний сценарій завершення вкладок, як описано? Будь-які вказівки, з чого почати?

Відповіді:


7

Завдяки відповіді шелхоліка, мені вдалося змусити (дещо) працювати за sftp. Спочатку створіть файл /etc/bash_completion.d/sftpіз таким вмістом:

# 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

Потім в bash вам потрібно виконати . /etc/bash_completion.d/sftp, щоб завантажити сценарій.

Все, що я насправді робив - це скопіювати / вставити скрипт завершення scp з /etc/bash_completion.d/sshта замінити випадки scp на sftp.


4

Інша альтернатива: використовувати lftpзамість цього, який має чудовий вбудований завершення вкладки (але це буде, як тільки ви запустите його, а не в оболонці.) Він може говорити sftp та багато інших протоколів.


2

Не використовуйте sftp, не використовуйте , scpі це працює. Вам знадобиться ключ ssh.


Дякую, мені вдалося змусити його працювати за sftp, використовуючи сценарій автоматичного завершення scp. Я намагаюсь максимально використовувати sftp, оскільки це повинно витіснити scp.
Олів'є Лалонде

вам насправді не потрібна пара ключів для scp, чи не так?
Нанна

1

Я чув , що програма під назвою з-Readline дозволить стандартної командного рядка програми OpenSSH SFTP використовувати автодоповнення. Я не можу перевірити, що він працює, але я хочу, щоб ця функція була вже багато років.

інформація про with-readline та sftp: http://www.greenend.org.uk/rjk/2005/withreadline.html

з посиланням для читання ліній: http://www.greenend.org.uk/rjk/2005/with-readline-0.1.tar.bz2

Дайте мені знати, як це працює для вас.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.