Можно ли получить завершение табуляции с помощью sftp?

15

Иногда мне нужно быстро скопировать файл с моего удаленного сервера на мой локальный компьютер. Вот мой текущий рабочий процесс:

  1. Я SSH в мой удаленный сервер, найти файл и скопировать его полный путь.
  2. Я открываю новую вкладку терминала и набираю:

sftp user@hostname:/path/to/file (где / path / to / file - путь, который я ранее скопировал)

Это не такая большая проблема, но было бы здорово, если бы я мог пропустить шаг 1 и найти путь к файлу, используя завершение табуляции непосредственно при вводе команды sftp.

Чтобы проиллюстрировать это, я мог бы начать печатать sftp user@hostname:/пресс TABи получить список папок в /. Тогда я мог бы пойти на типизации hoпрессе TABи было бы автозаполнение homeи т.д. и т.п.

Я не уверен, существует ли такая функция, и в противном случае, теоретически возможно ли написать собственный скрипт завершения вкладки, как описано? Любые указатели на то, с чего начать?

Оливье Лалонд
источник

Ответы:

7

Благодаря ответу Shellholic, я смог заставить его (в некоторой степени) работать на 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 и многим другим протоколам.

poolie
источник
2

Не используйте sftp, используйте scpи это работает. Вам понадобится ключ SSH.

shellholic
источник
Спасибо, я действительно смог заставить его работать на sftp, используя скрипт автозаполнения scp. Я пытаюсь использовать sftp настолько, насколько это возможно, так как он должен заменить scp.
Оливье Лалондэ
вам не нужна пара ключей для scp, не так ли?
Нанн
1

Я слышал, что программа with-readline позволит стандартной программе командной строки OpenSSH sftp использовать завершение табуляции. Я не могу убедиться, что это работает, но я хотел ту же самую функциональность в течение многих лет.

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

with-readline ссылка: http://www.greenend.org.uk/rjk/2005/with-readline-0.1.tar.bz2

Дайте мне знать, как это работает для вас.

Харви
источник