首页/新闻资讯/正文详情

Salt macOS 模块修复:`mac_brew_pkg.homebrew_prefix()` 不再无条件触发 `su` 密码提示

发布时间:2026/9/23 12:02:29 来源:云帆数科 栏目:资讯中心
Salt macOS 模块修复:`mac_brew_pkg.homebrew_prefix()` 不再无条件触发 `su` 密码提示
运维配置管理后端【免费下载链接】saltSoftware to automate the management and configuration of infrastructure and applications at scale.项目地址https://gitcode.com/gh_mirrors/sa/salt点击查看免费下载导读本文讲解 Salt 在 macOS 平台上的 Homebrew 软件包管理模块mac_brew_pkg中一次典型缺陷的修复homebrew_prefix()探测函数会在每次调用时触发su密码提示或在非 TTY 环境下报su: Sorry罪魁祸首是cmdmod.run在 macOS 上对runas参数的无条件su -l包装。读完本文你将理解 Salt 执行模块在 macOS 上的提权实现细节、该缺陷的根因与修复思路以及配套回归测试如何锁定修复行为。背景homebrew_prefix()是 mac_brew_pkg 模块的基石mac_brew_pkg是 Salt 在 macOS 上管理 Homebrew 软件包的执行模块其虚拟名称为pkg仅当osgrain 为MacOS且能找到brew二进制时才加载见 salt/modules/mac_brew_pkg.py 中的__virtual__()。而homebrew_prefix()用于探测 Homebrew 的安装前缀Intel Mac 通常为/usr/localApple Silicon Mac 通常为/opt/homebrew是模块内众多功能的依赖基础例如_homebrew_bin()通过它拼接出brew二进制完整路径prefix/bin/brew见 salt/modules/mac_brew_pkg.py_call_brew()基于该路径构造实际的brew命令调用salt/modules/mac_brew_pkg.py__virtual__()中也会通过_homebrew_bin()校验brew是否存在。因此homebrew_prefix()几乎在模块每次被实际使用时都会被调用任何低效或引发交互式提示的实现都会被放大为高频故障。问题根因cmdmod.run在 macOS 上对runas的无条件su -l包装修复前的homebrew_prefix()会无条件地把 brew 二进制所有者作为runas传给cmdmod.run以brew --prefix探测前缀。问题在于cmdmod.run在 macOS 平台上的特殊处理逻辑见 salt/modules/cmdmod.pyif runas and salt.utils.platform.is_darwin(): # ... 组装为 login shell 命令 cmd fsu -l {_cmd_quote(runas)} -c {_cmd_quote(cmd)} # Set runas to None, because if you try to run su -l after changing # user, su will prompt for the password of the user and cause salt to # hang. runas None从源码结构看macOS 上任何非空runas都会导致命令被包装成su -l user -c ...。当 brew 二进制的所有者恰好就是当前进程用户例如非 root 用户通过 salt-ssh 管理自己所有的 Homebrew 环境时这条su -l依旧会被执行从而在交互式终端触发su密码提示在非 TTY 调用如 salt-ssh、自动化任务中直接报su: Sorry并失败。由于homebrew_prefix()是高频基础调用该问题在每次调用时都会复现属于典型的探测函数反而导致命令无法执行的回归缺陷。修复方案仅在所有者不同时传递runas修复后的homebrew_prefix()不再无条件传递runas而是在调用cmdmod.run之前先比较 brew 二进制所有者与当前进程用户见 salt/modules/mac_brew_pkg.py# Try brew --prefix otherwise try: log.debug(Trying to find homebrew prefix by running brew --prefix) brew _homebrew_os_bin() if brew is not None: # Check if the found brew command is the right one import salt.modules.cmdmod import salt.modules.file runas salt.modules.file.get_user(brew) # Only pass runas when the brew binary is owned by a different # user than the current process. On macOS, cmdmod.run with a # truthy runas wraps the command in su -l user -c ... # unconditionally, which triggers a password prompt (or # su: Sorry on non-tty invocations) even when the target user # is the current user. See #69027. try: if runas getpass.getuser(): runas None except Exception: # pylint: disablebroad-except # getpass.getuser() can raise on unusual environments (e.g. # empty passwd db); fall back to sending runas as-is. pass ret salt.modules.cmdmod.run( brew --prefix, runasrunas, output_logleveltrace, raise_errTrue ) return ret except CommandExecutionError as exc: log.debug( Unable to find homebrew prefix by running brew --prefix. Error: %s, exc ) return None关键逻辑拆解所有者探测通过salt.modules.file.get_user(brew)获取 brew 二进制的所有者用户名get_user基于文件stats返回user字段见 salt/modules/file.py条件归零用getpass.getuser()取得当前进程用户若二者相同则将runas置为None从而在cmdmod.run的 macOS 分支中跳过su -l包装因为该分支要求runas为真值异常兜底getpass.getuser()在异常环境如空的 passwd 数据库可能抛异常此时按原样透传runas保证功能不因兜底失败而中断行为保持当 brew 二进制所有者确实与当前用户不同时runas依然被传递su -l包装照常生效——修复只消除对自己执行 su这一无意义且有害的场景不改变正常提权路径。同时函数整体保留了原有的回退语义优先使用HOMEBREW_PREFIX环境变量salt/modules/mac_brew_pkg.py无法执行brew --prefix时捕获CommandExecutionError并返回None。回归测试两条测试锁定修复行为仓库中的单元测试文件 tests/pytests/unit/modules/test_mac_brew_pkg.py 针对该修复补充了两条成对的回归测试测试一brew 所有者等于当前用户时不得传递runastest_homebrew_prefix_no_su_when_brew_owner_is_current_usertests/pytests/unit/modules/test_mac_brew_pkg.py该测试注释明确把场景描述为 #69027 回归测试修复前homebrew_prefix()无条件把runasbrew 二进制所有者传给cmdmod.run而 macOS 上即使目标用户就是当前用户也会包装成su -l导致每次 salt-ssh 非 root 调用用户自持 Homebrew都会触发密码提示或su: Sorry。测试断言_, kwargs run_mock.call_args assert kwargs.get(runas) is None, ( homebrew_prefix() must not pass runascurrent user to cmdmod.run; on macOS this wraps the probe in su -l and triggers a password prompt (issue #69027) )测试二brew 所有者是其他用户时仍须传递runastest_homebrew_prefix_still_uses_runas_when_brew_owned_by_other_usertests/pytests/unit/modules/test_mac_brew_pkg.py作为互补用例当file.get_user返回brewowner而getpass.getuser返回someoneelse时runas必须保持为brewowner确保正常的按所有者提权路径不被破坏_, kwargs run_mock.call_args assert kwargs.get(runas) brewowner两条测试一正一反共同界定了修复的精确边界只在所有者就是当前用户时跳过提权包装其余场景行为不变。修复带来的实际影响消除高频交互提示homebrew_prefix()的每次调用不再因自我su而触发密码提示或su: Sorry错误非 root 用户自持 Homebrew 的 salt-ssh 场景可以稳定执行减少无意义系统调用避免了为探测前缀而启动一次多余的子进程su -l包装缩短了pkg系列命令的响应链路不影响既有权限模型所有者在其他用户时依旧以su -l提权管理员模式的 Homebrew 管理行为与修复前一致。运维建议对于 macOS minion / salt-ssh 用户模块头部文档还给出了规避探测开销的推荐做法为 salt-minion 设置HOMEBREW_PREFIX环境变量Intel 为/usr/localApple Silicon 为/opt/homebrew这样homebrew_prefix()会直接命中环境变量分支跳过brew --prefix子进程调用见 salt/modules/mac_brew_pkg.py。该建议在修复前后都成立可进一步降低每次pkg调用时的探测成本。赞分享运维配置管理后端【免费下载链接】saltSoftware to automate the management and configuration of infrastructure and applications at scale.项目地址https://gitcode.com/gh_mirrors/sa/salt点击查看免费下载相关推荐Salt salt-ssh 修复relenv Minion 配置不再嵌入 __master_opts__根治 Argument list too longSalt salt ssh 修复relenv Minion 配置不再嵌入 __master_opts__ 根治 Argument list too long运维配置管理后端Area51模型动画事件触发条件代码示例Area51模型动画事件触发条件代码示例 在游戏开发中模型动画事件Animation Event是连接动画序列与游戏逻辑的关键桥梁。Area51项目通过Salt manage 状态检测修复深度解析manage.status/manage.up/manage.down 不再误报无响应 minionSalt manage 状态检测修复深度解析 manage.status / manage.up / manage.down 不再误报无响应 minion 导运维配置管理后端创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关推荐

