![sshpass에 대한 zsh 완성](https://linux55.com/image/176775/sshpass%EC%97%90%20%EB%8C%80%ED%95%9C%20zsh%20%EC%99%84%EC%84%B1.png)
나는 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
입니다 . 완성을 지정하고, 또는 옵션 중 하나가 이미 존재하는 경우 완성을 제공하지 않아야 함을 선언합니다.-p
(-d -e -f -p)-d…
-d
-d
-e
-f
-p
-d+
-d
표현과 인수 사이의 공백은 선택 사항입니다.->command
첫 번째 매개변수는 다음 으로_arguments
설정 되고 아래에서 실행이 계속됩니다.$state
command
_normal
옵션이 아닌 첫 번째 인수 뒤의 인수는 마치 명령줄이 옵션이 아닌 첫 번째 인수로 시작된 것처럼 완료됩니다. after는 옵션이 아닌 첫 번째 인수에서 옵션을 제거하도록 zsh에::
지시합니다 .*
- 명령 이름의 경우 전달된 이름을 완성해 보세요.
compadd
필요한 경우 이름을 더 추가할 수 있습니다. 실패하면 명령 이름을 입력하십시오.