# 文件系统与权限模型

Linux 的权限模型基于用户和用户组的概念,每一个用户都有唯一的用户 ID (uid) 以及唯一的组 ID (gid)。文件和目录的权限由所属的用户和用户组来决定

同时也存在访问控制列表(ACL), 可以精细的控制文件和目录的权限

# 文件权限

# 基本权限标记

每个文件具有三种权限:属主权限,所属组织权限,其他用户权限

常见的文件权限标记:

r,w,x (执行权限),-(空)

删除文件算在 w,但是取决于所在目录权限,而不是本文件的权限

这一点和 windows 不一样,windows 每个文件都有独立的 ACL, 当没有从父目录继承权限或者被单独修改时,是不能被删除的 —— 但是,父目录也必须有权限!这是基础条件

这些标记每三个一组,依次对应一种文件权限,共三组:

rwxr-w---

也用三个八进制数字来表达:

r=4,w=2,x=1,将值相加得到最终该种权限的值

所以上面的权限也可以表示为:

750

chmod -R 755 ddd.txt //-R表示递归
find /home/user/project -type f -exec chmod 644 {} \; //对于文件夹可以用find区分文件类型赋予权限

PS:chmod 只能用于修改本用户所属的文件(除非是 root 组),chown 仅限 root 组

当查看文件权限时,前面通常还有一位

1758095242420

表示文件类型,有一下几种:

1758095981596

通过 ls -all 来查看

# 特殊权限标记
# SUID

Set User ID, 允许普通用户临时获得属主权限

# SGID

Set Group ID, 作用于目录,里面的文件和目录会继承属组

# Sticky

粘滞位,只用于目录,比如 /temp 文件夹,只允许用户删除自己的文件,一般配合 777 使用

以上三种都是用特殊符号位表示

//SUID,撤销时+改-或者数字改0,下面同理
chmod u+s xxx  
chmod 4755 xxx
//SGID
chmod g+s xxx
chmod 2755 xxx
//Sticky
chmod o+t xxx
chmod 1755 xxx

PS:没有 x 权限时 s/g 会显示为大写,此时 SUID/SGID 无效,这是 t 实际上也会大写,不符合共享的目的,虽然依旧生效但是这个用户(组)没法访问,更没法操作。

# 进程管理

ps 
top #顺带显示系统性能信息,这是交互式的
kill #默认是 pid
killall #这个是终止指定名称,不是全杀,可以 - u,-r (正则)
pgrep   #根据名字找 ID
pkill #也是根据进程名,但是是部分匹配,也可以 - u,-t,-p,-f
nice #设置进程优先级
renice #设置正在运行的进程的优先级
nohup #运行进程,并且用户注销后继续运行
bg/fg #放到后台 / 前台运行,只认作业号而不是 pid

# PS

ps -aux #显示所有用户的所有进程
ps -ef #显示完整格式
ps -e --forest #树形结构显示进程关系

1758099705675

STAT 是进程状态:

S:等待态
T:停止态
R:运行态
Z:僵尸态
D:不可被中断的等待态进程
X:死亡态
s:拥有子进程的进程
I (大写 i):闲置在内核的进程
l (小写 L):拥有子线程的进程
<:高优先级的进程
N:优先级较低的进程
+:运行在前台的进程

# kill

kill -1/hangup pid #挂起,用于重启或重新加载
kill -2/interrupt pid #中断,就是发个 Ctrl+C
kill -3/quit pid #退出,就是发个 Ctrl+\
kill -9 pid #强制终止(SIGKILL)
kill -15/terminate pid #发送终止信号
kill -17/stop pid #暂停
kill -18/cont pid #继续,作用于之前被暂停的进程

# top

top -c #显示完整命令,正常只会输出运行的命名,-c 可以显示路径和参数 
top -b #假设这是批处理,刷新是再此输出,容易被刷屏
top -S #累计模式,没看出什么区别
top -n 2 #只更新两次就退出
top -d 3 #每 3 秒更新
top -p pid #指定进程
#运行后也可以按 c 切换是否显示完整命令

1758101515643

# jobs

