ssh-copy-id 必须用 -p 选项指定非22端口,格式为 ssh-copy-id -i 公钥路径 -p 端口号 user@host,-p 与端口号间需空格,不可用冒号或大写-P。

ssh-copy-id 默认只走 22 端口,要指定非默认端口(比如 2222、52113 等),必须用 -p 选项显式声明,不能写成 user@host:port 这种格式——那样会直接报错或被忽略。
正确写法:-p 后紧跟端口号
语法固定为:ssh-copy-id -i [公钥路径] -p [端口号] [user@]host
- 端口号必须紧贴
-p,中间不能有空格(如-p2222错,-p 2222对) - 用户名和主机名之间用
@连接,不带端口;端口单独由-p控制 - 示例:
ssh-copy-id -i ~/.ssh/id_ed25519.pub -p 2222 admin@192.168.1.100
常见错误写法及后果
以下写法都会失败:
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
-
ssh-copy-id user@host:2222→ 报错 “No such file or directory”,因为 ssh-copy-id 不解析冒号后端口 -
ssh-copy-id -p2222 user@host→ 实际传给底层 ssh 的是-p2,端口识别错误 -
ssh-copy-id -P 2222 user@host→-P是大写,无效参数,会被忽略
配合其他选项一起用
实际场景中常需叠加使用:
- 跳过首次 host key 确认:
-o StrictHostKeyChecking=no - 指定非默认公钥:
-i ~/.ssh/mykey.pub - 组合示例:
ssh-copy-id -i ~/.ssh/id_rsa.pub -p 52113 -o StrictHostKeyChecking=no deploy@10.0.0.5
批量分发时保持端口一致
若多台服务器都用同一非标端口,可结合循环脚本:
- 准备 hosts.txt,每行一个
user@ip(如admin@192.168.1.10) - 执行:
while read host; do ssh-copy-id -p 2222 -i ~/.ssh/id_ed25519.pub "$host"; done - 注意:每个
$host里不要含端口,端口统一由-p控制

















