
私はsshpass
次のコマンドを使用しています。
sshpass -p 'my_password' ssh user@server
マニュアルページによると、完全な構文は次のとおりです。
sshpass [-ffilename|-dnum|-ppassword|-e] [options] command arguments
現在、zshには完了ルールはありませんsshpass
。 「コマンド」と「パラメータ」に達すると、コマンドのsshが完了し、user@hostの完了が標準sshの完了と等しくなるように、単純な完了ルールをどのように作成できますか?
答え1
次のような類似の構文を使用するコマンドからインスピレーションを得ることができます。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
です。補完を指定するか、またはオプションの1つがすでに存在する場合は補完を提供しないことを宣言します。-p
(-d -e -f -p)-d…
-d
-d
-e
-f
-p
-d+
-d
表現と引数の間のスペースはオプションです。->command
最初のパラメータは次のように_arguments
設定され、以下で実行が続行されます。$state
command
_normal
オプションではない最初の引数の後の引数は、コマンドラインがオプションではなく最初の引数で始まったかのように完了します。 afterは、オプションではなく最初の引数からオプションを削除するようにzshに::
指示します。*
- コマンド名の場合は、渡された名前を完成させてください。
compadd
必要に応じて名前を追加できます。失敗した場合は、コマンド名を入力してください。