系统学习 macOS 学习路径:从 BSD 文件命令到系统、网络与开发维护

ssh

从 macOS 登录远程主机、执行命令并转发端口。

补充说明

macOS 自带 OpenSSH 客户端,配置优先级是命令行选项高于 ~/.ssh/config,后者高于 /etc/ssh/ssh_config。目标 Mac 必须先开启“系统设置 → 通用 → 共享 → 远程登录”,并允许对应用户;只开屏幕共享不等于开了 SSH,连接会直接 refused。命令行可用 sudo systemsetup -setremotelogin on 开启。

macOS 的 ssh 有两处 Apple 扩展:钥匙串集成和 UseKeychain 配置。ssh-add --apple-use-keychain 把私钥口令存进登录钥匙串,--apple-load-keychain 在重启后重新加载;~/.ssh/config 里的 UseKeychain yes 只被 Apple 的 ssh 识别,配置同步到 Linux 会报 Bad configuration option。密钥权限仍要求 ~/.ssh 为 700、私钥为 600,否则会被静默忽略。

新版 OpenSSH 默认禁用 ssh-rsa(SHA-1)主机密钥和签名,连接老旧网络设备常报 no matching host key type。优先升级设备或换密钥算法;临时兼容可在单个 Host 段加 HostkeyAlgorithms +ssh-rsa 和 PubkeyAcceptedAlgorithms +ssh-rsa,但这会降低安全性,不要写进全局配置。

常用示例

# 在目标 Mac 上开启并确认远程登录(部分系统需终端有完全磁盘访问权限)
% sudo systemsetup -setremotelogin on
% sudo systemsetup -getremotelogin

# 把私钥口令存入钥匙串,重启后用 --apple-load-keychain 恢复
% ssh-add --apple-use-keychain ~/.ssh/id_ed25519
% ssh-add --apple-load-keychain

# 只使用指定密钥,避免 agent 里其他密钥被依次尝试
% ssh -o IdentitiesOnly=yes -i ~/.ssh/id_ed25519 user@host

# 经跳板机连接内网主机
% ssh -J bastion.example.com user@10.0.0.5

# 本地端口转发,访问本机 8080 即访问远端回环的 80
% ssh -N -f -L 8080:127.0.0.1:80 user@host

# 查看最终生效的配置,排查 Host 段和优先级
% ssh -G host | grep -E '^(hostname|user|port|identityfile) '

# 排错:看加载了哪些密钥、卡在哪个认证阶段
% ssh -v user@host

易错点与排错

相关命令

参考链接

读完自测

合上页面,先回答,再展开对照。

  1. 目标 Mac 上需要开启什么服务才能被 ssh 登录?
  2. --apple-use-keychain 和 UseKeychain yes 分别解决什么问题,为什么不能直接同步到 Linux?
  3. 遇到 no matching host key type 应该怎样处理?
答案
  1. 开启“系统设置 → 通用 → 共享 → 远程登录”,并确认允许的用户;命令行可用 sudo systemsetup -setremotelogin on。
  2. 前者把私钥口令存入登录钥匙串,后者让 ssh 从钥匙串取口令;两者都是 Apple 扩展,Linux 的 ssh 不识别 UseKeychain,会报配置错误。
  3. 优先升级目标设备或改用 ed25519;确需兼容时只在单个 Host 段临时启用 ssh-rsa 算法,并清楚这会降低安全性。
微信小程序码:扫码打开命令速查小程序

小程序版

微信扫码,随时查命令