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/configtsh 主机

编辑 ~/.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
相关推荐
XIAOHEZIcode11 小时前
Linux系统鼠标偏移常见原因以及修复方案
linux·运维·游戏
用户0328472220701 天前
如何搭建本地yum源(上)
运维
元Y亨H2 天前
MacBook Air 开发神器:IDEA 与 PyCharm 极简安装及环境配置
macos
yuanyxh2 天前
macOS 应用 - 纯对话生成
前端·macos·ai编程
大树884 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠4 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质4 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
开发者联盟league4 天前
安装pnpm
ssh
AI创界者4 天前
PilotTTS 一键整合包(Win/Mac):8G 显存畅跑,实测解锁情绪与副语言的精准控制
人工智能·macos·aigc·音视频
Inhand陈工4 天前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信