从文件中删除 -i(不可变)属性

要删除“i”属性,请使用以下命令。

# chattr -i geek.txt    # Unset "i" attribute

删除属性后,我们将看到权限部分将变为空白。

# lsattr geek.txt     
--------------- geek.txt
现在使用 cat 命令确认相同
# cat onitroad.txt 
Welcome to onitroad.com
Here you will get Linux Tutorials

这样我们就可以成功地在 onitroad.txt 中追加数据了。
现在让我们尝试删除该文件。

# rm onitroad.txt        # Deleting the File
rm: remove regular file `onitroad.txt'? y
rm: cannot remove `onitroad.txt': Operation not permitted
# rm -rf onitroad.txt        # Deleting the File Forcefully
rm: cannot remove `onitroad.txt': Operation not permitted

有关 chattr 命令的更多信息,我们可以在 linux 系统上使用以下命令。

# man chattr
# man lsattr

查看一些有用的 chattr 命令选项:

  • +i - 带有 +i 属性的文件不能被删除、移动、重命名。总之不能修改。
  • -i - 此选项允许从文件中删除 i 属性。
  • -V - 查看详细输出
  • -a - 使用此属性将只允许在文件上添加数据,不能删除或者移动。

使用 chattr 使目录不可变

现在让我们尝试通过使用 chattr 命令递归更改目录的属性来保护目录。
这里我有一个名为 data 的目录,每个人都可以递归地访问该目录。
请参阅下面的示例输出。

# mkdir data
# chmod -R 777 data/
# ls -l
total 4
drwxrwxrwx. 2 root root 4096 Apr 24 04:25 data

现在将属性设置为该目录。

# chattr +i data/
# lsattr 
----i--------e- ./data

我们还可以使用带有 chattr 的 -R 选项以递归方式设置属性。

# chattr -R +i data/

将属性设置为目录后,现在尝试删除、移动或者创建文件,我相信我们将不允许执行任何操作。
请参阅下面的示例输出。

# rmdir data/        # Deleting the Directory
rmdir: failed to remove `data/': Operation not permitted
# rm -rf data/        # Deletiing the Directory Forcefully
rm: cannot remove `data': Operation not permitted
# mv data/ mydata       # Moving the Directory
mv: cannot move `data/' to `mydata': Operation not permitted
# cd data/
# cat > test.txt       # Creating a File in the directory
bash: test.txt: Permission denied

允许使用 chattr 命令添加文件

我们可以使用带有选项 +a 的 chattr 命令允许文件添加数据。
通过应用此属性,我们只能在该文件上写入数据,而不允许删除和移动。

在这里,我允许用户在 onitroad.txt 文件中添加数据。

# chattr +a onitroad.txt         # Setting +a Attribute

要检查应用的属性,请使用以下命令。
我们会注意到许可部分。

# lsattr onitroad.txt 
-----a-------e- onitroad.txt

正如我们在下面看到的,我们能够看到文件的内容。

# cat onitroad.txt 
Welcome to onitroad.com

现在让我们尝试在文件中添加一些数据。

# cat >> onitroad.txt      # Writing some data
Here you will get Linux Tutorials
chattr 命令示例

文件还可以具有以不同于我们目前所见权限的另一种方式表达的属性。
一个例子是使文件不可变(一个花哨的词,这意味着它不能被更改)。
不可变文件仍然具有正常的所有权和组以及 RWX 权限,但它不会允许用户更改它,即使它包含可写权限。
另一个特点是文件不能重命名。

在这篇文章中,我们将讨论如何在 Linux 中使用 chattr 命令更改文件属性并使重要文件不可变。
chattr 代表更改属性。
chattr 命令是 Linux 中一个非常有用的工具,用于更改文件属性。
不可变意味着一旦我使用 chattr 命令为某个文件设置了属性,那么即使我们对该文件具有完全访问权限,我们也将无法移动该文件、删除该文件、创建该文件的链接或者编辑该文件。
在应用该属性之前,root 用户也无法对该文件进行任何更改。
我们可以使用 chattr 命令来设置和取消设置文件的属性。
root 用户只能使用 chattr 命令来设置或者取消设置文件和目录的属性。

因此,让我们看一下 chattr 命令更改文件属性的一些示例:

欢迎 on it road

我们实际上可以在哪里使用 chattr 命令?

