เป็นไปได้ไหมที่จะรับแท็บที่เสร็จสมบูรณ์ด้วย 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 และโปรโตคอลอื่น ๆ อีกมากมาย


2

อย่าใช้sftpใช้scpและใช้งานได้ คุณจะต้องมีคีย์ ssh


ขอบคุณฉันจริงสามารถทำให้ sftp โดยใช้สคริปต์การทำให้สมบูรณ์อัตโนมัติของ scp ฉันพยายามที่จะใช้ SFTP ให้มากที่สุดเท่าที่ควรจะแทนที่ SCP
Olivier Lalonde

คุณไม่ต้องการคู่คีย์สำหรับ scp จริงไหม
Nanne

1

ฉันได้ยินว่าโปรแกรมที่เรียกว่าwith-readlineจะอนุญาตให้โปรแกรมบรรทัดคำสั่ง OpenSSH มาตรฐานsftpใช้ประโยชน์จากความสมบูรณ์ของแท็บ ฉันไม่สามารถตรวจสอบว่ามันใช้งานได้ แต่ฉันต้องการฟังก์ชั่นเดิมมาหลายปีแล้ว

ข้อมูลเกี่ยวกับ with-readline และ sftp: http://www.greenend.org.uk/rjk/2005/withreadline.html

พร้อมลิงค์ readline: http://www.greenend.org.uk/rjk/2005/with-readline-0.1.tar.bz2

แจ้งให้เราทราบวิธีการทำงานสำหรับคุณ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.