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
相关推荐
RisunJan7 小时前
Linux命令-rlogin(远程登录)
linux·运维
深圳恒讯7 小时前
菲律宾云服务器与传统VPS的架构差异
运维·服务器·架构
蓝天下的守望者7 小时前
svt_apb_if里的宏定义问题
运维·服务器·数据库
小林ixn7 小时前
从“玩具工具”到“跨语言利器”:MCP 协议实战解析
运维·服务器·网络
小顿的企业观察8 小时前
中企出海战略规划,正在从“走出去”转向“走进去”
大数据·运维·人工智能·产品运营·制造
数智化转型推荐官9 小时前
2026统一身份管理系统五大发展趋势解读
java·运维·微服务
看菜鸡互9 小时前
探索用 SlideML 让大模型生成 PPT 的实验方法
java·运维
liguojun202511 小时前
篮球馆自动计时收费系统:从规则配置到自动结算的全流程拆解
java·大数据·运维·人工智能·物联网·1024程序员节
Promise微笑11 小时前
红外分辨率 160×120、320×240、384×288 与 640×480实战选型指南
大数据·运维·人工智能·物联网
handsome091612 小时前
苹果电脑可以使用yunedit-ssh代替winscp
ssh·管理linux文件