Bash 远程自动完成:更改“起始”目录

Bash 远程自动完成:更改“起始”目录

我经常从远程服务器下载文件,总是从同一目录下载。所以我编写了一个自定义函数并将其放入我的bashrc

download_from_myserver () {
    for file in "$@"
    do
        rsync myserver:/home/pierre/downloads/"$file" .
    done
}

目前,自动补全功能默认适用于当前目录中的文件。我想更改自动完成功能,以便 bash 自动连接到服务器,ssh并自动完成myserver:/home/pierre/downloads/.

如果我不清楚,这里有一个例子:假设我my_file.txt在远程目录中,我希望能够执行以下操作:

download_from_my_server my_fiTAB
download_from_my_server my_file.txt

我该怎么做?

注意:我已经在使用无密码连接,rsync 和 scp 自动完成工作正常,这不是问题。如果这很重要的话,我在两台机器上都使用 Ubuntu。

答案1

编辑: 又切了一些。

您可能会发现这很有用,来自 Debian Administration:bash补全简介


完整脚本:(/some/location/my_ssh_autocomplete_script仅作为简短的启动):

#!/bin/bash

_get_rsync_file_list()
{
    # For test:
    #local -a flist=("foo" "bar")
    #printf "%s " "${flist[@]}"
    # Or:
    ls /tmp
    
    # For live something in direction of:
    #ssh user@host 'ls /path/to/dir' <-- but not ls for other then dirty testing.
}

_GetOptSSH()
{
    local cur

    COMPREPLY=()
    cur="${COMP_WORDS[COMP_CWORD]}"

    case "$cur" in
    -*)
        COMPREPLY=( $( compgen -W '-h --help' -- "$cur" ) );;
    *)
        # This could be done nicer I guess:
        COMPREPLY=( $( compgen -W "$(_get_rsync_file_list)" -- "$cur" ) );;
    esac

    return 0
}

下载脚本/some/location/my_ssh_download_script

#!/bin/bash

server="myserver"
path="/home/pierre/downloads"

download_from_myserver() {
    for file; do
        rsync "$server:$path/$file"
    done
}

case "$1" in
    "-h"|"--help")
        echo "Download files from '$server', path: '$path'" >&2
        exit 0;;
esac

download_from_myserver "$@"

.bash_aliases

alias download_from_myserver='/some/location/my_ssh_download_script'

.bash_completion

# Source complete script:
if . "/some/location/my_ssh_autocomplete_script" >/dev/null 2>&1; then
    # Add complete function to download alias:
    complete -F _GetOptSSH download_from_myserver
fi

相关内容