前言
因?yàn)橐恍┰?,設(shè)計(jì)了一套快捷指令,中間涉及到一個(gè)sh腳本的運(yùn)行,通過(guò)快捷指令運(yùn)行時(shí)就會(huì)報(bào)錯(cuò):operation not permitted
奇怪的是在快捷指令窗口下運(yùn)行一切正常,但是從其他地方直接調(diào)用,例如通過(guò)Command+Space 打開Spotlight Search下執(zhí)行就換出現(xiàn)報(bào)錯(cuò)。
以測(cè)試用快捷指令”Mytest“為例,快捷指令窗口下運(yùn)行成功截圖:
通過(guò)Spotlight Search運(yùn)行Mytest失敗截圖:
接下去記錄下整個(gè)排查過(guò)程。
省流:解決辦法:換個(gè)目錄,將腳本從系統(tǒng)目錄移動(dòng)到用戶目錄下。
mv /users/xavier/Downloads/tmp/test.sh /users/xavier/MyScripts/test.sh
?
文章目的:分享排查思路和過(guò)程、介紹SIP
Step 1:初步檢查
遇到 “operation not permitted” 錯(cuò)誤,這通常意味著系統(tǒng)安全設(shè)置或權(quán)限設(shè)置阻止了腳本的執(zhí)行。
接下去進(jìn)行了如下檢查:
- 腳本內(nèi)容:檢查腳本內(nèi)容,確保腳本中沒有嘗試執(zhí)行需要更高權(quán)限的操作。沒問(wèn)題。
-
sh腳本執(zhí)行權(quán)限,
chmod 755 test.sh
,具有可執(zhí)行權(quán)限。沒問(wèn)題 - 系統(tǒng)偏好設(shè)置:打開“系統(tǒng)偏好設(shè)置” > “安全性與隱私” > “隱私”標(biāo)簽頁(yè),檢查“完全磁盤訪問(wèn)”列表,給快捷指令應(yīng)用或終端應(yīng)用(terminal)訪問(wèn)磁盤上文件的權(quán)限。 沒問(wèn)題。
- Gatekeeper 設(shè)置:在“安全性與隱私” > “通用”標(biāo)簽頁(yè)中,設(shè)置允許從“App Store 和被認(rèn)同的開發(fā)者”或“任何來(lái)源”安裝應(yīng)用。沒問(wèn)題
- 管理員權(quán)限:嘗試以管理員身份運(yùn)行sh腳本。無(wú)影響,還是不行。
在我當(dāng)前已有認(rèn)知中所有可能的方法都不能解決問(wèn)題,那么要嘗試定位問(wèn)題產(chǎn)生的原因。
Step 2:日志調(diào)查
這是一個(gè)超出我當(dāng)前認(rèn)知的一個(gè)問(wèn)題,需要一步步排查定位問(wèn)題,目前快捷指令給出的反饋.../test.sh: Operation not permitted
太粗糙,需要找更精細(xì)的報(bào)錯(cuò)日志。
使用MacOS的 控制臺(tái)應(yīng)用(Console.app)以獲取更多關(guān)于錯(cuò)誤的詳細(xì)信息。
又重復(fù)執(zhí)行了一邊快捷指令,使用Console.app抓取日志信息,然后通過(guò)搜索test.sh
定位到詳細(xì)的日志內(nèi)容:
BackgroundShortcutRunner進(jìn)程就是快捷指令app,注意到在它上面有一條kernel進(jìn)程的報(bào)錯(cuò)信息,內(nèi)容如下:
System Policy: bash(1538) deny(1) file-read-data /Users/xavier/Downloads/tmp/test.sh
接下去就是搜索該報(bào)錯(cuò)信息是什么意思,怎么解決。
Step 3:定位問(wèn)題
System Policy: bash(1538) deny(1) file-read-data /Users/xavier/Downloads/tmp/test.sh
通過(guò)搜索得知,這個(gè)日志信息表明 macOS 的系統(tǒng)策略(很可能是 SIP,即 System Integrity Protection)阻止了 bash 進(jìn)程(進(jìn)程ID為1538)讀取 /Users/xavier/Downloads/tmp/test.sh
文件數(shù)據(jù)。
問(wèn)題就在這個(gè)SIP策略。當(dāng)腳本位于受 SIP 保護(hù)的目錄中,或者腳本試圖執(zhí)行被 SIP 保護(hù)的操作,就可能會(huì)遇到權(quán)限問(wèn)題。
這次遇到的情況就是因?yàn)槲覀兊哪_本被放在了受SIP保護(hù)的目錄中,因此解決辦法非常簡(jiǎn)單。
在解決問(wèn)題之前,我想先了解下SIP。
?
SIP是什么?
SIP ,即系統(tǒng)完整性保護(hù)(System Integrity Protection),是 macOS 的一個(gè)安全功能,用于保護(hù)系統(tǒng)文件和目錄,防止這些文件及目錄被沒有特定權(quán)限的進(jìn)程修改,包括root用戶或擁有root權(quán)限的用戶。
SIP通過(guò)一系列內(nèi)核強(qiáng)制實(shí)施的機(jī)制來(lái)達(dá)成這一目標(biāo),它限制了關(guān)鍵系統(tǒng)文件的可寫性,并對(duì)特定關(guān)鍵文件系統(tǒng)位置中的組件進(jìn)行只讀限制。
SIP的保護(hù)范圍包括多個(gè)重要的系統(tǒng)目錄和文件,例如/System、/usr、/bin、/sbin以及OSX的預(yù)裝應(yīng)用。這些目錄和文件在系統(tǒng)啟動(dòng)時(shí)會(huì)被加載,并且對(duì)于保持系統(tǒng)的穩(wěn)定性和安全性至關(guān)重要。SIP確保這些文件和目錄不會(huì)被惡意代碼或其他未經(jīng)授權(quán)的進(jìn)程修改。
Step 4:解決問(wèn)題
之前說(shuō)了這次遇到的問(wèn)題就是因?yàn)槲覀兊哪_本被放在了受SIP保護(hù)的目錄中,因此解決辦法非常簡(jiǎn)單,只需要將腳本換個(gè)位置,放到用戶目錄下即可,SIP 通常不會(huì)阻止讀取用戶目錄下的文件。
移動(dòng)腳本到用戶目錄:
mv /users/xavier/Downloads/tmp/test.sh /users/xavier/MyScripts/test.sh
當(dāng)然還有一種辦法,就是禁用SIP,但是強(qiáng)烈不推薦,后果自負(fù),我沒試過(guò)
- 如果確定需要禁用 SIP 來(lái)運(yùn)行腳本,請(qǐng)小心操作,因?yàn)檫@可能會(huì)降低系統(tǒng)的安全性。
- 在終端運(yùn)行
sudo csrutil status
檢查 SIP 的狀態(tài), - 使用
sudo csrutil disable
,禁用SIP(需要重啟)。
總結(jié)
在排查問(wèn)題過(guò)程中,要盡可能找細(xì)節(jié)全面的日志信息進(jìn)行輔助判斷。
寫程序過(guò)程中也要注意報(bào)錯(cuò)信息處理,能幫助我們更快定位和解決問(wèn)題。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-846548.html
(又水一篇文章~ ?? )文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-846548.html
- 原文:https://bthoughts.top/posts/macos-%E5%88%9D%E8%AF%86sip/
到了這里,關(guān)于MacOS初識(shí)SIP——解決快捷指令sh腳本報(bào)錯(cuò)Operation not permitted的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!