惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Google DeepMind News
Google DeepMind News
博客园_首页
H
Help Net Security
T
Tailwind CSS Blog
S
SegmentFault 最新的问题
GbyAI
GbyAI
Scott Helme
Scott Helme
D
Docker
Hacker News: Ask HN
Hacker News: Ask HN
P
Privacy & Cybersecurity Law Blog
Jina AI
Jina AI
雷峰网
雷峰网
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Spread Privacy
Spread Privacy
G
GRAHAM CLULEY
C
Cisco Blogs
The Hacker News
The Hacker News
F
Full Disclosure
Y
Y Combinator Blog
Blog — PlanetScale
Blog — PlanetScale
Recent Announcements
Recent Announcements
G
Google Developers Blog
量子位
K
Kaspersky official blog
Cisco Talos Blog
Cisco Talos Blog
The Cloudflare Blog
A
About on SuperTechFans
C
Cybersecurity and Infrastructure Security Agency CISA
Last Week in AI
Last Week in AI
博客园 - 三生石上(FineUI控件)
Microsoft Security Blog
Microsoft Security Blog
Martin Fowler
Martin Fowler
T
Tenable Blog
P
Palo Alto Networks Blog
H
Heimdal Security Blog
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
W
WeLiveSecurity
Schneier on Security
Schneier on Security
The Register - Security
The Register - Security
F
Fortinet All Blogs
Stack Overflow Blog
Stack Overflow Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
T
The Blog of Author Tim Ferriss
N
News and Events Feed by Topic
Hugging Face - Blog
Hugging Face - Blog
小众软件
小众软件
V
V2EX
爱范儿
爱范儿

博客园 - 进军的蜗牛

浏览器音频入门:录音生成 PCM、单声道/立体声、采样率、转 MP3 Web 语音场景下多路麦克风采集与音量异常:成因与两种工程取舍 js实现svga编辑器 Chrome浏览器普通模式访问页面报错 ERR_CONNECTION_REFUSED 问题排查 Web语音聊天室中录音无声问题分析与解决方案 蓝湖SVG上传Iconfont阿里图标库部分元素缺失问题分析与解决方案 前端测试新体验:Cypress让UI测试变得如此简单 iOS H5页面高度闪烁问题与100vh兼容性详解 为什么录音生成的音频文件有时长但没声音?—— 一次音频采集问题的排查与解决 前端实现采集图片某个区域的颜色色值 浏览器多Tab间通信方法全面总结:从WebView需求出发的技术方案 pcm文件转为mp3并播放 github https方式 push无法提交代码的处理方法 前端如何计算js代码执行时长 基于swiper和animate.css的全屏H5动效和花瓣飘落效果 混合开发H5页面的数字字体在IOS 安卓上显示不一样 node基于自签名证书搭建https服务 ios系统上h5页面点击播放audio标签声音有延迟问题处理 基于svelte webpack开发umd格式的npm包 CSS运动路径offset-path之path的语法解析
从一次权限错误,彻底搞懂Mac权限管理那些事
进军的蜗牛 · 2026-03-20 · via 博客园 - 进军的蜗牛

作为一个Mac开发者,我遇到了一个问题:

我的项目要用到443端口(就是网址https默认用的那个端口)。在Mac上,只要是1024以下的端口,都必须用管理员权限才能用。所以我每次启动项目都得加sudo

sudo npm start

用着用着就习惯了,后来连build项目的时候也顺手加了sudo

sudo npm run build

结果有一天,我忘了加sudo直接运行build,报错了:

Error: EACCES: permission denied, open 'dist/index.html'

翻译成人话就是:没有权限,没法操作dist文件夹里的文件。

我用ls -la命令看了下:

ls -la
# 输出显示:drwxr-xr-x   root  staff   192  5 20 10:30 dist

发现问题了!dist文件夹的所有者是root(系统管理员),难怪普通用户没法往里写东西。

原因很简单:我之前一直用sudo跑build,生成的dist文件夹自然就归root管了。

解决办法也简单:

sudo chown -R $(whoami):staff dist

这条命令的意思是:把dist文件夹的所有权,从root改回给当前用户。

这个小问题让我决定好好研究一下Mac的权限系统,今天就把它彻底搞懂。

一、sudo到底是干啥的?

