sftp로 탭 완성이 가능합니까? 원격 서버에서 로컬 컴퓨터로 파일을 빠르게

때로는 원격 서버에서 로컬 컴퓨터로 파일을 빠르게 복사해야합니다. 내 현재 워크 플로는 다음과 같습니다.

  1. 원격 서버에 SSH로 연결하여 파일을 찾고 전체 경로를 복사합니다.
  2. 새 터미널 탭을 열고 다음을 입력하십시오.

sftp user@hostname:/path/to/file (여기서 / path / to / file은 이전에 복사 한 경로입니다)

그런 고통은 아니지만 sftp 명령을 입력 할 때 1 단계를 건너 뛰고 탭 완성을 사용하여 파일의 경로를 찾을 수 있다면 정말 좋을 것입니다.

예를 들어, sftp user@hostname:/press를 입력 TAB하고 /에 폴더 목록을 가져올 수 있습니다. 그런 다음 ho프레스 를 계속 입력 하면 등으로 TAB자동 완성됩니다 home.

이러한 기능이 존재하는지 확실하지 않은 경우 이론적으로 사용자 정의 탭 완성 스크립트를 작성하는 것이 가능합니까? 어디서부터 시작해야합니까?



답변

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/sshscp 발생을 sftp로 바꾸는 것입니다.


답변

또 다른 대안 : lftp대신 탭 완성 기능이 내장 된 대신 사용 하십시오 (그러나 쉘에서 시작하지 않고 일단 시작하면됩니다). 그것은 sftp 및 다른 많은 프로토콜과 대화 할 수 있습니다.


답변

사용하지 마십시오 sftp, 사용 scp과 작동합니다. ssh 키가 필요합니다.


답변

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

그것이 당신을 위해 어떻게 작동하는지 알려주세요.