外观
屏幕共享:看见并操作另一台 Mac
SSH 能解决大部分远程任务,但有些事必须看见界面:点一个只存在于设置面板里的开关、帮家人操作他们的 Mac、给一台没接显示器的 Mac mini 装一个只有图形安装器的软件。
macOS 自带的「屏幕共享」就是干这个的。它不是第三方远程桌面软件的阉割版,而是一套完整方案:系统里的服务端、一个独立的客户端 App、以及一层和 VNC 协议的兼容接口。
只有一件事要先记住:屏幕共享给出的权限比 SSH 更大,也更直观。对方看到的是你屏幕上的全部内容,包括你以为已经关掉的那个窗口。
开始之前
需要两台 Mac(或一台 Mac 加一个第三方 VNC 客户端),处于同一局域网,或者双方都登录了 Apple 账户。
本文会开启系统的共享服务,这改变了这台 Mac 的可访问性。每一节都给出关闭方式,练习结束后可以完全恢复原状。命令行验证部分需要能在终端执行命令。
入门层面的概览见文件共享与远程访问;SSH 以及「怎么从公网连回来」的整体思路见远程访问自己的 Mac,本文是其中屏幕那一半的展开。
核查环境为 macOS 26.3.1,「屏幕共享」App 版本 6.2。菜单路径以该版本为准,旧系统的措辞可能不同。
先把四个开关分清楚
「系统设置 → 通用 → 共享」里并排放着几个服务,名字接近,权限差别很大:
| 服务 | 对方能做什么 | 典型用途 |
|---|---|---|
| 文件共享 | 读写你授权的目录 | 传文件、共享素材库 |
| 远程登录 | 以某个账户执行命令(SSH) | 跑脚本、改配置 |
| 屏幕共享 | 看见并操作你的桌面 | 帮人排查、无头机器装软件 |
| 远程管理 | 屏幕共享的超集,外加批量管理能力 | Apple Remote Desktop 管理机群 |
最后一条要特别注意:「屏幕共享」和「远程管理」不能同时启用。很多「屏幕共享开关点不动」的情况,原因就是这台机器(或公司的管理配置)已经开了远程管理。公司设备上不要为了打开一个开关去改已有的管理设置。
第一步:在被控 Mac 上打开屏幕共享
进入「苹果菜单 → 系统设置 → 通用 → 共享」,确认「远程管理」处于关闭状态,再打开「屏幕共享」,然后点它旁边的信息按钮查看详细选项。
允许访问:把范围收到最小
详细选项里可以选「所有用户」或「仅这些用户」。
默认不要停在「所有用户」。选「仅这些用户」,只把你自己那个账号加进去。这条和权限模型有关:屏幕共享的认证用的是这台 Mac 的账户密码,谁通过认证,谁就拥有那个账户在图形界面里的全部能力——管理员账户意味着对方可以安装软件、改系统设置、重启电脑。
给别人临时用时,正确做法是准备一个受限的标准账户,而不是把管理员密码告诉对方再指望别的设置去约束他。
「任何人都可以请求取得控制屏幕的权限」
打开后,网络里的人不需要账号密码也能发起连接,但连接不会直接建立——坐在这台 Mac 前面的人会看到一个请求,同意之后才开始共享。
适合「我在电话里教对方操作」这种有人值守的场景。无人值守的机器不要开:没人去点同意,它不起作用;而它的存在会让你误以为这台机器多了一条可用的入口。
「VNC 显示程序可以使用密码控制屏幕」
这是给第三方 VNC 客户端准备的兼容通道:用一串独立密码代替系统账户认证。
它的安全性明显低于账户登录——那是一个和系统账户无关的共享口令,谁拿到谁就能连,也没有「哪个账户在什么时候连过」的对应关系。只在必须使用非 Apple 客户端(比如从 Windows 或 Linux 连过来)时才打开,密码单独生成并存进钥匙串,用完立刻关掉。
Apple 账户那一组设置
同一面板下方还有「已阻止的用户」和「允许来自以下用户的屏幕共享要求」。这一组管的是通过 Apple 账户发起的共享请求(「信息」App 里的共享屏幕,以及「屏幕共享」App 里按账户连接),和上面基于本机账户的网络连接是两条不同的路,需要分别理解。
不想收到某个人的请求时,在「已阻止的用户」里填入对方的 Apple 账户并点「阻止」。
第二步:从控制端连过去
三个入口,连的是同一个服务,区别只在便利性。
访达边栏
同一局域网下,打开访达,在边栏点「网络」,找到那台 Mac,点「共享屏幕」。
这条路依赖 Bonjour 的局域网发现。访客网络、不同 VLAN、开了 AP 隔离的无线网络都会让设备列表里什么都看不到——这时不代表服务没开,只代表发现机制没通。
「前往 → 连接服务器」
在访达里按 Command-K,输入:
vnc://mac-mini.local.local 后缀走 Bonjour 名称解析,不需要配置 DNS。名字不通时直接用 IP:
vnc://192.168.1.50终端里的等价写法:
sh
open vnc://mac-mini.localopen 把这个 URL 交给系统注册的处理程序,vnc:// 对应的就是「屏幕共享」App。
「屏幕共享」App
在「应用程序 → 实用工具」里,也可以用聚焦直接搜「屏幕共享」。
比起前两个入口,它多了三样东西:新建连接时手动输入主机名或 Apple 账户、「所有连接」里一键重连用过的机器、以及下面这个连接类型的选择。
标准连接与高性能连接
两台都是 Apple 芯片、都运行 macOS 14 或更高版本时,新建连接会多出「高性能」选项。它带来两点:
画面更流畅。 走的是专门的传输路径,而不是通用的 VNC 兼容层。
虚拟显示器。 可以给远端分配一台或两台只存在于这次会话里的显示器,并设置它是主显示器、扩展还是镜像,以及排列、分辨率、颜色描述文件和 HDR。
第二点对无头运行的 Mac mini 或 Mac Studio 很实用:过去要靠 HDMI 假负载欺骗器骗出一个分辨率,现在可以直接在连接时选。
不满足条件时用「标准」,走的是通用 VNC 路径,兼容性换性能——好处是任何平台的 VNC 客户端都能连上。
会话里能做什么
- 观察与控制:工具栏可以在两种模式间切换。观察模式只看不动,远程看着别人操作、或者做演示时用它,能避免你的鼠标和对方打架。
- 共享剪贴板:在「编辑」菜单里开启后,两台机器之间可以直接复制粘贴文字。
- 拖放传文件:把文件拖进共享窗口就传到远端,反向拖出来也可以。传一两个文件比专门开文件共享快得多。
- 缩放与画质:远端分辨率高于本地窗口时会缩放显示;网络差的时候降低画质换流畅度。
- 断开连接:在「窗口 → 连接」里选中会话,点「断开连接」。
键盘上有个坑:多数按键会转发到远端,但个别系统级组合键(例如 Command-Tab)可能被本机先截获。拿不准某个快捷键去了哪一边时,改用远端窗口里的菜单操作,结果更确定。
跨网络的三条路
局域网之外要连,选择顺序和 SSH 那篇一致:能不暴露端口就不暴露端口。
帮别人:Apple 账户请求
在「屏幕共享」App 里新建连接、填对方的 Apple 账户,或者直接在「信息」App 的对话里发起共享请求。对方在自己的 Mac 上同意之后连接才建立。
这条路的好处是:不需要对方改路由器,不需要开放任何端口,对方随时可以结束会话。远程帮家人朋友时它几乎总是正确答案。
连自己的机器:SSH 隧道
已经按远程访问自己的 Mac配好密钥登录的话,不需要为屏幕共享再开任何东西:
sh
ssh -N -L 5901:localhost:5900 用户名@主机名-L 5901:localhost:5900:把本机 5901 端口上的连接,通过 SSH 转发到远端机器自己看到的localhost:5900,也就是那台 Mac 上的屏幕共享服务。5901是本机随便挑的一个空闲端口,避开本机可能也在用的 5900。-N:不在远端执行命令,只做转发。这条命令会一直占着终端,Control-C结束隧道。
隧道开着的时候,另开一个窗口连本地端口:
sh
open vnc://localhost:5901屏幕共享的流量整段走在 SSH 的加密通道里,远端不需要在路由器上放行 5900,公网上也看不到这个服务。
覆盖网络(Tailscale、ZeroTier、自建 WireGuard)同理,装好之后按虚拟网络里的地址连接即可,细节见远程访问自己的 Mac。
不要做:把 5900 转发到公网
理由和 SSH 端口一样,而且更严重:VNC 兼容层本来就是一条弱认证入口,直接暴露在公网上会持续收到自动化探测。换个端口号不解决问题,扫描器会扫全部端口。
没有界面的机器怎么开
一台没接显示器、只能 SSH 进去的 Mac,界面开关点不到。可以用 Apple Remote Desktop 附带的 kickstart 打开远程管理:
sh
sudo /System/Library/CoreServices/RemoteManagement/ARDAgent.app/Contents/Resources/kickstart \
-activate -configure -users 用户名 -access -on -privs -ControlObserve -restart -agent-activate:启用远程管理服务。-configure:进入配置模式,后面的参数才会被写入。-users 用户名:只把权限给这个账户;省略它意味着范围更大,不要省。-access -on:打开访问。-privs -ControlObserve:授予「观察并控制」这一组权限,而不是-all那种全部权限。-restart -agent:重启代理让配置立即生效,不需要重启整台电脑。
影响范围:这打开的是「远程管理」,而它和「屏幕共享」互斥——界面上的屏幕共享开关会随之失效。这条命令权限很大,只在自己有权管理的机器上用。
用完关掉:
sh
sudo /System/Library/CoreServices/RemoteManagement/ARDAgent.app/Contents/Resources/kickstart \
-deactivate -configure -access -off-deactivate 停用代理,-configure -access -off 同时收回用户访问权限。完整参数以 -help 输出和 Apple 的 kickstart 说明为准(该文档为英文)。
确认服务真的开着或关着
屏幕共享服务监听 5900 端口。看它在不在:
sh
sudo lsof -i :5900 -P -n | grep LISTEN-i :5900:只看 5900 端口上的网络连接。-P:不把端口号翻译成服务名,输出里直接看到数字。-n:不做反向 DNS 查询,快且不会因为解析失败卡住。grep LISTEN:只保留处于监听状态的那一行。
开启时能看到监听进程,关闭后这一行应当消失。以这条命令的输出为准,而不是界面上的开关——关掉开关但服务还在的情况虽然少见,但你需要一个能验证的方法。
看相关服务是否加载:
sh
launchctl list | grep screensharing输出里的 com.apple.screensharing.agent 一类条目对应屏幕共享的各个组件。第一列是进程号(- 表示当前没在运行),第二列是上次退出状态。
连不上时的排查顺序
从最便宜的检查开始,每一步都能排除一类原因:
两台都醒着吗。 睡眠的 Mac 连不上。需要长期可连时,在「系统设置 → 电池 / 节能」里打开「唤醒以供网络访问」,代价是机器不会进入最省电的状态。
在同一个网络吗。 访客网络、不同 VLAN、AP 隔离都会切断发现和连接。
名字能解析吗。
shping mac-mini.local通了说明 Bonjour 名称解析没问题,问题出在服务或认证;不通就改用 IP 地址再试一次,这样能把「找不到机器」和「连不上服务」分开。
账户在允许列表里吗。 「仅这些用户」里没有你用的那个账号时,密码再对也会被拒绝。
远程管理是不是开着。 两者互斥,一个开着另一个就不工作。
端口通不通。
shnc -vz mac-mini.local 5900nc尝试建立一次连接,-v打印结果,-z只探测不发送数据。显示 succeeded 说明从网络到服务这条路是通的,剩下的问题在认证那一层。
Apple 官方的排查清单也是从睡眠、网络、共享权限这三项开始的,见如果你不能共享 Mac 电脑屏幕。
用完就关
这是最有效、也最容易被跳过的一条:不需要的时候把开关关掉。
屏幕共享是随开随关的服务,关掉之后这一面的攻击面直接归零。与其加固一个常年开着的服务,不如只在需要的那几天开着。
共享期间还有一件事值得提前做:先收拾工作区。会话建立之后对方看到的是完整桌面——聊天窗口、邮件通知、密码管理器界面都在里面。关掉无关窗口、临时打开专注模式,比事后解释要省事。
检查结果
一次成功的配置应该满足三条,而且每条都能自己验证:
- 从另一台设备连上之后,先用观察模式确认画面正常,再切到控制模式操作一次——两种模式的区别你能实际看出来。
- 断开连接后,在被控 Mac 上执行
sudo lsof -i :5900 -P -n | grep LISTEN,服务仍在监听(因为开关还开着)。 - 关闭「屏幕共享」开关,再执行同一条命令,输出为空;从控制端执行
nc -vz 主机名.local 5900应当失败。
第三条才是关键。能用命令确认服务已经关闭,比相信界面上的开关可靠。
动手练习
在自己的局域网内完成一次开启、连接、验证、关闭的完整循环:
- 在被控 Mac 上打开「屏幕共享」,「允许访问」选「仅这些用户」,只加自己的账号。
- 执行
sudo lsof -i :5900 -P -n | grep LISTEN,记下监听进程。 - 从另一台 Mac 用 Command-K 输入
vnc://主机名.local连接,先停在观察模式看一分钟。 - 切到控制模式,在远端新建一个文本文件,然后把它拖回本地窗口,确认文件传输可用。
- 只有一台 Mac 时,把第 3、4 步换成 SSH 隧道练习:执行
ssh -N -L 5901:localhost:5900 用户名@localhost,再open vnc://localhost:5901,观察到画面后立即断开(连自己会形成画面套画面,这正好说明隧道通了)。 - 关闭开关,重复第 2 步确认输出为空。
成功标准是第 6 步:你能说清这台 Mac 现在开放了什么、谁能连、能做什么,并且用命令确认服务已经关闭。远程这件事上,能验证的状态才是真实的状态。