好的,我编写了一堆bash
&python
脚本,它们都放在一个大目录中。实际上,它们有单独的子目录,但它们都嵌套在这个主目录中。
因此,为了便于讨论,目录结构如下所示:
find . -type d
.
./scripts/sh
./scripts/sh/a
./scripts/sh/b
./scripts/sh/c
./scripts/py
./scripts/py/x
./scripts/py/y
./scripts/py/z
find
无论如何,我尝试使用和一举使整个脚本集合可执行chmod
:
find . -type f -exec chmod +x {} +
通常情况下,这就是我所要做的全部工作,但我注意到该+x
位仍未设置。他们的所有权限仍然如下所示:
ls -l ./scripts/py/z
-rw-rw----. 1 root 1015 801 May 7 12:00 script_name.py
据说。.
字符(权限标志后面)表示某种 SELinux 安全上下文,带有访问控制列表或类似内容。我检查了一下getfacl
,不知道该找什么;第一个是目录,第二个是脚本文件之一:
getfacl -acp ./scripts/py/z &&
getfacl -acp ./scripts/py/z/*
user::rwx
group::rwx
other::--x
user::rw-
group::rw-
other::---
我尝试了以下setfacl
选项,但无济于事:
setfacl --help | grep 'remove'
-x, --remove=acl remove entries from the ACL(s) of file(s)
-X, --remove-file=file read ACL entries to remove from file
-b, --remove-all remove all extended ACL entries
-k, --remove-default remove the default ACL
root
因此,在用户权限不受尊重且sudo
毫无用处的情况下,我不得不问;我该如何重新获得对自己文件的访问控制权?
答案1
ACL 和 SELinux 上下文完全不同。这里有一个很好的教程这里对于 CentOS
要查看 SELinux 是否确实阻止了您的访问,请使用sestatus
$ sestatus
SELinux status: enabled
SELinuxfs mount: /sys/fs/selinux
SELinux root directory: /etc/selinux
Loaded policy name: targeted
Current mode: enforcing
Mode from config file: enforcing
Policy MLS status: enabled
Policy deny_unknown status: allowed
Max kernel policy version: 28
Enforcing
我的输出表明 SELinux 正在积极阻止脱离上下文的访问。
使用以下方法临时将 SELinux 设置为宽容# sudo setenforce Permissive
$ sudo setenforce Permissive
[sudo] password for trogdor:
$ sestatus
SELinux status: enabled
SELinuxfs mount: /sys/fs/selinux
SELinux root directory: /etc/selinux
Loaded policy name: targeted
Current mode: permissive
Mode from config file: enforcing
Policy MLS status: enabled
Policy deny_unknown status: allowed
Max kernel policy version: 28
宽容模式仍会提醒您 SELinux 上下文违规,但不会阻止它们。这是检查 SELinux 是否真的是问题所在的绝佳方法。如果是,并且现在一切正常,请使用 将 SELinux 重新设置为强制执行sudo setenforce Enforcing
。(顺便说一句,使用 setenforce 对 SELinux 的更改不会在重启后生效)。
如果问题出在 SELinux 上,那么您必须找到脚本应有的正确上下文,或者也许可以使用布尔值进行简单修复。
如果您在主目录中,则只需设置 SELinux 布尔值即可。要查看布尔值,请参阅 CentOS 布尔值的描述这里但我注意到下面的 user_exec_content 示例未列出,用于布尔描述的更方便的工具是 semanage boolean -l
# getsebool -a | grep exec
...
user_exec_content --> off
...
#sudo semanage boolean -l
...
user_exec_content (off , off) Allow user to exec content
...
第一个 off 显示其当前状态,即当前设置为关闭;下一个 off 显示默认状态,这意味着在重新启动或文件系统重新标记后它仍然处于关闭状态。
在这种情况下,使用#setsebool -P user_exec_content on
-P 标志可以使布尔更改在重新启动后永久生效
如果是上下文问题,那很好,上下文更易于使用,因为它们更直观。对于 SELinux 布尔值的实际作用,似乎需要反复试验和积累经验,例如,不知道 user_exec_content 的实际作用。
使用带有 -Z 标志的 ls 来查看文件的上下文,例如 ls -alZ。
$ ls -alZ
-rwxrwxr-x. trogdor trogdor unconfined_u:object_r:user_home_t:s0 backup.sh
这里用户主页是 backup.sh 的上下文。假设您有另一个目录具有执行脚本的正确上下文,则可以使用以下命令将该上下文镜像到 ./scripts 目录中:
# chcon -R --reference /onethatworks ./scripts
要仔细检查是否进行了更改,请使用ls -alZ ./scripts
restorecon -Rv ./scripts
应重新标记文件系统,将所有文件和目录递归地重新标记到更新后的上下文。在本例中,它只执行脚本目录及其内容。
如果可行,则此处所做的更改将不会在重启后生效,您可以使用以下命令使更改永久生效。
# semanage fcontext -a -s system_u -t <context_that_worked> "./scripts(/.*)?
管理 SELinux 的另一种选择是安装,policycoreutils-gui
这样您就可以通过输入 来访问 selinux 配置 gui # system-config-selinux
。通过使用“脚本”进行过滤,我发现许多脚本使用 bin_t 作为其上下文。您还可以使用它更改强制模式。我的主目录中的脚本可以顺利执行,user_home_t
但如果您遇到这些问题,我怀疑您在其他地方。