车载以太网H-MTD接口原理与测试工程实践
车载以太网H-MTD接口原理与测试工程实践

1. 为什么车载以太网线束测试接口不能照搬消费电子那一套?车载以太网不是把电脑网线塞进车里就完事了。我第一次在某德系主机厂的ECU测试台架上看到H-MTD接口时,差点以为是某种工业级航空插头——它比标准RJ45宽出近一倍,外壳带金属屏蔽裙边&… · 2026/9/23 12:02:23

笔记本电池健康度下降?先学会电量计校正与日常维护
笔记本电池健康度下降?先学会电量计校正与日常维护

说实话,每次有朋友抱着笔记本跑来找我,说“我这电池是不是废了,一个月不到掉了百分之十几健康度”,我第一反应都是先别急着换电池,先看看是不是电量计在跟你闹脾气。这个问题我处理过太多例了:笔记本用着用… · 2026/9/23 12:02:23

3个时间相对论源码坑点,新手避坑指南
3个时间相对论源码坑点,新手避坑指南

3个时间相对论源码坑点,新手避坑指南 看了一堆教程还是不会写项目?别慌,这不是你笨,是没人告诉你那些藏在底层逻辑里的“时间陷阱”。很多新手在CSDN上搜“时间相对论”,结果跳出来的全是哲学随笔或者游戏特效,根本找不到技术干货。其实,“时间相… · 2026/9/23 12:02:23

