MacOS初识SIP——解决快捷指令sh脚本报错Operation not permitted

前言

因为一些原因,设计了一套快捷指令,中间涉及到一个sh脚本的运行,通过快捷指令运行时就会报错:operation not permitted

奇怪的是在快捷指令窗口下运行一切正常,但是从其他地方直接调用,例如通过Command+Space 打开Spotlight Search下执行就换出现报错。

以测试用快捷指令”Mytest“为例,快捷指令窗口下运行成功截图:

1

通过Spotlight Search运行Mytest失败截图:

在这里插入图片描述

接下去记录下整个排查过程。

省流:解决办法:换个目录,将脚本从系统目录移动到用户目录下。

mv /users/xavier/Downloads/tmp/test.sh /users/xavier/MyScripts/test.sh

文章目的:分享排查思路和过程、介绍SIP

Step 1:初步检查

遇到 “operation not permitted” 错误,这通常意味着系统安全设置或权限设置阻止了脚本的执行。

接下去进行了如下检查:

  1. 脚本内容:检查脚本内容,确保脚本中没有尝试执行需要更高权限的操作。没问题。
  2. sh脚本执行权限chmod 755 test.sh,具有可执行权限。没问题
  3. 系统偏好设置:打开“系统偏好设置” > “安全性与隐私” > “隐私”标签页,检查“完全磁盘访问”列表,给快捷指令应用或终端应用(terminal)访问磁盘上文件的权限。 没问题。
  4. Gatekeeper 设置:在“安全性与隐私” > “通用”标签页中,设置允许从“App Store 和被认同的开发者”或“任何来源”安装应用。没问题
  5. 管理员权限:尝试以管理员身份运行sh脚本。无影响,还是不行。

在我当前已有认知中所有可能的方法都不能解决问题,那么要尝试定位问题产生的原因。

Step 2:日志调查

这是一个超出我当前认知的一个问题,需要一步步排查定位问题,目前快捷指令给出的反馈.../test.sh: Operation not permitted太粗糙,需要找更精细的报错日志。

使用MacOS的 控制台应用(Console.app)以获取更多关于错误的详细信息。

又重复执行了一边快捷指令,使用Console.app抓取日志信息,然后通过搜索test.sh定位到详细的日志内容:

在这里插入图片描述

BackgroundShortcutRunner进程就是快捷指令app,注意到在它上面有一条kernel进程的报错信息,内容如下:

System Policy: bash(1538) deny(1) file-read-data /Users/xavier/Downloads/tmp/test.sh

接下去就是搜索该报错信息是什么意思,怎么解决。

Step 3:定位问题

System Policy: bash(1538) deny(1) file-read-data /Users/xavier/Downloads/tmp/test.sh

通过搜索得知,这个日志信息表明 macOS 的系统策略(很可能是 SIP,即 System Integrity Protection)阻止了 bash 进程(进程ID为1538)读取 /Users/xavier/Downloads/tmp/test.sh 文件数据。

问题就在这个SIP策略。当脚本位于受 SIP 保护的目录中,或者脚本试图执行被 SIP 保护的操作,就可能会遇到权限问题。

这次遇到的情况就是因为我们的脚本被放在了受SIP保护的目录中,因此解决办法非常简单。

在解决问题之前,我想先了解下SIP。

SIP是什么?

SIP ,即系统完整性保护(System Integrity Protection),是 macOS 的一个安全功能,用于保护系统文件和目录,防止这些文件及目录被没有特定权限的进程修改,包括root用户或拥有root权限的用户。

SIP通过一系列内核强制实施的机制来达成这一目标,它限制了关键系统文件的可写性,并对特定关键文件系统位置中的组件进行只读限制。

SIP的保护范围包括多个重要的系统目录和文件,例如/System、/usr、/bin、/sbin以及OSX的预装应用。这些目录和文件在系统启动时会被加载,并且对于保持系统的稳定性和安全性至关重要。SIP确保这些文件和目录不会被恶意代码或其他未经授权的进程修改。

