麒麟 V10 SP1 踩坑:`./startup.sh` 报“解释器错误: 权限不够“,根因是 KySec

麒麟 V10 SP1 踩坑:`./startup.sh` 报“解释器错误: 权限不够“,根因是 KySec
麒麟 V10 SP1 踩坑./startup.sh报解释器错误: 权限不够根因是 KySec一台麒麟 V10 SP1 的开发机一个再普通不过的./startup.sh start先后试了sudo bash、chmod x、换用户su全卡在同一个报错上。最后发现拦路的是麒麟自带的KySec——这篇把现象、误判点、根因、长期解法一次记清楚。一、现象还原脚本是一个 Spring Boot Jar 的启停封装startup.sh放在用户家目录下的service/里$ ./startup.sh start -bash: ./startup.sh/bin/bash解释器错误: 权限不够第一反应是权限问题于是常规三连$ls-lstartup.sh -rwxrwxr-x1appuser appuser35027月117:13 startup.sh# x 位明明在$chmodx startup.sh $ ./startup.sh start# 照样报$sudobash./startup.sh start KYSEC: 权限不够# sudo 都不行反而多了个 KYSEC 前缀连bash startup.sh start也拦基本可以排除❌ 脚本没 x 位❌ shebang 写错#!/bin/bash没问题❌ 所在分区noexecmount | grep noexec只命中 sysfs/proc/tmpfs/cgroup 这些伪文件系统家目录不在列二、根因KySec 的exec control enforcing麒麟 V10 系列内置了一个叫KySec的内核安全模块定位类似 SELinux但策略更国产桌面/服务器向。其中有一个开关$ getstatus KySec status: enabledexeccontrol:enforcing ← 关键 net control:offfileprotect:on kmod protect:on...exec control enforcing的含义是非白名单路径/非白名单文件禁止 execve。用户家目录~/service/startup.sh不在 KySec 默认信任路径/usr/bin、/opt/规范厂商/之类里于是执行方式实际发生了什么./startup.sh内核走 shebang 拉/bin/bash去 exec 脚本体 → KySec 拦 → bash 报解释器错误: 权限不够bash startup.shbash 直接 exec 脚本 → KySec 拦 → 吐KYSEC: 权限不够sudo bash startup.shKySec 不认 sudo 提权免检照样拦为什么su appuser再跑又能过因为切换后的执行上下文落在appuser 自家$HOME下已加入白名单或 kysec 对属主自执行放宽的路径里不是 sudo 上下文能比的。三、临时绕过验证用sudosetstatus-fexectl off ./startup.sh start# [OK] 启动成功关掉exectl立刻能跑证明判错 100% 在 KySec。但这个关法是临时的重启会根据/etc/kysec.conf回弹回enforcing不适合生产长期挂着。四、长期方案按推荐度✅ 方案 A给脚本打 KySec 白名单 xattr最干净KySec 支持给单个文件打security.kysec.exec扩展属性等于 per-file 放行sudosetfattr-nsecurity.kysec.exec-vallowed/home/appuser/service/startup.shsudosetfattr-nsecurity.kysec.exec-vallowed/opt/myapp/service/startup.sh验证getfattr-nsecurity.kysec.exec /home/appuser/service/startup.sh# security.kysec.execallowed打完再把exectl开回 enforcing脚本照跑等保也过得去。✅ 方案 B迁到/opt/应用名/规范路径麒麟 KySec 对/opt/vendor/下的 exec 默认放行程度高于家目录具体看/etc/kysec.conf的[exec]段。把整套service/ jar 挪过去启停路径跟着改也能绕。⚠️ 方案 Cwarning代替offsudosetstatus-fexectl warningwarning是拦但记日志dmesg / audit 可见调试期友好off是完全不检等保扫描可能扣分不建议生产。❌ 不推荐的持久化EXEC_CONTROLoffsudosed-is/^EXEC_CONTROL.*/EXEC_CONTROLoff//etc/kysec.conf除非是纯内网开发机否则别这么干KySec 其他防护file protect / kmod protect还是有用的。五、顺手提一句改成 systemd 更省事如果这个启停最终是要上服务器的其实可以干脆把startup.sh jar包成 systemd service# /etc/systemd/system/myapp.service [Unit] DescriptionMyApp Service Afternetwork.target [Service] Typeforking Userappuser ExecStart/opt/myapp/service/startup.sh start ExecStop/opt/myapp/service/startup.sh stop PIDFile/opt/myapp/service/myapp.pid [Install] WantedBymulti-user.targetsystemd 托管的服务KySec 走的是另一套放行逻辑跟着 service 上下文不是用户 shell exec连exectl这档事都不用操心sudosystemctl daemon-reloadsudosystemctl start myappsudosystemctlenablemyapp六、一句话复盘麒麟上报解释器错误: 权限不够sudo都不行但 x 位、noexec、shebang 都没问题时——先getstatus看一眼 KySec 的exec control。临时setstatus -f exectl off能验长期用setfattr打白名单或用 systemd 托管比一直关 exectl 稳。环境Kylin Linux Advanced Server V10 (SP1) / KySec 3.x。同款踩坑的可以对号入座。