golang学习-使用go-chattr库锁定Linux文件权限

在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设置后就拥有了权限