让我们举个例子:作为一名 Linux 管理员,显然你不希望任何人访问你的配置文件、更改任何文件或者删除任何配置文件或者滥用它。
我们有责任确保它安全并防止无权访问它的坏人。
我们可以使用 chattr 命令来保护我们所有的配置内容。

在 Linux 中,所有配置文件都存储在 /etc 目录中。
如果我们将属性设置为 /etc 目录,则无法访问任何配置。
所以让我们这样做。

# chattr +i /etc/     # Setting attribute to /etc directory

现在让我们尝试做一些任务:

示例:1 创建一个组

# groupadd g5
groupadd: cannot lock /etc/group; try again later.

示例:2 为任何用户设置密码

# passwd michelle
Changing password for user michelle.
New password: 
Retype new password: 
passwd: Authentication token manipulation error

示例:3 创建新用户

# useradd onitroad
useradd: cannot lock /etc/passwd; try again later.

正如我们在上面看到的,我们无法执行一些任务,例如创建新用户、为任何用户设置密码、创建新组。
我们无法完成所有这些任务,因为当我们创建一个新用户或者为任何用户设置密码时,它会更新 /etc/passwd 文件和 /etc/shadow 文件,因为我们为完整的 /etc 目录设置了属性,所以这里不可能。

注意:这里我设置了完整的/etc目录属性只是为了给大家举例说明。
但是我们可以根据需要设置文件属性,例如,如果我们只想控制用户和组管理,那么我们不需要为完整的 /etc 目录设置属性,我们只能为 /etc/passwd 和 /etc/shadow 设置和组为 /etc/group 设置属性。
如果要控制文件系统表,则为 /etc/fstab 等设置属性。

现在让我们再举一个例子,卸载一个文件系统。
请参阅下面的示例输出。

示例:4 卸载文件系统

# umount /media/       # Unmounting a File System
can't create lock file /etc/mtab~2762: Permission denied (use -n flag to override)

我们也无法卸载文件系统。
要完成上述所有任务,我们必须取消设置已应用于 /etc 目录的属性。

将“i”属性设置为文件

假设我有一个名为 geek.txt 的文件,每个人都可以访问它,这意味着任何用户都可以删除、移动或者编辑该文件。
请参阅下面的输出。

# ls -l geek.txt 
-rwxrwxrwx. 1 root root 0 Apr 24 03:59 geek.txt     # Everyone has full access to "geek.txt"
# rm geek.txt    # I am able to delete the file
rm: remove regular empty file `geek.txt'? y

现在让我们使用 chattr 命令将 Attribute 设置为 geek.txt 文件。
要设置属性,我们必须使用“+”号,而要取消设置属性,我们必须使用“-”号。

# chattr +i geek.txt       # Setting Attribute to a file

其中:
i – 代表不可变。

我们还可以使用 -V 选项在为文件设置属性时检查详细输出。

# chattr -V +i geek.txt     # Setting attribute to a file with -V
chattr 1.41.12 (17-May-2010)
Flags of geek.txt set as ----i--------e

所以我们将属性设置为文件 geek.txt。
要确认相同,我们可以使用 lsattr 命令。
请参阅下面的示例输出。
我们会在文件的权限部分注意到一个 i(以红色突出显示)。

# lsattr geek.txt    # confirm if attribute set or not
----i--------e- geek.txt

现在让我们尝试移除、删除、移动和更改文件的权限,我相信你不能做任何一个。

  1. 删除文件:
# rm geek.txt        # Removing the File
rm: remove regular empty file `geek.txt'? y
rm: cannot remove `geek.txt': Operation not permitted
# You can also try to remove the file forcefully.
# rm -rf geek.txt  # Removing the file forcefully
rm: cannot remove `geek.txt': Operation not permitted
  1. 移动文件:
# mv geek.txt test.txt        # Move the file
mv: cannot move `geek.txt' to `test.txt': Operation not permitted
  1. 编辑文件:
# cat >> geek.txt 
bash: geek.txt: Permission denied
  1. 修改文件权限:
# chmod 755 geek.txt 
chmod: changing permissions of `geek.txt': Operation not permitted

正如我们在上述所有示例中所见,我们无法对该文件进行任何更改。

使用 chattr 命令取消设置属性

我们可以使用带有选项 -i 的 chattr 命令来取消设置属性。

# chattr -Vi /etc/         # Removing Attributes from directory
chattr 1.41.12 (17-May-2010)
Flags of /etc/ set as ----------I--e
日期:2020-09-17 00:14:26 来源:oir作者:oir