Ssh

sshpass 的 zsh 補全

  • July 14, 2020

我正在使用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設置$statecommand並在下面繼續執行。
  • _normalfor 在第一個非選項參數之後的參數使它們完成,就好像命令行以第一個非選項參數開始一樣。::after指示 zsh從*第一個非選項參數中剝離選項。
  • 對於命令名稱,請嘗試完成傳遞給的名稱compadd(如果需要,您可以添加更多名稱)。如果失敗,請填寫任何命令名稱。

引用自:https://unix.stackexchange.com/questions/597966