答案:golangci-lint报permission denied主因是二进制文件缺失执行权限或所在目录/配置文件无读取权限。需检查ls -l输出是否含x位、目录是否可进入、.golangci.yml权限是否允许当前用户读取,尤其注意CI中挂载只读卷或属主不匹配问题。

golangci-lint 报 permission denied 不是它缺权限,是你装的二进制没执行权,或 PATH 里找到的是个只读文件。
golangci-lint 命令执行时报 permission denied
常见现象:bash: /usr/local/bin/golangci-lint: Permission denied 或 zsh: permission denied: golangci-lint。这不是 Go module 或项目路径的问题,而是 shell 尝试执行一个没有 x 权限的文件。
- Mac 上用
brew install golangci-lint一般不会出这问题,因为 Homebrew 自动设好权限 - Linux 或 CI 中用官方脚本安装后,得手动确认:
ls -l $(go env GOPATH)/bin/golangci-lint—— 如果没有-rwxr-xr-x开头,就缺执行位 - 直接下载二进制(比如从 GitHub Releases 页面)后忘了
chmod +x golangci-lint,就会这样 - 某些 CI 镜像(如 alpine)挂载的 volume 是只读的,
$(go env GOPATH)/bin落在只读路径下,即使有 x 权限也执行不了
运行时提示 open /xxx/.golangci.yml: permission denied
这是 golangci-lint 启动后尝试读配置文件失败,和命令本身权限无关,而是当前用户对 .golangci.yml 所在目录或文件无读取权限。
- 检查文件权限:
ls -l .golangci.yml,确保不是----------或属主不匹配 - 更常见的是目录权限太严:比如项目根目录是
drwx------(仅属主可进入),非 root 用户就进不去,自然打不开配置文件 - Git 检出的文件可能被 umask 影响,导致
.golangci.yml权限为-rw-------,而 CI 运行用户不是文件属主——这时要改文件权限,或让 CI 用户成为属主(chown),别靠sudo硬扛 - 容器环境注意:挂载 host 目录时加了
:ro,或使用runAsNonRoot: true但文件属主是 root,也会触发此错
CI 中 golangci-lint 因权限失败的典型链路
CI 日志里看到一连串 permission denied,往往不是单点问题,而是权限配置断层造成的连锁反应。
- 第一步:安装脚本把二进制写到
/home/runner/go/bin/golangci-lint,但/home/runner/go/bin目录权限是drwxr-x---,其他用户不可进入 → 后续所有调用都 fail - 第二步:你改用
go install安装,但没设GOPROXY,go尝试访问私有 registry 失败,错误被包装成*os.PathError,而 golangci-lint 解析失败时又报 “permission denied”(误导性错误信息) - 第三步:.golangci.yml 里写了
run: skip-dirs: [vendor],但vendor/目录权限是drwx------,golangci-lint 想跳过它,却因进不去而报错退出 - 关键判断:先跑
id和ls -ld . $(go env GOPATH)/bin,确认 UID/GID 和目录可访问性,再看具体哪个路径卡住
真正麻烦的是权限错误常伪装成其他问题——比如报 no go files to analyze,实际是因为进不了模块根目录;报 undefined: xxx,根源却是 go.mod 文件读不了。别急着调配置,先用 ls -l 和 id 把路径和身份钉死。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











