Loading... 在macos系统下的普通用户,在~/.bin/ccdns 程序,且用户把~/.bin 放到了PATH环境变量,用户可以使用sudo ccdns直接执行。可是在ubunt ulinux系统下,同样的配置,普通用户可以访问,但是sudo ccdns就行了。这是为啥 ## 根本原因 **sudo 默认会重置 PATH 环境变量**,不会继承用户的 `~/.bin`。 ## macOS vs Ubuntu 的差异 | 系统 | 默认行为 | |------|----------| | macOS | sudo 保留用户 PATH(默认配置宽松)| | Ubuntu | sudo 使用 `secure_path`,忽略用户 PATH | ## 验证 ```bash # 查看 sudo 的 PATH sudo env | grep PATH # 查看 sudoers 配置 sudo grep secure_path /etc/sudoers ``` Ubuntu 默认有类似这行: ``` Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" ``` ## 解决方案 **方案1:使用绝对路径** ```bash sudo ~/.bin/ccdns # 或 sudo /home/username/.bin/ccdns ``` **方案2:修改 sudoers(推荐)** ```bash sudo visudo # 添加或修改: Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/home/username/.bin" ``` **方案3:保留 PATH** ```bash sudo env "PATH=$PATH" ccdns ``` **方案4:移动到系统路径** ```bash sudo cp ~/.bin/ccdns /usr/local/bin/ ``` ## 推荐 方案4最干净——需要 sudo 执行的程序本就该放系统路径。 最后修改:2026 年 01 月 30 日 © 允许规范转载 赞 如果觉得我的文章对你有用,请随意赞赏