Step 4:解决问题

之前说了这次遇到的问题就是因为我们的脚本被放在了受SIP保护的目录中,因此解决办法非常简单,只需要将脚本换个位置,放到用户目录下即可,SIP 通常不会阻止读取用户目录下的文件。

移动脚本到用户目录

mv /users/xavier/Downloads/tmp/test.sh /users/xavier/MyScripts/test.sh

当然还有一种办法,就是禁用SIP,但是强烈不推荐,后果自负,我没试过

  • 如果确定需要禁用 SIP 来运行脚本,请小心操作,因为这可能会降低系统的安全性。
  • 在终端运行 sudo csrutil status 检查 SIP 的状态,
  • 使用 sudo csrutil disable ,禁用SIP(需要重启)。

总结

在排查问题过程中,要尽可能找细节全面的日志信息进行辅助判断。

写程序过程中也要注意报错信息处理,能帮助我们更快定位和解决问题。

(又水一篇文章~ 😆 )

  • 原文:https://bthoughts.top/posts/macos-%E5%88%9D%E8%AF%86sip/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/804259.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微服务 - (狂神)

什么是微服务: 微服务方案: 1. SpringCloud NetFlix 2. Dubbo 3. SpringCloud Alibaba 解决了什么问题: 1. 服务过多,客户端怎么访问 2. 服务过多,服务间怎么传值 3. 服务过多,如何治理 4. 服务过多…

【Flutter】三个Channel(Android-java / Ios-swift)

Channel 实现与原生通信 【1】MethodChannel flutter MethodChannel官方文档 通过MethodChannel来传递数据,调用方法 案例 分别调用Android和Ios原生的获取电量的方法 Flutter端 实例一个MethodChannel, 唯一标识name,定义方法名称get…

JavaScript ECMAScript标准的与时俱进:从ES6至ES14的革新之路与关键技术特性剖析

ECMAScript(通常缩写为ES)是一种标准化的脚本语言规范,由ECMA International(前身为European Computer Manufacturers Association,欧洲计算机制造商协会)制定。自1997年发布首个版本以来,ECMAS…

设计模式之创建型模式---建造者模式

文章目录 建造者模式概述经典的建造者模式建造者模式的变种总结 建造者模式概述 建造者模式是一种广泛使用的设计模式,在三方开源库和各种SDK中经常见到。建造者设计模式在四人帮的经典著作《设计模式:可复用面向对象软件基础》中被提及,它的…

搭建前后端的链接(java)

搭建前后端的链接(java) 一.前提 1.1 javaEE 搭建前后端的链接首先需要用到javaEE,也就是java企业版,也就是java后端(后端javaSE) 利用javaEE和前端交互,javaSE和数据库交互,javaSE和javaEE之间再进行交互就实现了前后端的交互…

语音识别(录音与语音播报)

语音识别(录音与语音播报) 简介 语音识别人工智能技术的应用领域非常广泛,常见的应用系统有:语音输入系统,相对于键盘输入方法,它更符合人的日常习惯,也更自然、更高效;语音控制系…

JVM—垃圾收集器

JVM—垃圾收集器 什么是垃圾 没有被引用的对象就是垃圾。 怎么找到垃圾 引用计数法 当对象引用消失,对象就称为垃圾。 对象消失一个引用,计数减去一,当引用都消失了,计数就会变为0.此时这个对象就会变成垃圾。 在堆内存中主…

C++设计模式:抽象工厂模式(七)

1、定义与动机 抽象工厂定义:提供一个接口,让该接口负责创建一系列“相关或者相互依赖的对象”,无需指定它们具体的类动机: 在软件系统中,经常面临着“一系列相互依赖的对象”的创建工作;同时,…

人工智能——深度学习

4. 深度学习 4.1. 概念 深度学习是一种机器学习的分支,旨在通过构建和训练多层神经网络模型来实现数据的高级特征表达和复杂模式识别。与传统机器学习算法相比,深度学习具有以下特点: 多层表示学习:深度学习使用深层神经网络&a…

