Linux restorecon命令介绍
restorecon(restore file(s) default SELinux security contexts)命令是用来恢复文件或目录的默认SELinux安全上下文的。这个命令主要是用来设置文件的安全上下文(扩展属性),它可以随时运行来修正错误,或者添加新的策略支持,或者使用-n选项来检查文件上下文是否符合预期。如果一个文件对象没有上下文,restorecon会将默认的上下文写入文件对象的扩展属性。如果一个文件对象有上下文,restorecon只会修改上下文的类型部分。使用-F选项可以强制替换整个上下文,包括用户、角色、范围以及类型。
Linux restorecon命令适用的Linux版本
restorecon命令适用于大多数支持SELinux的Linux发行版,如Debian、Ubuntu、Alpine、Arch Linux、Kali Linux、RedHat/CentOS、Fedora、Raspbian等。如果某些Linux发行版没有预装restorecon命令,可以通过安装policycoreutils包来获取。不同的Linux发行版可能使用不同的包管理工具,如apt、yum、dnf、pacman等,安装命令也可能不同。下面是一些常见的Linux发行版的安装命令:
- Debian/Ubuntu/Alpine/Raspbian:
sudo apt install policycoreutils
- RedHat/CentOS 7:
sudo yum install policycoreutils
- RedHat/CentOS 8/Fedora:
sudo dnf install policycoreutils
- Arch Linux:
sudo pacman -S policycoreutils
Linux restorecon命令的基本语法
restorecon命令的基本语法格式如下:
restorecon [-o outfilename] [-R] [-n] [-p] [-v] [-e directory] pathname...
restorecon -f infilename [-o outfilename] [-e directory] [-R] [-n] [-p] [-v] [-F]
其中,方括号表示可选的参数,省略号表示可以有多个的参数。具体的参数说明如下:
-i
:忽略不存在的文件-f infilename
:从infilename文件中读取要处理的文件列表,使用-表示从标准输入读取-e directory
:排除某个目录,可以重复使用该选项来排除多个目录-R -r
:递归地改变文件和目录的上下文-n
:不改变任何文件的上下文,只显示-o outfilename
:将上下文不正确的文件列表保存到outfilename文件中-p
:显示进度,每处理1000个文件打印一个*-v
:显示上下文的变化-F
:强制重置上下文,匹配file_contexts文件中的可定制文件和默认文件上下文,改变用户、角色、范围以及类型pathname...
:要恢复上下文的文件或目录的路径
Linux restorecon命令的常用选项或参数说明
restorecon命令的常用选项或参数说明如下表所示,按照字母顺序排序,选择了20个最常用的选项或参数:
选项或参数 | 说明 |
---|---|
-e directory | 排除某个目录,可以重复使用该选项来排除多个目录 |
-f infilename | 从infilename文件中读取要处理的文件列表,使用-表示从标准输入读取 |
-F | 强制重置上下文,匹配file_contexts文件中的可定制文件和默认文件上下文,改变用户、角色、范围以及类型 |
-i | 忽略不存在的文件 |
-n | 不改变任何文件的上下文,只显示 |
-o outfilename | 将上下文不正确的文件列表保存到outfilename文件中 |
-p | 显示进度,每处理1000个文件打印一个* |
-R -r | 递归地改变文件和目录的上下文 |
-v | 显示上下文的变化 |
pathname... | 要恢复上下文的文件或目录的路径 |
Linux restorecon命令实例详解
下面是一些restorecon命令的实例,结合了最常搜索的关键词,如SELinux、Apache、SSH等,作为标题。实例尽量将选项和参数以及组合的选项和参数覆盖全,先介绍无参实例,然后单参数的常见实例,组合参数的常见实例,选择了15个最常用的实例。
实例1:恢复一个文件的默认上下文
在下面的例子中,index.html文件的上下文类型是user_home_t,这是错误的,Apache无法访问这个文件,会在error_log中显示权限拒绝的错误。使用restorecon命令可以恢复这个文件的默认上下文,类型变为httpd_sys_content_t,这是正确的,Apache可以正常访问这个文件。
[linux@bashcommandnotfound.cn ~]$ cd /var/www/html
[linux@bashcommandnotfound.cn ~]$ ls -lZ index.html
-rw-rw-r--. centos centos unconfined_u:object_r:user_home_t:s0 index.html
[linux@bashcommandnotfound.cn ~]$ restorecon index.html
[linux@bashcommandnotfound.cn ~]$ ls -lZ index.html
-rw-rw-r--. centos centos unconfined_u:object_r:httpd_sys_content_t:s0 index.html
实例2:显示上下文的变化
默认情况下,restorecon命令不会显示它是否改变了文件的上下文。使用-v选项可以在屏幕上显示原来的上下文和新的上下文。
[linux@bashcommandnotfound.cn ~]$ restorecon -v index.html
restorecon reset /var/www/html/index.html context unconfined_u:object_r:user_home_t:s0->unconfined_u:object_r:httpd_sys_content_t:s0
实例3:使用通配符处理多个文件
和其他Linux命令一样,restorecon命令也可以使用通配符来匹配多个文件,如下所示:
[linux@bashcommandnotfound.cn ~]$ restorecon -v *.html # 处理当前目录下所有以.html结尾的文件
[linux@bashcommandnotfound.cn ~]$ restorecon -v * # 处理当前目录下所有的文件
[linux@bashcommandnotfound.cn ~]$ restorecon -v /var/www/html/* # 处理/var/www/html目录下所有的文件
[linux@bashcommandnotfound.cn ~]$ restorecon -v *.htm? # 处理当前目录下所有以.htm或.html或.htm加任意一个字符结尾的文件
实例4:递归地处理文件和目录
restorecon命令也可以递归地恢复文件和目录的上下文,使用-R或-r选项即可,如下所示:
[linux@bashcommandnotfound.cn ~]$ restorecon -R /var/www/html # 处理/var/www/html目录及其子目录下所有的文件和目录
实例5:不改变任何文件的上下文,只显示
如果只想检查文件的上下文是否正确,而不想实际修改它们,可以使用-n选项,这样restorecon命令只会显示上下文的变化,而不会改变任何文件的上下文,如下所示:
[linux@bashcommandnotfound.cn ~]$ restorecon -n -v index.html
restorecon reset /var/www/html/index.html context unconfined_u:object_r:user_home_t:s0->unconfined_u:object_r:httpd_sys_content_t:s0
实例6:将上下文不正确的文件列表保存到文件中
如果想将上下文不正确的文件列表保存到文件中,以便以后处理或分析,可以使用-o选项,指定一个输出文件名,如下所示:
[linux@bashcommandnotfound.cn ~]$ restorecon -n -o badfiles.txt /var/www/html
[linux@bashcommandnotfound.cn ~]$ cat badfiles.txt
/var/www/html/index.html
/var/www/html/about.html
/var/www/html/contact.html
实例7:从文件中读取要处理的文件列表
如果想从文件中读取要处理的文件列表,而不是从命令行参数中指定,可以使用-f选项,指定一个输入文件名,使用-表示从标准输入读取,如下所示:
[linux@bashcommandnotfound.cn ~]$ cat files.txt
/var/www/html/index.html
/var/www/html/about.html
/var/www/html/contact.html
[linux@bashcommandnotfound.cn ~]$ restorecon -f files.txt
[linux@bashcommandnotfound.cn ~]$ restorecon -f - < files.txt # 从标准输入读取
实例8:显示进度
如果想在恢复文件上下文的过程中显示进度,可以使用-p选项,这样restorecon命令会每处理1000个文件打印一个*,如下所示:
[linux@bashcommandnotfound.cn ~]$ restorecon -p -R /var/www/html
restorecon reset /var/www/html/index.html context unconfined_u:object_r:user_home_t:s0->unconfined_u:object_r:httpd_sys_content_t:s0
restorecon reset /var/www/html/about.html context unconfined_u:object_r:user_home_t:s0->unconfined_u:object_r:httpd_sys_content_t:s0
restorecon reset /var/www/html/contact.html context unconfined_u:object_r:user_home_t:s0->unconfined_u:object_r:httpd_sys_content_t:s0
*
实例9:排除某个目录
如果想排除某个目录,不让restorecon命令处理它,可以使用-e选项,指定一个目录名,可以重复使用该选项来排除多个目录,如下所示:
[linux@bashcommandnotfound.cn ~]$ restorecon -R -e /var/www/html/images /var/www/html # 排除/var/www/html/images目录
[linux@bashcommandnotfound.cn ~]$ restorecon -R -e /var/www/html/images -e /var/www/html/css /var/www/html # 排除/var/www/html/images和/var/www/html/css目录
实例10:强制重置上下文
默认情况下,restorecon命令只会修改文件上下文的类型部分,而不会改变用户、角色、范围等其他部分。如果想强制重置整个上下文,匹配file_contexts文件中的可定制文件和默认文件上下文,可以使用-F选项,如下所示:
[linux@bashcommandnotfound.cn ~]$ ls -lZ index.html
-rw-rw-r--. centos centos user_u:object_r:user_home_t:s0 index.html
[linux@bashcommandnotfound.cn ~]$ restorecon -F index.html
[linux@bashcommandnotfound.cn ~]$ ls -lZ index.html
-rw-rw-r--. centos centos system_u:object_r:httpd_sys_content_t:s0 index.html
实例11:忽略不存在的文件
如果从文件中读取要处理的文件列表,可能会遇到一些不存在的文件,这时restorecon命令会报错并退出。如果想忽略不存在的文件,可以使用-i选项,如下所示:
[linux@bashcommandnotfound.cn ~]$ cat files.txt
/var/www/html/index.html
/var/www/html/about.html
/var/www/html/contact.html
/var/www/html/missing.html # 这个文件不存在
[linux@bashcommandnotfound.cn ~]$ restorecon -f files.txt
restorecon: lstat(/var/www/html/missing.html) failed: No such file or directory
[linux@bashcommandnotfound.cn ~]$ restorecon -i -f files.txt # 使用-i选项忽略不存在的文件
实例12:恢复SSH服务的上下文
如果SSH服务无法正常工作,可能是因为它的配置文件或密钥文件的上下文不正确,可以使用restorecon命令来恢复它们的上下文,如下所示:
[linux@bashcommandnotfound.cn ~]$ restorecon -R /etc/ssh # 恢复/etc/ssh目录及其子目录下所有文件的上下文
[linux@bashcommandnotfound.cn ~]$ restorecon -R /root/.ssh # 恢复/root/.ssh目录及其子目录下所有文件的上下文
[linux@bashcommandnotfound.cn ~]$ restorecon -R /home/*/.ssh # 恢复/home目录下所有用户的.ssh目录及其子目录下所有文件的上下文
实例13:恢复Apache服务的上下文
如果Apache服务无法正常工作,可能是因为它的配置文件或网站文件的上下文不正确,可以使用restorecon命令来恢复它们的上下文,如下所示:
[linux@bashcommandnotfound.cn ~]$ restorecon -R /etc/httpd # 恢复/etc/httpd目录及其子目录下所有文件的上下文
[linux@bashcommandnotfound.cn ~]$ restorecon -R /var/www # 恢复/var/www目录及其子目录下所有文件的上下文
实例14:恢复SELinux策略的上下文
如果SELinux策略文件的上下文不正确,可能会导致SELinux无法正常工作,可以使用restorecon命令来恢复它们的上下文,如下所示:
[linux@bashcommandnotfound.cn ~]$ restorecon -R /etc/selinux # 恢复/etc/selinux目录及其子目录下所有文件的上下文
[linux@bashcommandnotfound.cn ~]$ restorecon -R /usr/share/selinux # 恢复/usr/share/selinux目录及其子目录下所有文件的上下文
实例15:恢复系统所有文件的上下文
如果系统中的很多文件的上下文都不正确,可能会导致很多服务无法正常工作,可以使用restorecon命令来恢复系统所有文件的上下文,如下所示:
[linux@bashcommandnotfound.cn ~]$ restorecon -R / # 恢复根目录及其子目录下所有文件的上下文,这可能需要很长时间
Linux restorecon命令的注意事项
使用restorecon命令时,有以下几点需要注意:
- restorecon命令只能恢复文件的默认上下文,如果文件的上下文是自定义的,需要使用chcon命令来修改。
- restorecon命令只能恢复文件的上下文,如果需要恢复进程的上下文,需要使用runcon命令来执行。
- restorecon命令依赖于/etc/selinux目录下的file_contexts文件,这个文件定义了文件的默认上下文,如果这个文件被修改或损坏,restorecon命令可能无法正常工作。
- 如果在执行restorecon命令时遇到bash: restorecon: command not found的错误,说明restorecon命令没有安装,需要按照前面介绍的方法安装policycoreutils包。
- 如果在执行restorecon命令时遇到Operation not supported的错误,说明文件系统不支持SELinux的扩展属性,需要检查文件系统的类型和挂载选项,或者使用其他文件系统。
- 如果在执行restorecon命令时遇到Permission denied的错误,说明没有足够的权限来修改文件的上下文,需要使用sudo或su命令来提升权限。
评论区