首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >sshpass的zsh完成

sshpass的zsh完成
EN

Unix & Linux用户
提问于 2020-07-11 17:16:36
回答 1查看 258关注 0票数 1

我使用的sshpass命令如下:

代码语言:javascript
复制
sshpass -p 'my_password' ssh user@server

根据手册页,完整的语法是

代码语言:javascript
复制
sshpass [-ffilename|-dnum|-ppassword|-e] [options] command arguments

目前,zsh没有任何sshpass的完成规则。我如何创建简单的完成规则,以便在我到达“命令”和“参数”时,完成命令的ssh,而user@host与标准ssh的完成相同?

EN

回答 1

Unix & Linux用户

回答已采纳

发布于 2020-07-11 22:38:00

您可以从具有类似语法的命令中获得灵感,例如sudo,它也采用选项,后面跟着命令名及其选项。有关编写zsh完成的介绍,请参见用于自定义命令的动态zsh自动完成

将以下代码放入名为_sshpass$fpath文件中。(有关zsh如何获取完成函数的更多细节,请参见如何正确地使定制的zsh完成“只起作用”?。)

代码语言:javascript
复制
#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会导致它们被完成,就像命令行以第一个非选项参数开始一样。::*之后指示zsh删除第一个非选项参数的选项。
  • 对于命令名,请尝试完成传递给compadd的名称(如果需要,可以添加更多的名称)。如果此操作失败,请填写任何命令名。
票数 1
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/597966

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档