担保折算率配置踩坑:3个细节让性能优化效率翻倍
担保折算率配置踩坑:3个细节让性能优化效率翻倍

担保折算率配置踩坑:3个细节让性能优化效率翻倍 刚接手一个金融风控系统,我直接懵了。需求文档里轻飘飘写着“支持动态担保折算率”,我打开代码库,发现这玩意儿藏得比兔子洞还深。最要命的是,本地环境一跑,接口响应时间直接飙到 2… · 2026/9/23 12:40:08

没有CPU的导航计算机:Globus INK机械地球仪如何解算星下点?
没有CPU的导航计算机:Globus INK机械地球仪如何解算星下点?

第一次见到这台仪器的时候我愣了好几秒。仪表盘里镶着一颗地球仪,白色的半球在窗口里缓缓转动,上面还有一个小指针,像在挑什么地方。旁边工程师告诉我,这是苏联飞船上的Globus INK机械导航计算机——它不加电也能给你指着“现在飞… · 2026/9/23 12:40:08

SparX嵌入式视觉推理框架:ARM Cortex-M/A系列裸机部署实战
SparX嵌入式视觉推理框架:ARM Cortex-M/A系列裸机部署实战

简介:本资源是一份面向深度学习与计算机视觉方向研究者及工程师的SparX稀疏跨层连接机制实战项目,聚焦图像分类任务实现,助力读者深入理解前沿视觉Mamba与Transformer模型的优化路径。资源包含2000个文件,主体为1978张训练/验证用… · 2026/9/23 12:40:08

Windows下cuDNN 8.8.0与CUDA 11.x精准安装指南
Windows下cuDNN 8.8.0与CUDA 11.x精准安装指南

简介:本资源为 NVIDIA cuDNN 8.8.0 for Windows x64 官方预编译库包,专为使用 CUDA 11.x 版本进行深度学习开发的 Windows 开发者设计,适用于 PyTorch、TensorFlow 等框架的 GPU 加速环境部署与本地调试。压缩包共含 31 个文件,涵… · 2026/9/23 12:40:02

ESP32-S3 做 8×8 重力液体动画:互斥占格、倾角死区与 60 FPS 调度
ESP32-S3 做 8×8 重力液体动画:互斥占格、倾角死区与 60 FPS 调度

在 88 RGB 点阵上做“液体”效果,看起来像一个简单的粒子动画:读取加速度计,给粒子施加重力,再把粒子画到 LED 上。 但真正上板以后,很容易遇到几个问题: 多个粒子落入同一像素,看起来像凭空消失… · 2026/9/23 12:40:02

AI Logo生成器Looka深度评测:从品牌VI到商业授权的完整指南
AI Logo生成器Looka深度评测:从品牌VI到商业授权的完整指南

做品牌Logo这事,以前是“专业选手”的战场,要掏钱找设计公司,来回改稿磨上十天半个月。后来出来一堆在线Logo生成器,又总觉得模板感太重,换个字体颜色就完事,拿不出手。我自己前前后后试了七八款AI设计工具… · 2026/9/23 12:40:02

3招搞定手机怎么下载微信面试难题实战项目解析
3招搞定手机怎么下载微信面试难题实战项目解析

3招搞定手机怎么下载微信面试难题实战项目解析 面试被问“手机怎么下载微信”背后的原理,90%的人答不上来。别笑,这看似弱智的问题,实则是考察你对移动应用分发机制、安全校验及网络协议理解的试金石。我带过不少校招新人,他们背了八股文,却连一个A… · 2026/9/23 0:00:03

你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型
你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型

你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型 面试被问“高并发下如何保证消息不丢失”,你张口就是“用Redis”,结果面试官追问“如果Redis宕机了怎么办”,你瞬间卡壳。这种场景太常见了,很多新手在背八股文时,只记住了技术名词… · 2026/9/23 0:00:29

Win7无线热点配置工具源码解析:解决API失效的3个实战技巧
Win7无线热点配置工具源码解析:解决API失效的3个实战技巧

Win7无线热点配置工具源码解析:解决API失效的3个实战技巧 Win7无线热点配置工具在Win10/11上跑不动?不是你的问题,是版本升级后 API 全变了。很多老项目里的 netsh wlan… · 2026/9/23 0:00:36

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码