sftpでタブ補完を取得することは可能ですか?


15

リモートサーバーからローカルマシンにファイルをすばやくコピーする必要がある場合があります。現在のワークフローは次のとおりです。

  1. リモートサーバーにSSHで接続し、ファイルを見つけてそのフルパスをコピーします。
  2. 新しいターミナルタブを開いて、次のように入力します。

sftp user@hostname:/path/to/file (/ path / to / fileは以前にコピーしたパスです)

それほど苦痛ではありませんが、sftpコマンドを入力するときに、ステップ1をスキップして、タブ補完を使用してファイルへのパスを直接検索できれば、本当に便利です。

たとえば、「sftp user@hostname:/press」TABと入力して、/にあるフォルダーのリストを取得できます。その後、入力をho押し続けるTABhome、などに自動補完されます。

そのような機能が存在するかどうかはわかりませんが、そうでなければ、説明されているようにカスタムタブ補完スクリプトを書くことは理論的に可能ですか?どこから始めたらいいですか?

回答:


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/sshscpの出現をsftpに置き換えることだけでした。


4

別の代替方法:lftp代わりに使用します。タブ補完が組み込まれています(ただし、シェルではなく起動するとすぐに使用できます)。sftpや他の多くのプロトコルと通信できます。


2

使用しないでくださいsftp、使用してscp、それが動作します。sshキーが必要になります。


おかげで、実際にはscpの自動補完のスクリプトを使用してsftpで動作させることができました。私は、scpに取って代わると考えられる限り、できるだけsftpを使用しようとしています。
オリビエラロンド

あなたは本当に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

どのように機能するか教えてください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.