问题

在运行的 Thanos 的时候遇到了如下问题,为了解决这个问题,做了重装 gcc 等尝试,未成功。最后查询学习了一系列有关 Linux 权限的知识,解决了这个问题。

1
2
# runtime/cgo 
cc1: error: /usr/local/include/x86_64-linux-gnu:

Linux 文件权限

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# 1. 使用 ls -l 查看权限
ls -l

drwxr-xr-x 2 root root 65536 Jun 30 18:48 bin
drwxr-xr-x 2 root root 4096 Jun 23 17:52 config
drwxr-xr-x 2 root root 4096 Apr 15 2020 games

# 列表的前十个字符表示文件的权限状况。第一个字符代表文件的类型,
# -:普通文件
# d:文件夹
# 剩下的九个字符,叫做文件模式,代表文件的所有者,文件组所有者和其他人的
# 读(w-4),写(r-2)和执行(x-1)权限
# 通过4、2、1的组合,得到以下几种权限:0(没有权限);4(读取权限);5(4+1 | 读取+执行);6(4+2 | 读取+写入);7(4+2+1 | 读取+写入+执行)

# 2. chmod 更改权限
# chmod [-cfvR] [--help] [--version] mode file...
# mode :[ugoa...][[+-=][rwxX]...][,...]
# [ugoa...] :文件所有者;文件所有者群组;其他人;全部人
# [+-=][rwxX]:指定或者添加删除相应的权限;
# chmod abc file: 使用三个字母代表相应的权限

# 但当我对于文件进行 chmod 操作的时候却出现了如下报错,这就要涉及到文件的属性。
sudo su
chmod 777 include
# chmod: changing permissions of 'include': Operation not permitted

# 3. chown
# chown [-cfhvR] [--help] [--version]user[:group] file
# user : 新的文件拥有者的使用者 ID
# -R : 处理指定目录以及其子目录下的所有文件

# 指定文件所有者为 root
chown root /var/run/httpd.pid

# 指定目录及其子目录的所有文件所有者为 runoob:runoobgroup
chown -R runoob:runoobgroup *

# 4. 隐藏属性

# 4.1 lsattr
# lsattr [-adlRvV][file/directory...]
# -a  显示所有文件和目录,包括以"."为名称开头字符的额外内建,现行目录"."与上层目录".."。
# -d  显示,目录名称,而非其内容。
# -R  递归处理,将指定目录下的所有文件及子目录一并处理。

lsattr local
--------------e----- local/src
----i---------e----- local/include

# 可以看到 include 目录的属性里又一个 i ,表示 immutable,这应当就是我们无法对 include 进行权限操作的原因。

# 4.2 chattr
# chattr [+-][ei...] filename 可以该表文件和目录的隐藏属性。
chattr -i local/include
lsattr
--------------e----- ./src
--------------e----- ./include
# 完成这些操作,就能看到文件可以在 root 下进行权限操作了。

参考

  1. i e 属性的解释: https://blog.systemctl.top/2017/2017-04-14_something-about-lsattr_-i_-e/
  2. Linux command reference: https://www.runoob.com/linux/linux-comm-lsattr.html
  3. 文件权限总结: https://www.cnblogs.com/chenqionghe/p/10407336.html