私はリモートサーバーから常に同じディレクトリにあるファイルを頻繁にダウンロードします。だから私はカスタム関数を書いて私の関数に入れました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_fi
TAB
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