侧边栏壁纸
Linux入门自学网博主等级

每日学一条Linux命令,终成Linux大神

  • 累计撰写 725 篇文章
  • 累计创建 143 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

Linux restorecon命令教程:恢复文件或目录的默认SELinux安全上下文(附实例详解和注意事项)

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命令来提升权限。
0

评论区