在 Linux 操作系统中,chattr 是用于修改文件或目录的扩展属性的命令。扩展属性是与文件或目录相关联的元数据,包括访问权限、拥有者、修改时间等。
chattr 命令可以用来设置或取消扩展属性,包括以下几种类型:
- i(immutable):将文件或目录设置为不可修改,不可删除,不可重命名,只有 root 用户才能使用 chattr - i 取消此属性。
- a(append only):只允许在文件末尾追加内容,不允许覆盖或删除已有内容。
- d(no dump):指定文件或目录不会被 dump 命令备份。
- s(secure deletion):在删除文件时,使用 0 填充文件内容,以确保文件内容不可恢复。
- c(compress):启用文件压缩。
chattr 命令的使用格式为:chattr [选项] [文件名]
,常用的选项包括:
- -i:设置或取消 immutable 属性。
- -a:设置或取消 append-only 属性。
- -d:设置或取消 no-dump 属性。
- -s:设置或取消 secure-deletion 属性。
- -c:设置或取消 compress 属性。
- -R:递归处理子目录。
例如,要将文件 file.txt 设置为只读不可修改,可以使用以下命令:chattr +i file.txt
。要取消该属性,可以使用命令:chattr -i file.txt
。
golang 中可以使用 go-chattr 库来实现对文件附加不可修改权限
package main
import (
"fmt"
"os"
"github.com/g0rbe/go-chattr"
)
func main() {file, err := os.OpenFile("/etc/resolv.conf", os.O_RDONLY, 0666)
if err != nil {fmt.Println(err)
}
// 打印当前是否拥有不可修改权限
fmt.Println(chattr.IsAttr(file, chattr.FS_IMMUTABLE_FL))
// 设置不可修改权限
chattr.SetAttr(file, chattr.FS_IMMUTABLE_FL)
// 打印当前是否拥有不可修改权限
fmt.Println(chattr.IsAttr(file, chattr.FS_IMMUTABLE_FL))
}
打印输出
go run main.go
false <nil>
true <nil>
可以看到刚开始是没有权限的,使用 SetAttr 设置后就拥有了权限