查看后台运行的作业状态( bg

jobs -l  #详细显示,有显示 pid
jobs -p xxx #仅显示作业的进程组 IDvomy
jobs -n  #只显示和上次状态不同的部分
jobs -r  #只显示运行中的
jobs -s  #只显示已停止的

1758103790007

tip:使用 Ctrl+Z 暂停,1 就是作业号,% 可以省略(只是为了防止和 pid 混淆,如果使用 kill 等其他命令来操作作业的话就不能省略)

# 启动三个后台任务
$ sleep 100 &
$ sleep 200 &
$ sleep 300 &
# 查看所有作业
$ jobs -l
[1]   12345 running    sleep 100 &
[2]  -12356 running    sleep 200 &
[3]  +12367 running    sleep 300 &
# 将作业 2 恢复到前台
$ fg %2
# 终止作业 3
$ kill %3

1758106239637

默认情况下后台作业和终端会话关联,使用 nohup xxx & 即可避免

引用作业:

%x 作业x
%+/%% 当前作业
%- 前一个作业

jobs 只显示当前 shell 会话中的作业,ps 会直接显示所有,包括其他用户和终端的进程

# 实践

为后台作业重定向输出,避免干扰当前终端

command > output.log 2>&1 &

重要作业使用 nohup,确保终端断开后继续运行

nohup important_command &

# 网络配置

# iptables

包过滤 + 防火墙

# 结构

1758380308482

1758380325791

1758380344525

这个命令的语法:

iptables [-t 表名] <命令> <链名> [规则号] [匹配条件] [-j 目标动作]
iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.0.100:80
//将访问自身8080端口tcp协议的包发送到内网另外一台机器的80端口
#-A 对应命令,即追加操作,-p 匹配协议头

类似的:

iptables -A INPUT -s 192.168.1.100 -p tcp --dport 22 -j ACCEPT
#filter 是默认表
# 基本操作

查看

#-L 列出所有链,-n 和 - v 同 ss 中的作用,使用默认表(filter)
iptables -L -n
# 更详细的查看,显示规则编号和更多信息
iptables -L -n -v
# 查看 nat 表的规则
iptables -t nat -L -n

清空规则

iptables -F INPUT
iptables -F   #清除所有链的规则
iptables -t nat -F #清除对应表的所有链的规则

删除规则

iptables -L --line-numbers #查看编号
iptables -D INPUT 3  #使用编号删去
# 使用测试
# 设置默认策略(先允许所有,避免被踢出)
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
iptables -F # 清空现有规则
# 2. 允许所有本地回环 (lo) 接口的通信,-l 匹配网口
iptables -A INPUT -i lo -j ACCEPT
# 3. 允许已建立的和相关连接通过(响应请求)-m 加载拓展
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 允许外部 ping 本机
iptables -A INPUT -p icmp -j ACCEPT
#开放 SSH 端口 (22),只允许特定 IP(如 192.168.1.100)访问
iptables -A INPUT -p tcp --dport 22 -s 192.168.1.100 -j ACCEPT
# 如果允许所有 IP 访问 SSH,则用下面这条
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
#再次设置默认策略,不影响上面特别设置的
iptables -P INPUT DROP
iptables -L -n -v

1758381523601

# PS
iptables -t nat -A PREROUTING -p tcp  -j DNAT --to-destination xxx.xxx.xxx.xxx:xxx
#这样你就可以随便把什么连接到这台机子的发送到其他地方

# netstat

显示当前开放的端口

-t TCP
-u UDP
-n --numeric 直接使用IP和端口号,不用DNS
-l 仅列出监听状态的网络服务
-a 列出所有
-r --route 列出所有路由列表,等同于route
-s 网络统计信息
-o 显示计时器
-i 显示网络界面信息表单
-M 显示伪装的网络连线
-w 显示RAW传输协议的连线情况
-v 显示命令执行过程
可以组合使用
-tuln -an  -rn 
-A <网络类型> --<网络类型>
	-A unix(等效于 -x --unix)	-A inet(等效于 -ip --inet) 
netstat -rn 和route -n是一样的

# ss

和netstat类似。
-K, --kill:通过 Inode号 杀死指定的 socket,实际上可以结合其他的
-a, --all:显示所有的套接字,包括监听和非监听的。
-t, --tcp:仅显示 TCP 套接字。
-u, --udp:仅显示 UDP 套接字。
-l, --listening:仅显示监听状态的套接字。
-p, --processes:显示与套接字关联的进程信息。
-n, --numeric:不进行DNS解析,也不尝试寻找对应服务。!!!!!
-r, --resolve:尝试反向解析IP(PTR)并找到已知服务名称。!!!!!
-s, --summary:显示套接字的摘要信息。
-4:仅显示 IPv4 套接字。
-6:仅显示 IPv6 套接字。
-i, --info:显示详细的内部信息。
-o, --options:显示 TCP 计时器信息。
-f, --family=FAMILY:指定协议族(如 inet, inet6, unix, link)。
-m, --memory:显示每个套接字使用的内存。
-H, --no-header:不显示标题行。
-v, --verbose:显示详细的输出。
# 使用测试

1758379159551

这里显示了 Inode 号 (ino 字段), 可以:

ss -k 73
ss -k dport=333978#即 dst port, 同样存在 sport,可以用 >= 等符号比较
ss -k dst :333978  #前面可以是个 IP
ss -k src :327580  #前面为 IP 时表示本机的这个 IP 下的连接

# 其他

连接测试

ping -c<发送次数>
ping6 使用ipv6ping
traceroute 跟踪到目标主机的路径
tracepath 类上,但是无需root
mtr ...
curl 发送HTTP请求
wget 下载
telnet 测试TCP连接
nc 创建TCP/UDP连接以测试端口
dig 查询DNS
nslookup 同上
host 解析域名为IP

流量监控

iptraf 是个交互式的监控工具,需
iftop 实时监控网络接口的带宽使用
nethogs 实时监控每个进程的带宽使用
nload 实时显示网络流量

1758166022049

vnstat   流量统计,-d是查看日流量
tcpdump  捕获分析网络数据包 tcpdump -i eth0

# 服务管理

# systemctl

系统服务管理

用于和 systemd (系统服务管理器,这个进程的 PID 为 1)进行交互,管理进程

start
stop
restart
reload #重新加载配置文件,不重启
status #检查运行状态
enable #加入自启动
disable
is-enabled
is-active #是否正在运行
daemon-reload #对 systemd 的 reload
systemctl list-unit-files --type=service #列出自启动的

# crontab

定时任务管理器