You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Zsh中Rsync补全失效(基于.ssh/config配置)

问题分析与解决方案

问题原因

Zsh中rsync的补全逻辑和ssh、scp存在差异:

  1. rsync默认优先补全本地路径,远程主机补全的触发上下文和你当前配置的':completion:*:(ssh|scp|rsync):*'不匹配,导致你的规则无法作用到rsync的远程主机补全环节。
  2. 你的hosts配置没有明确指定rsync补全时要读取.ssh/config中的主机列表,而rsync的默认补全函数不会自动关联ssh的主机配置。

修正后的配置

替换你.zshrc中的相关配置为以下内容:

# 针对ssh/scp/rsync的主机补全条目,排除含点的主机
zstyle ':completion:*:(ssh|scp|rsync):*:hosts' ignored-patterns '*(.|:)*'

# 从.ssh/config中提取Host条目作为补全来源
zstyle ':completion:*:(ssh|scp|rsync):*:hosts' hosts ${${${(f)"$(cat ~/.ssh/config 2>/dev/null)"}:#Host *}#Host }

# 调整rsync补全优先级,优先补全远程主机而非本地路径
zstyle ':completion:*:rsync:*' tag-order 'hosts:-host:host *'

autoload -Uz compinit  
compinit

配置说明

  • 第一行:精确将忽略规则应用到主机补全条目上,确保只有不含点的Host条目被保留。
  • 第二行:手动从.ssh/config中提取所有Host字段值,作为这三个命令的主机补全来源,避免依赖Zsh默认补全的自动检测逻辑。
  • 第三行:强制rsync补全时优先处理主机标签,当你输入类似rsync file user@或rsync user@host:的结构时,会自动触发符合条件的主机补全。

验证方法

执行compinit -C重新加载补全配置(无需重启Shell),然后测试rsync的补全效果,比如输入rsync myHost:,应该能看到myHost、otherHost10等符合条件的主机被补全,而some.host.with.dots会被排除。

内容的提问来源于stack exchange,提问作者stefabat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 19:52:51