Có thể có được hoàn thành tab với sftp?


15

Đôi khi tôi cần nhanh chóng sao chép một tập tin từ máy chủ từ xa vào máy cục bộ của mình. Đây là quy trình làm việc hiện tại của tôi:

  1. Tôi SSH vào máy chủ từ xa của mình, tìm tệp và sao chép đường dẫn đầy đủ của nó.
  2. Tôi mở tab thiết bị đầu cuối mới và gõ:

sftp user@hostname:/path/to/file (trong đó / path / to / file là đường dẫn tôi đã sao chép trước đó)

Đó không phải là một nỗi đau nhưng sẽ rất tuyệt nếu tôi có thể bỏ qua bước 1 và tìm đường dẫn đến tệp bằng cách hoàn thành tab trực tiếp khi gõ lệnh sftp.

Để minh họa, tôi có thể bắt đầu nhập sftp user@hostname:/nhấn TABvà nhận danh sách các thư mục trong /. Sau đó tôi có thể tiếp tục gõ honhấn TABvà nó sẽ tự động hoàn thành home, v.v.

Tôi không chắc liệu một tính năng như vậy có tồn tại hay không, về mặt lý thuyết có thể viết một kịch bản hoàn thành tab tùy chỉnh như được mô tả không? Bất kỳ con trỏ về nơi bắt đầu?

Câu trả lời:


7

Nhờ câu trả lời của shellholic, tôi đã có thể làm cho nó (phần nào) hoạt động cho sftp. Đầu tiên, tạo tập tin /etc/bash_completion.d/sftpvới nội dung sau:

# 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

Sau đó, trong bash, bạn cần phải thực thi . /etc/bash_completion.d/sftpđể tải tập lệnh.

Tất cả những gì tôi thực sự làm là sao chép / dán tập lệnh hoàn thành scp từ /etc/bash_completion.d/sshvà thay thế các lần xuất hiện của scp bằng sftp.


4

Một cách khác: sử dụng lftpthay thế, có hoàn thành tab được xây dựng tuyệt vời (nhưng đó sẽ là một khi bạn khởi động nó, không phải trong vỏ.) Nó có thể nói chuyện sftp và nhiều giao thức khác.


2

Đừng sử dụng sftp, sử dụng scpvà nó hoạt động. Bạn sẽ cần một khóa ssh.


Cảm ơn, tôi thực sự đã có thể làm cho nó hoạt động cho sftp bằng cách sử dụng tập lệnh hoàn thành tự động của scp. Tôi đang cố gắng sử dụng sftp càng nhiều càng tốt vì nó được cho là thay thế scp.
Olivier Lalonde

bạn không thực sự cần một cặp chìa khóa cho scp, phải không?
Nanne

1

Tôi nghe nói rằng một chương trình có tên -readline sẽ cho phép sftp chương trình dòng lệnh OpenSSH tiêu chuẩn sử dụng hoàn thành tab. Tôi không thể xác minh rằng nó hoạt động, nhưng tôi đã muốn chức năng tương tự trong nhiều năm nay.

thông tin về-readline và sftp: http://www.greenend.org.uk/rjk/2005/withreadline.html

liên kết với readline: http://www.greenend.org.uk/rjk/2005/with-readline-0.1.tar.bz2

Hãy cho tôi biết làm thế nào nó hoạt động cho bạn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.