Linux学习日志20260203
20260124
一、用户和用户组
(一)root
root 是 Linux 系统的内置最高权限用户,UID(用户唯一标识)固定为0,相当于 Windows 的「Administrator」,拥有系统所有操作权限:
-
可以修改 / 删除任何系统文件、配置(比如
/etc、/bin目录); -
可以创建 / 删除任意用户、用户组,修改所有用户的权限;
-
可以执行所有命令,不受任何权限限制。
⚠️ 核心注意:root 权限极高,绝对不要日常用 root 登录操作(误删/bin、/etc等核心目录会直接让系统崩溃),日常用普通用户,需要高权限时通过sudo临时提权即可。
(二)普通用户
1、可登录普通用户
UID 从1000开始(比如你自己创建的user1、test),是我们日常登录、操作的用户。
权限被严格限制只能操作自己家目录/home/用户名/下的所有文件,对系统核心目录(/etc、/root)只有「读」权限,没有「写 / 执行」权限。
2、系统用户
UID 从1到999,是安装软件 / 服务时系统自动创建的(比如nginx、mysql、sshd)。
无法登录系统
作用是专门运行对应服务,避免服务以 root 身份运行带来的安全风险(服务被攻击时,攻击者也只能拿到普通系统用户的权限,无法控制整个系统)。
(三)用户组
Linux 是多用户多任务系统,如果给每个用户单独分配权限,管理会非常繁琐,用户组就是为了批量管理用户权限而设计的
把多个需要相同权限的用户加入同一个用户组,给这个组分配一次权限,组内所有用户就都拥有该权限,无需逐个设置。
用户组的两个核心类型(每个用户必带)
-
主组
用户创建时,系统会自动生成一个和用户名同名的用户组,并将该用户加入这个组,这就是主组;每个用户有且只有一个主组,用户创建的文件 / 目录,默认的「所属组」就是自己的主组。
-
附加组
用户可以额外加入的其他用户组,一个用户可以加入多个附加组,用于获取该组的权限;比如用户user1的主组是user1,同时加入附加组dev,那么user1会同时拥有user1组和dev组的所有权限。
id 用户名 # 查看某个用户的UID、主组、附加组(不加用户名看当前用户) groupadd 组名 # 创建用户组 usermod -aG 组名 用户名 # 把用户加入附加组(-aG是追加,避免覆盖原有组)
(四)其他用户
是 Linux 权限模型中除了「所有者」和「所属组」之外的所有用户,是一个泛称,不是具体的某一个 / 某一群用户。
对于一个文件 / 目录,判断一个用户是不是「其他用户」,就看两个条件: 1.该用户不是这个文件 / 目录的所有者(User); 2.该用户不在这个文件 / 目录的所属组(Group)中; 满足以上两点,这个用户就是该文件 / 目录的「其他用户(Other)」,只能拥有系统给「Other」分配的权限。
用ls -l命令查看文件 / 目录的详细信息,最左侧的字符串就是UGO 权限,举个例子:
ls -l /home/test.txt 输出示例:-rw-r--r-- 1 user1 user1 123 1月24 10:00 test.txt
二、文件权限
Linux 把系统中所有用户划分为三个身份维度(UGO),每个文件 / 目录都对这三个维度单独设置「读(r)」、「写(w)」、「执行(x)」权限,这是 Linux 权限管理的基础。
root:不受 UGO 权限限制,对所有文件 / 目录都拥有 rwx 权限,是 UGO 模型的「例外」
U(User):文件 / 目录的所有者(创建者,或被修改后的指定用户); G(Group):文件 / 目录的所属组(默认是创建者的主组,可手动修改); O(Other):除了 U 和 G 之外的所有其他用户;
ls -l /home/test.txt 输出示例:-rw-r--r-- 1 user1 user1 123 1月24 10:00 test.txt
(一)第一栏
1、1
代表这个文件是目录、文件或链接文件等等。
-
当为 d 则是目录
-
当为 - 则是文件;
-
若是 l 则表示为链接文档(link file);
-
若是 b 则表示为装置文件里面的可供储存的接口设备(可随机存取装置);
-
若是 c 则表示为装置文件里面的串行端口设备,例如键盘、鼠标(一次性读取装置)。
2、234
拥有者权限,读、写、执行(rwx),无权限(-)
3、567
组的权限,读、写、执行(rwx),无权限(-)
4、890
其他用户权限,读、写、执行(rwx),无权限(-)
(二)第二栏
表示有多少文件名链接到此节点
(三)第三栏
文件所有者
(四)第四栏
文件所属组
(五)第五栏
文件大小,默认单位Bytes
(六)第六栏
创建日期
(七)第七栏
文件名
文件明前多 . 是隐藏文件例如 .config
第一行的 . 代表当前目录
第二行的 . . 代表上一级目录
root@ubuntu:~# ls -al total 52 drwx------ 7 root root 4096 Jan 21 05:44 . #**现在所在目录** drwxr-xr-x 24 root root 4096 Feb 18 2020 .. #**上一级目录** -rw------- 1 root root 4795 Jan 22 02:02 .bash_history -rw-r--r-- 1 root root 3106 Apr 9 2018 .bashrc drwx------ 2 root root 4096 Jan 16 20:24 .cache drwx------ 5 root root 4096 Feb 19 2020 .config drwx------ 3 root root 4096 Feb 19 2020 .gnupg drwxr-xr-x 3 root root 4096 Feb 19 2020 .local -rw-r--r-- 1 root root 148 Aug 17 2015 .profile -rw-r--r-- 1 root root 66 Jan 21 05:44 .selected_editor drwx------ 7 root root 4096 Jan 16 00:21 snap -rw------- 1 root root 52 Jan 16 20:24 .Xauthority
三、sudu su和su的区别
(一)su
切换到指定用户,后面不接用户名的话默认切换到root。
需要root密码,并且需要完全进入到目标用户的环境
su # 切换到 root,需输入 root 密码 su username # 切换到指定普通用户,需输入该用户密码 su - # 切换到 root 并加载 root 的完整环境(推荐)
(二)sudo su
需要用户在 /etc/sudoers 文件中有 sudo 权限。
输入普通用户密码就行,无需root密码,这是提权的操作
sudo su # 切换到 root,输入当前用户密码 sudo su - # 切换到 root 并加载 root 完整环境(更推荐)
总结
-
密码要求不同:
su要 root 密码,sudo su要当前用户的 sudo 密码。 -
权限前提不同:
su依赖 root 密码,sudo su依赖当前用户的 sudo 权限。 -
安全级别不同:
sudo su无需暴露 root 密码,是服务器管理中更安全、更常用的方式。
实际使用中,sudo su 也不是最优选择,更推荐:
sudo -i # 直接以 root 身份登录,加载 root 完整环境(替代 sudo su -) sudo -s # 以 root 身份打开 shell,保留当前用户的环境变量
20260125
四、文件权限与属性的修改
(一)修改文件所属组、拥有者以及权限
1、修改文件所属用户组chgrp
要被修改的组名必须在/etc/group文件中
chgrp 目标用户组 文件名/目录名 # 将 file.txt 的所属组改为 "admin" chgrp admin file.txt # 将 dir 目录的所属组改为 "test" chgrp test dir # 递归修改 dir 目录及其内所有内容的所属组为 "user",也就是将dir下的所有内容都放到user中 chgrp -R user dir
2、修改文件拥有者chown
chown :目标用户组 文件名/目录名 # 仅修改用户组 chown 用户名:目标用户组 文件名/目录名 # 同时修改用户和用户组 # 将 file.txt 的所属组改为 "root" chown :root file.txt # 将 file.txt 的所属用户改为 "nginx",所属组改为 "nginx" chown nginx:nginx file.txt # 递归修改 dir 目录及其内所有内容的所属组为 "www-data" chown -R :www-data dir
补充:因为是多人协同的系统,有的时候需要将文件复制发送给别人,以最简单的复制命令cp来说明
#cp 源文件 目标文件 #将 .bas的文件复制为 .bas_test cp .bas .bas_test
cp命令默认不会完全复制文件的所有权限属性。所以就需要修改文件的所有者、组甚至是权限
3、修改权限chmod
常用且简单是数字类型修改权限,前面学到的文件权限中。每种身份(所有者、组、其他人)对应三个权限(读r、写w、执行x)。各个权限数字表示为r=4、w=2、x=1。各权限数字累加完全权限是7,无权限就是0。
#将.bas的权限设置为:所有者完全权限、组只能读、其他人无权限 chmod 740 .bas
注意:权限对于一般文件以及目录文件来讲是不同的
一般文件:
r:读取文件内容
w:写入、编辑、新增、修改文件的内容,但是并不具有删除文件本身的权力
x:Windows系统中,文件是否可执行是由像.exe这种文件扩展名来决定的。Linux中跟文件名没有绝对的关系,Linux中是由“x”决定的。
目录文件:
r:读取目录的结构
w:有改动该目录结构列表的权限:建立新的文件和目录、删除已经存在的文件和目录、将已经存在的更名、移动该目录内的文件目录的位置
x:相当于是一把钥匙决定了能不能打开该目录
五、文件种类与扩展名
(一)文件种类
1、常规文件【-】
例如:-rawr--r--
(1)纯文本文件(ASCII)
用cat命令读出来
(2)二进制文件(binary)
(3)数据文件(data)
一种特殊格式用last命令读出来,用cat会乱码
2、目录【d】
例如:drawr--r--
3、链接文件【l】(小写L)
例如:lrawr--r--
类似快捷方式
4、设备与设备文件
(1)区块设备文件【b】
存储数据硬盘
(2)字符设备文件【c】
串行端口接口设备例如键盘鼠标
5、数据接口文件【s】
通常被用在网络上的数据交换
6、数据输送文件【p】
FIFO,pice先进先出,解决多个程序同时读写一个文件所造成的错误问题
(二)文件扩展名——Linux是没有所谓的扩展名的
一个文件能不能执行,只受权限 x 的影响,但是可执行和可执行成功是不一样的,要看文件的具体内容,内容里有可执行的数据就可以执行。
但是我们仍然可以通过扩展名来了解文件是什么种类
1、.sh :脚本或批处理文件
2、Z .tar .tar.gz .zip .tgz :由于不同的压缩软件产生的扩展名,压缩文件
3、.html .php :网页相关文件
注意:
Linux系统上的文件名只是让人了解该文件可能的用途,真正的执行与否仍然需要权限的规范,这种情况会经常发生在文件传输过程中。
例如网上下载了一个可执行文件,但是在Linux系统中无法执行,那么有可能是属性被修改了。从网上下载到Linux系统中,文件属性与权限确实会被修改
(三)文件名限制
1、文件名长度
单一文件或目录最大255字节:255个英文字母;128个汉字
2、命名限制:尽量避免特殊符号
20260203
六、目录配置标准——FHS(Filesystem Hierarchy Standard,文件系统层次结构标准)
核心是定义根目录(/)下各目录的用途,保证不同发行版的一致性与软件兼容性
(一)四大目录形态
1、可分享(shareable)
可跨系统挂载共享,例如/usr、/home
2、不可分享(unshareable)
仅本机使用,例如/dev、/proc
3、不变(static)
极少变动,例如/bin、/lib、/usr
4、可变(variable)
频繁更新,例如/var、/tmp
(二)双层目录规范——/(根目录)与/user、/var
1、/ (root,根目录)
root在Linux中意义有很多,以账号的角度来讲root指的就是系统管理员身份;以目录的角度来讲root指的就是根目录即 / 。
根目录是整个系统最重要的一个目录,不但所有目录由根目录衍生,同时根目录也与启动、还原、系统修复等操作有关。根目录中必须要有能够修复文件系统的程序。根目录分区应越小越好,且应用程序所安装的软件最好不要与根目录在同一个分区。
必须存在的目录
/bin 用户基础命令,常用有cat、chmod、chown、date、mv、mkdir、cp、bash等
/boot 系统启动文件,包括Linux内核文件以及启动项与启动所需配置文件
/dev 设备与接口设备,常用有/dev/null、/dev/zero、/dev/tty、/dev/loop、/dev/sd等
/etc 系统的主要配置文件,例如人员的账号密码、各服务启动文件,一般用户可查看root用户可修改。建议不要放置可执行文件在这个目录中
/lib 启动时会用到的函数库
/media 可移动设备的挂载点U盘等可删除设备
/mnt 临时挂载点
/opt 第三方软件放置目录
/run 运行时数据,系统启动后产生的各项信息
/sbin 系统管理命令,包含了启动、修复、还原系统所需要的命令
/srv 网络服务启动后,服务数据目录,例如www服务的网页数据就在/srv/www中
/tmp 临时文件,任何人都能够存取,系统与用户临时数据,重启可能清除
/usr
/var
2、/usr
这里面放置的数据属于可分享不可变动的,这个并不是user的缩写,实际上是UNIX Software Resource的缩写,是操作系统软件资源放置的目录,不是用户数据类似Windows系统中C:windows和C:Program Files这两个目录的合体,系统刚安装完毕时这个目录占用最多的硬盘容量。
必须存在的目录
/usr/bin/ 所有一般用户能够使用的命令都在这里,此目录下不应该有子目录
/usr/lib/ 基本上与/lib功能相同,所以/lib就是链接到此目录中
/usr/local/ 系统管理员在本机安装自己下载的软件,建议安装到此目录,该目录下也具有bin、etc、lib的子目录
/usr/sbin/ 基本功能与/sbin差不多
/usr/share/ 主要放置只读的数据文件,包括共享文件。常见的子目录有/usr/share/ man:在线帮助文件;/usr/share/ doc软件说明文档;/usr/share/ zoneinfo与时区有关的时区文件
3、/var
上面说到/usr在系统刚安装完毕时这个目录占用最多的硬盘容量,那么/var就是在系统运行后逐渐占用硬盘容量的目录。针对经常变动的文件,包括缓存、日志文件以及一些软件运行产生的文件
必须存在的目录
/var/cache/ 应用程序运行本身产生的一些缓存
/var/lib/ 程序本身执行的过程中,需要使用到的数据文件放置目录。在此目录下各自的软件应该要有各自的目录。例如MySQL放置到/var/lib/mysql/
/var/lock/ 某些文件资源一次只能被一个应用使用,两个同时用就会产生错误,这个就是为了避免这个问题,给先用的上锁
/var/log/ 重要!!日志文件存放的目录
/var/mail/ 放置个人电子邮箱的目录,通常与/var/spool/mail/互为链接文件
/var/run/ 某些程序或者服务启动后,会将他们的PID放置在这个目录下,与/run相同,链接到/run目录
/var/spool/ 通常放置一些队列数据,排队等待其他程序使用的数据,这些数据使用后通常会被删除
补充:
除了上述目录,将一些补充整理在这里,后续碰到再增加
/lost+found 文件系统发生错误时,将一些遗失的片段放置到这个目录下。但是使用xfs文件系统就不会存在这个目录
/proc 本身是一个虚拟文件系统,这个目录下的数据都在内存中,不在硬盘里
/sys 也是一个虚拟文件系统,记录的是硬件
(三)目录树
/ ├── bin/ # 基础用户命令(ls/cp/mv等) ├── boot/ # 系统启动文件 │ ├── grub/ # 启动引导配置 │ ├── vmlinuz # 内核镜像 │ └── initrd.img# 初始化内存盘 ├── dev/ # 设备文件(sda/tty/null等) ├── etc/ # 系统/应用配置 │ ├── passwd # 用户信息 │ ├── group # 用户组信息 │ ├── fstab # 磁盘挂载配置 │ ├── sysctl.conf # 内核参数配置 │ ├── ssh/ # SSH服务配置 │ └── nginx/ # Nginx(示例)应用配置 ├── home/ # 普通用户主目录 │ ├── user1/ # 普通用户1(示例) │ └── user2/ # 普通用户2(示例) ├── lib/ # 共享库/内核模块 │ └── modules/ # 内核模块文件 ├── media/ # 可移动设备自动挂载点 │ ├── cdrom/ # 光驱挂载点 │ └── usb/ # U盘挂载点 ├── mnt/ # 手动临时挂载点 ├── opt/ # 第三方软件(独立目录) │ └── google-chrome/ # 示例:Chrome浏览器 ├── proc/ # 内核/进程虚拟文件系统 │ ├── [PID]/ # 各进程专属目录(动态生成,如1/、1234/) │ ├── cpuinfo # CPU信息 │ └── meminfo # 内存信息 ├── root/ # 管理员root主目录 ├── run/ # 运行时数据(FHS 3.0新增) │ ├── *.pid # 服务PID文件(如sshd.pid、nginx.pid) │ └── lock/ # 进程锁文件 ├── sbin/ # 系统管理命令(fdisk/reboot/mkfs等) ├── srv/ # 服务数据 │ ├── http/ # HTTP服务数据 │ └── ftp/ # FTP服务数据 ├── sys/ # 硬件/驱动虚拟文件系统 │ ├── block/ # 块设备信息 │ ├── class/ # 设备类信息 │ └── bus/ # 总线设备信息 ├── tmp/ # 临时文件(重启清除) ├── usr/ # 系统软件资源(可共享) │ ├── bin/ # 非基础用户命令(如git/python) │ ├── lib/ # 对应usr/bin的共享库 │ ├── share/ # 文档/配置模板/字体 │ └── local/ # 本地管理员手动安装软件(不受包管理) │ ├── bin/ # 本地软件命令 │ └── lib/ # 本地软件共享库 └── var/ # 可变数据(频繁更新) ├── log/ # 系统/应用日志 │ ├── auth.log # 认证日志 │ ├── syslog # 系统日志 │ └── nginx/ # 示例:Nginx日志 ├── spool/ # 邮件/打印队列 ├── cache/ # 应用缓存(如apt/浏览器) └── www/ # Web服务根目录(示例)
(四)绝对路径与相对路径
1、绝对路径
由根目录/开始写
例如:/home/dmtsai
2、相对路径
相对于目前路径的文件写法
例如:./home/dmtsai .代表当前目录,也可以用./表示
../home/dmtsai ..代表上一层目录,也可以用 ../表示