麒麟KOS删除鼠标右键新建菜单里不需要的选项

原文链接:麒麟KOS删除鼠标右键新建菜单里不需要的选项 Hello,大家好啊!在日常使用麒麟KOS操作系统时,我们可能会发现鼠标右键新建菜单里包含了一些不常用或者不需要的选项。这不仅影响我们的使用效率,也让菜单显得杂乱…

新能源电力行业设备点巡检系统的应用

新能源电力行业正日益成为全球能源结构的重要支柱,其设备点巡检系统作为确保电力设施安全、高效运行的关键环节,正受到业界的广泛关注和应用。 设备点巡检系统是一种集数据采集、实时监控、智能分析于一体的现代化管理工具。在新能源电力行业中&#xff…

Java常见算法_常见的查找算法和排序算法——简介及代码演示

在本文中我将介绍Java中的常见算法,查找算法包括基本查找、二分查找、插值查找和分块查找。排序算法包括冒泡排序、选择排序、插入排序和快速排序 查找算法: 1.基本查找: 代码: public class BasicSearchDemo {public static …

SpringMVC:搭建第一个web项目并配置视图解析器

👉需求:用spring mvc框架搭建web项目,通过配置视图解析器达到jsp页面不得直接访问,实现基本的输出“hello world”功能。👩‍💻👩‍💻👩‍💻 1 创建web项目 1…

如何解决Python包管理问题:ERROR: Could not find a version that satisfies the requirement

如何解决Python包管理问题:“ERROR: Could not find a version that satisfies the requirement” 文章目录 如何解决Python包管理问题:“ERROR: Could not find a version that satisfies the requirement”错误描述问题分析解决方案检查包名确保网络连…

【JVM】面试题汇总

JVM1. 什么是JVM?2. 了解过字节码文件的组成吗?3. 什么是运行时数据区4. 哪些区域会出现内存溢出5. JVM在JDK6-8之间在内存区域上有什么不同 6. 类的生命周期 7. 什么是类加载器?类加载器有哪几种 8. 什么是双亲委派机制?有什么好…

“国字号”荣誉、全国试点,侨乡群众身边的“放心”公证处

日前,我市五邑公证处获评“全国公共法律服务工作先进集体”称号。 走进公证处,首先映入眼帘的是一间宽敞明亮的大厅,办证点内还设置多个独立办证室,工作人员热情地为前来办理业务的市民提供专业、人性化的公证服务。江门市五邑公证…

Windows上面搭建Flutter Android运行环境

Flutter Android环境搭建 电脑上面安装配置JDK电脑上下载安装Android Studio电脑上面下载配置Flutter Sdk (避坑点一)下载SDK配置对应的环境变量 到path 电脑上配置Flutter国内镜像运行 flutter doctor命令检测环境是否配置成功创建运行Flutter项目&…

ARM单片机的GPIO口在控制不同LED、按键时的设置

个人备忘,不喜勿喷。 GPIO口在驱动共阴极、共阳极LED灯时需要不同的初始化设置 对于这一类的led灯: 最好选择推挽、上拉、高速输出,同时IO口初始化时需要拉高。 上面这种需要下拉输入; 上图这种需要上拉输入,这样才…

vue点击上传图片并实现图片预览功能,并实现多张图片放到一个数组中进行后端请求(使用原生input)

一、将 File 对象转成 BASE64 字符串 &#xff08;FileReader&#xff09; <template><div><!-- 用来显示封面的图片 --><!-- <img src"/assets/images/cover.jpg" alt"" class"cover-img" ref"imgRef" />…

html基础(2)(链接、图像、表格、列表、id、块)

1、链接 <a href"https://www.example.com" target"_blank" title"Example Link">Click here</a> 在上示例中&#xff0c;定义了一个链接&#xff0c;在网页中显示为Click here&#xff0c;鼠标悬停指示为Example Link&#xff0c…