前情提要
本来都好好的,我重启了服务器以后就开始报这个错了,而我的麒麟服务器目前是这个情况:
- 已经在服务器上配置好了 ssh 免密登录,在命令行里执行
ssh -o StrictHostKeyChecking=no -p 22 username@xxx.xxx.xxx.xxx
可以正常登录 - 可执行文件存在于 /tmp 中
- 查看可执行文件目录的权限,发现权限是
drwxrwxr-x
,而可执行文件的权限是-rwxr-xr-x
,对于 user 本身来说,应该是可以执行的(对于linux文件权限不太了解的可以看文章【Linux】权限 一)
找bug的心路历程
我本来以为是 ssh 的权限问题,网上查到最多的解决方法就是像下面两篇这样:
- linux scp传输文件权限被拒绝,Linux的远程传输文件scp及出现Permission denied (publickey).lost connection问题解决方法…
- Ubuntu下scp命令出现permission denied错误的解决
修改/etc/ssh/sshd_config,但是对于我已经配置好免密登录的服务器来说,这一步着实没什么必要,和我遇到的问题基本没有关系
看了半天才发现我的报错原来不是单纯的Permission denied,前面还有一个 bash: Permission denied(没看清楚,汗流浃背了)
又看到了 解决linux的-bash: ./xx: Permission denied 这篇,说是权限问题,但是我的文件夹和文件权限都属于可执行的
看了半天,终于从 /tmp 目录下执行脚本失败提示 Permission denied 这篇里找到了线索:
发现是/tmp文件系统的属性被设置了noexec。noexec表示对应文件系统不允许执行可执行程序,即使文件具有可执行过权限。通常是考虑安全原因会这么设置。
可能是服务器重启后,重新打开了某个安全设置
于是,我顺藤摸瓜,找到了这篇云服务器 ECS Linux 系统 tmp 目录的安全设置,按照文内的验证方法,在 /tmp 目录下随便建了个 test.sh
文件,手动执行 bash test.sh
,终于发现了问题:
[麒麟安全授权认证]
检测到未认证程序试图执行,是否允许?
程序:test.sh 调用者:bash
路径:/tmp/test.sh
禁止(N) 允许(Y) 本次允许(O):
输入 Y 后才能正常执行
再搜索,找到了这篇:Linux麒麟系统(V10)rc.local开机不启动,在命令行中执行
getstatus
得到了和博主一样的结果:
KySec status: enabled // 表示当前为强制模式
exec control : warning // 表示当前执行控制功能为警告
net control : off // 表示当前网络控制功能关闭
file protect : on // 表示当前文件保护功能为开启 (只有当相应功能的状态为(on)的时候,其所控制的功能配置才能生效)
kmod protect : on // 表示当前内核模块保护功能为开启
three admin : off // 表示当前三权分立状态为关
process protect : off // 表示当前进程保护功能为开启
参考
KySec有三种安全模式:① 强制模式(Normal):出现违规操作时,不止会审计记录该操作,还会阻止该操作的运行;② 警告模式(Warning):出现违规操作时,会弹出麒麟安全授权认证框进行授权(在上面2023.3.18问题中提到的弹窗);③ 软模式(Softmode):出现违规操作时,只会审计该操作,而不会阻止该操作的运行。
于是,直接执行
sudo setstatus softmode
把它关掉了,此时再执行 getstatus
,就会得到
KySec status: enabled(softmode)
exec control: off
net control : off
file protect: off
kmod protect: off
three admin : off
process protect: off
device control: off
此时再创建一个 test2.sh
,并且执行 bash test2.sh
就没有安全授权认证了,问题搞定~