1.1 简单理解sudo

sudo就是"借用管理员身份"来执行命令。

打个比方:

  • 你平时就像普通员工,只能进自己的工位
  • sudo就像你临时借用老板的门禁卡,可以进一些平时进不去的房间

基本用法:

sudo 要执行的命令

1.2 什么时候需要用sudo?

最常见的情况:

  • 安装软件到系统目录(比如/usr/local
  • 修改系统配置文件
  • 使用1024以下的端口(就像我遇到的问题)
  • 修改别人没有权限的文件

1.3 Mac上常用的sudo命令

# 用管理员身份执行命令
sudo npm install -g some-package

# 切换到管理员账号(相当于变成root用户)
sudo su

# 切换到管理员账号,同时进入root的目录
sudo su -

# 用管理员身份编辑文件
sudo vim /etc/hosts

# 查看当前用户能执行哪些sudo命令
sudo -l

1.4 sudo su、sudo -i、sudo -s有啥区别?

说实话,这几个命令初学者容易搞混,我简单总结下:

命令 通俗解释 你现在在哪 你是谁
sudo 命令 临时用管理员身份干一件事 还在自己目录 干完就变回自己
sudo su 变成管理员,但还在当前目录 在自己目录 现在是管理员
sudo su - 彻底变成管理员 在管理员的家目录 现在是管理员

简单记:日常用sudo 命令就够了,除非你真的需要一直当管理员。

二、为啥Mac上443端口这么特殊?

2.1 端口的"等级制度"

Mac上的端口号分三六九等:

  • 0-1023:特权端口(需要管理员权限才能用)
  • 1024-49151:注册端口(普通用户就能用)
  • 49152-65535:动态端口(随便用)

443端口就属于第一类——特权端口。因为这是https网站默认用的端口,Mac觉得这么重要的端口,不能让普通程序随便占用。

2.2 怎么查看443端口被谁占了?

# 查看443端口的使用情况
sudo lsof -i :443

# 输出示例
# node    12345  user   12u  IPv4 0x123456789  0t0  TCP *:https (LISTEN)

2.3 除了用sudo,还有其他办法吗?

有几种替代方案:

方案一:用其他端口开发
比如用3000、8080这些普通端口,等部署到服务器再用443

方案二:用端口转发

# 把本地的8080端口伪装成443
echo "rdr pass on lo0 inet proto tcp from any to any port 443 -> 127.0.0.1 port 8080" | sudo pfctl -ef -

方案三:用管理员权限运行Node

# 给Node特殊权限(有点复杂,新手不推荐)
sudo chown root $(which node)
sudo chmod u+s $(which node)

三、ls -la 到底显示了啥?

3.1 这个命令是啥意思?

ls -la
# ls = list(列出文件)
# -l = long format(显示详细信息)
# -a = all(包括隐藏文件)

3.2 那些乱码一样的输出怎么看?

假设看到这一行:

drwxr-xr-x  12 root  staff   384  5 20 10:30 dist

拆开来看:

部分 含义 通俗解释
d 文件类型 d表示文件夹,-表示普通文件
rwxr-xr-x 权限信息 谁能读、写、执行这个文件
12 链接数 不用太关心
root 所有者 这个文件归谁管
staff 所属组 这个文件归哪个小组管
384 大小 文件有多大
5 20 10:30 修改时间 最后修改时间
dist 文件名 文件叫啥

3.3 那一串rwx是啥意思?

rwx分别代表:

  • r = read(读)—— 能不能看文件内容
  • w = write(写)—— 能不能修改文件
  • x = execute(执行)—— 能不能运行这个文件(如果是程序的话)

rwxr-xr-x可以分成三组:

  • 第1组(前3个)rwx:文件所有者有啥权限(可读可写可执行)
  • 第2组(中间3个)r-x:同组的用户有啥权限(可读可执行,但不能修改)
  • 第3组(后3个)r-x:其他用户有啥权限(可读可执行,但不能修改)

3.4 权限也可以用数字表示

简单记个口诀:r=4,w=2,x=1

比如rwxr-xr-x转成数字:

  • 所有者:rwx = 4+2+1 = 7
  • 同组:r-x = 4+0+1 = 5
  • 其他:r-x = 4+0+1 = 5

所以rwxr-xr-x = 755

常用的权限组合:

  • 755:自己随便改,别人只能看和执行(最常用)
  • 644:自己可以改,别人只能看(适合文件)
  • 700:只有自己能看能改(私密文件)
  • 777:谁都能随便改(不安全,尽量别用)

四、chown:把文件还给正确的人

4.1 chown是干啥的?

chown = change owner(改变所有者)

就是把文件/文件夹的"主人"换成别人

4.2 基本用法

# 把文件的所有者改成张三
sudo chown 张三 文件名

# 把文件的所有者改成张三,所属组改成staff
sudo chown 张三:staff 文件名

# 把文件夹及其里面的所有文件都改掉(-r就是递归)
sudo chown -R 张三:staff 文件夹名

4.3 我用的那条命令啥意思?

sudo chown -R $(whoami):staff dist

拆解一下:

  • sudo:用管理员权限执行(只有管理员才能改别人的文件)
  • chown:改变所有者的命令
  • -R:递归,把dist里面的所有文件都改了
  • $(whoami):当前登录的用户名(我的是zhangsan)
  • :staff:所属组改成staff(Mac普通用户默认都在这个组)
  • dist:要修改的文件夹

整条命令的意思就是:把dist文件夹以及里面所有文件的"主人",从root改成当前用户,同时把所属组改成staff。

4.4 其他常用写法

# 只用当前用户名
sudo chown -R $USER:staff dist

# 只改所有者,不改所属组
sudo chown -R $USER dist

# 只改所属组,不改所有者
sudo chown -R :staff dist

# 把整个当前目录都改回来(有时候很有用)
sudo chown -R $USER:staff .

五、完整的解决过程回顾

发现问题

# 正常build报错
npm run build
# 报错:permission denied

找原因

# 查看当前目录所有文件
ls -la

# 发现dist目录是root的
# drwxr-xr-x   root  staff  ... dist

解决问题

# 把dist还给当前用户
sudo chown -R $(whoami):staff dist

# 验证一下
ls -la
# 现在显示 drwxr-xr-x  zhangsan  staff ... dist

再build试试

npm run build
# 成功了!

六、日常使用的避坑指南

6.1 sudo使用小贴士

  1. 用sudo前先想想:我真的需要管理员权限吗?
  2. 用完即止:执行完需要sudo的命令就收手,不要一直挂着管理员身份
  3. 看清楚再回车:sudo权限很大,输错命令可能搞乱系统
  4. 尽量不用sudo su:一直当管理员很危险,万一误操作...

6.2 权限管理小贴士

  1. 知道谁是谁:用ls -la看看文件主人,很多权限问题一眼就能发现
  2. 别用777:看到网上有人教chmod 777解决问题,这是图省事埋大坑
  3. 下载的文件权限不对:从网上下载的压缩包,解压后权限可能乱,用chown改一下就好
  4. 外接硬盘权限问题:插上U盘发现不能写入,可能也是权限问题

6.3 开发环境配置建议

配置npm全局安装不需要sudo:

# 设置npm全局安装到自己的目录
npm config set prefix '~/.npm-global'

# 把这个目录加到PATH
echo 'export PATH=~/.npm-global/bin:$PATH' >> ~/.zshrc

# 重新加载配置
source ~/.zshrc

# 以后就可以直接 npm install -g 包名,不用sudo了

七、一句话总结

权限问题的本质:文件有主人,谁的主人谁才能改。

排查步骤

  1. ls -la看看文件主人是谁
  2. 如果是root或其他用户,用sudo chown -R 自己:staff 文件夹改回来

预防措施

  • 只在必要时用sudo
  • 配置开发环境,避免非要用sudo

写在最后

一个小习惯,让我绕了个大弯,但也因祸得福,把Mac的权限系统彻底搞懂了。

以后再遇到"Permission denied",我就知道:

  1. 先看是谁的文件(ls -la
  2. 再看是谁在操作(whoami
  3. 把文件还给对的人就行(sudo chown

希望这篇文章能帮你少走弯路,遇到类似问题不慌不忙,几分钟就搞定!


如果下次遇到权限问题,先想这三步:

  • 谁的文件? → ls -la
  • 我是谁? → whoami
  • 怎么还回去? → sudo chown -R 我:staff 文件夹

搞定!