Ssh
sshpass 的 zsh 補全
我正在使用
sshpass
這樣的命令:sshpass -p 'my_password' ssh user@server
根據手冊頁,完整的語法是
sshpass [-ffilename|-dnum|-ppassword|-e] [options] command arguments
目前,zsh 沒有任何完成規則
sshpass
。如何創建簡單的完成規則,以便一旦我到達“命令”和“參數”,命令的 ssh 完成並且 user@host 的完成與標準 ssh 的完成相同?
您可以從具有類似語法的命令中獲得靈感,例如
sudo
,它還採用選項後跟命令名稱及其選項。有關編寫 zsh 補全的介紹,另請參閱自定義命令的動態 zsh 自動補全。將以下程式碼放入
_sshpass
您的$fpath
. (有關zsh如何獲取完成功能的更多詳細資訊,請參閱如何正確地使自定義 zsh 完成“正常工作”? )#compdef sshpass _sshpass () { local context state line typeset -A opt_args _arguments \ '(-d -e -f -p)-d+[read password from file descriptor]:file descriptor:_file_descriptors' \ '(-d -e -f -p)-e[take password from $SSHPASS]' \ '(-d -e -f -p)-f+[read password from file]:file:_files' \ '(-d -e -f -p)-p+[actual password]::' \ '(-)1:command:->command' \ '*::arguments: _normal' \ && return case $state in (command) if ((CURRENT == 2)); then # Insist that the first argument must be an option compadd -- -d -e -f -p else compadd ssh || _command_names -e fi ;; esac } _sshpass "$@"
簡要說明:
_arguments
為帶有選項的命令安排完成。- 選項
-d
、-e
和是互斥的-f
。指定完成並聲明如果選項、或之一已經存在,則不應提供此功能。-p``(-d -e -f -p)-d…``-d``-d``-e``-f``-p
-d+
表示-d
其參數之間的空格是可選的。->command
將第一個參數_arguments
設置$state
為command
並在下面繼續執行。_normal
for 在第一個非選項參數之後的參數使它們完成,就好像命令行以第一個非選項參數開始一樣。::
after指示 zsh從*
第一個非選項參數中剝離選項。- 對於命令名稱,請嘗試完成傳遞給的名稱
compadd
(如果需要,您可以添加更多名稱)。如果失敗,請填寫任何命令名稱。