SSH 免密 + 主机指纹登录完整安装步骤(macOS)

本文档目标:

  • 让你可以通过 ssh root@tsh 免密登录远程主机(实际主机名为 sh)。

  • 让你可以直接输入 tsh,先走本机 Touch ID,再发起 SSH 登录。

1. 前置条件

  • 本机:macOS(已安装 OpenSSH,默认自带)。

  • 远端:可通过 sh 这个主机名访问(DNS 或 hosts 已配置)。

  • 你知道远端 root 密码(仅首次下发公钥时需要)。

2. 生成 SSH 密钥(如已有可跳过)

先检查是否已有密钥:

bash 复制代码
ls -la ~/.ssh/id_rsa ~/.ssh/id_rsa.pub

如果不存在,执行:

bash 复制代码
ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa

说明:

  • 可以设置口令,也可以不设置。

  • 本文后续方案不依赖私钥口令,而是用 Touch ID 网关脚本做登录前验证。

3. 配置 ~/.ssh/config 的 tsh 主机

编辑 ~/.ssh/config,追加(或修改)如下配置:

bash 复制代码
Host tsh
    HostName sh
    User root
    IdentityFile /Users/wuqiyue/.ssh/id_rsa
    IdentitiesOnly yes
    PreferredAuthentications publickey
    PubkeyAuthentication yes
    UseKeychain yes
    AddKeysToAgent yes

注意:

  • HostName sh 表示真实主机是 sh,但你本地可用 tsh 作为别名。

  • IdentityFile 路径要和你的私钥文件一致。

4. 首次下发公钥到远端(实现免密)

执行:

bash 复制代码
ssh-copy-id root@tsh

第一次会提示输入远端 root 密码。成功后测试:

bash 复制代码
ssh root@tsh 'echo ok'

返回 ok 即表示免密生效。

5. 可选:把密钥加入 Keychain/ssh-agent

bash 复制代码
ssh-add --apple-use-keychain ~/.ssh/id_rsa

6. 配置 Touch ID 登录前验证脚本

创建脚本 ~/.local/bin/ssh-touchid-gate:

bash 复制代码
mkdir -p ~/.local/bin
cat > ~/.local/bin/ssh-touchid-gate <<'EOF'
#!/usr/bin/env bash
set -euo pipefail
​
/usr/bin/swift - <<'SWIFT'
import LocalAuthentication
import Foundation
​
let context = LAContext()
var error: NSError?
​
if !context.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: &error) {
  fputs("Touch ID 不可用,请检查系统设置。\n", stderr)
  exit(2)
}
​
let sem = DispatchSemaphore(value: 0)
var authOK = false
​
context.evaluatePolicy(
  .deviceOwnerAuthenticationWithBiometrics,
  localizedReason: "使用指纹验证后登录远程主机"
) { success, _ in
  authOK = success
  sem.signal()
}
​
_ = sem.wait(timeout: .now() + 120)
exit(authOK ? 0 : 1)
SWIFT
EOF
​
chmod +x ~/.local/bin/ssh-touchid-gate

7. 在 ~/.zshrc 配置 tsh 命令

将下面内容追加到 ~/.zshrc(如果已有旧的 alias tsh='ssh tsh',请先删除或 unalias):

bash 复制代码
# SSH quick login with Touch ID
unalias tsh 2>/dev/null
tsh() {
  /Users/wuqiyue/.local/bin/ssh-touchid-gate || {
    echo "指纹验证失败,已取消登录"
    return 1
  }
  ssh tsh "$@"
}

加载配置:

bash 复制代码
source ~/.zshrc

8. 验证

  1. 免密验证:
bash 复制代码
ssh -o BatchMode=yes root@tsh 'echo ok'
  1. 指纹流程验证:
复制代码
tsh

预期行为:

  • 会弹出 Touch ID 验证框。

  • 指纹通过后进入远端 shell。

  • 取消/失败时提示"指纹验证失败,已取消登录"。

9. 常见问题

9.1 Permission denied (publickey...)

  • 检查远端是否已写入 ~/.ssh/authorized_keys。

  • 重新执行:

bash 复制代码
ssh-copy-id root@tsh

9.2 Could not resolve hostname tsh

  • 这是本地 SSH 别名未配置或未加载:
bash 复制代码
ssh -G tsh | head
source ~/.zshrc

9.3 Touch ID 不弹窗

  • 检查 macOS 的 Touch ID 是否可用。

  • 直接运行脚本看报错:

bash 复制代码
~/.local/bin/ssh-touchid-gate

9.4 代理不可用导致安装依赖失败

  • 先验证代理端口通不通:
bash 复制代码
nc -z -w 3 x.x.x.x 7890
  • 再检查当前 shell 是否设置代理环境变量(如需要):
bash 复制代码
env | grep -i proxy

完成后,你日常只需要执行:

复制代码
tsh
相关推荐
程序员-Benothing1 小时前
Shell输入输出详解:read、echo、printf、颜色输出
linux·运维·服务器
和裕1 小时前
全纸结构重型纸箱能否满足 1 吨以上设备出口熏蒸豁免要求?通关合规性全解析
大数据·运维·网络·人工智能·算法
FPGA小徐1 小时前
从 NEMU 到 AbstractMachine:程序、运行时环境与 AM 完全解析
linux·运维·服务器
呉師傅2 小时前
得力P2500、M2500系列打印机硒鼓加粉及清零方法【纯享版】
运维·网络·windows·电脑
Sayai2 小时前
Elasticsearch 日志检索 DSL 实战:时间范围查询、字段去重、分钟级统计与最新日志获取
大数据·运维·elasticsearch·搜索引擎·日志分析
fb_123455 小时前
MySQL运维实战:备份恢复+主从复制+读写分离+MHA高可用(超详细手把手教程)
运维·mysql·oracle
..Dauntless..5 小时前
【Linux】进程地址空间初步理解
linux·运维·服务器
Julien20045 小时前
Docker 网络(一)
linux·运维·服务器·ssh·学习方法
字节跳动的猫6 小时前
LikeShop 积分体系全链路改造:获取规则、订单抵扣与积分商品兑换二开
运维·数据结构
杨云龙UP6 小时前
一次数据库查询缓慢故障复盘:大表数据增长、SQL全表扫描导致系统响应异常
linux·运维·服务器·数据库·sql·mysql