Linux的文件操作
1.文件文件夹命名规范
注意:
- 创建文件夹或者文件时不能添加特殊符号
<、>、?、*
等,如果非要使用请使用单引号(不会对特殊符号转义)。- 文件名使用小写,大写都是系统内部使用的(名称区分大小写)。
- 文件名可以使用_下划线进行分割。
- 文件名/文件最大程度 255字符。
- 文件夹名称不能重复创建,文件名见名知意。
- 文件名的后缀没有什么意义,但是为了运维人员好管理,需要针对设置。
2.文件文件夹操作
2-1.创建
1.文件夹创建
命令:
mkdir
参数:
-p 递归创建文件夹(如果创建多级文件夹都不存在的情况下)
使用:
mkdir -p /opt/abc/ccc
mkdir -p /opt/abc/{ccc,bbb,ddd} # 利用花括号的特性创建多个文件夹
2.文件创建
命令:
touch
使用:
touch 123.log
touch {1..10}.log # 利用花括号特性可以快速创建多个文件
# 其他的创建文件操作
vi or vim or echo 等都可以创建文件
2-2.删除
删除操作一般使用 rm 命令,命令支持通配符,但是 rm 命令 存在风险。
注意:
加 * 与不加 *的区别,一定要想清楚时删除文件夹还是删除文件夹的内容。
rm -rf abc/task/n/ # 不加*,那么就会删除递归删除整个n目录
rm -rf abc/task/n/* # 加*,只删除n目录下的全部文件内容。
命令:
rm
参数:
-f 强制删除,不会出现提示信息
-r 递归删除
删除文件夹
rm -rf /opt/文件夹
删除文件
rm -rf /opt/文件
补充:另一种删除"文件夹"命令 rmdir
如果文件夹存在嵌套,那么是无法删除的。
rmdir 文件夹 (文件夹不能有嵌套)
2-3.查看文件-cat
作用:
查看文件内容,不适合大文件查看
命令:
cat
参数:
-n 显示行号
-b 不对空白行进显示行号
-E 显示尾部的 $
使用:
cat 123.log # 查看文件
cat 123.log > 456.log # 结合重定向符号,将123.log写入到456.log
# 写入文件
cat >> 文件.txt << EOF
所写的数据
EOF
2-4.查看文件-tac
作用:
倒序查看文件内容,与cat相反
命令:
tac
参数:
-b 在非行结个尾添加分割标识
-r 将分割标识作为正则进行解析
-s 使用指定字符串作为代替换行分割符
2-5.查看文件-more
作用:
进行分屏查看,但是与cat一样都是将全部的数据读入内存中,不使用大型的文件使用。
命令:
more 文件
指令:
空格 翻篇
回车 下一行
q 退出
2-6.查看文件-less
作用:
查看文件内容,不会将全部的数据加载到内存中,看多少显示多少,适用于大文件查看。
命令:
less 文件
指令:
空格 翻篇
回车 下一行
q 退出
2-6.查看文件-head
作用:
查看文件的内容,无参数默认显示10行内容,可以显示固定的行数
命令:
head 文件
参数:
-n 指定显示固定行数
-c 显示文件的前K内容
使用:
head -2 文件 # 显示2行
2-7.查看文件-tail
作用:
查看文件的内容,无参数默认显示后10行内容,可以显示固定的行数,与head相反
命令
tail 行数 文件
参数:
-f 阻塞文件,当文件被添加时,可以实时输出
-F 对文件实时的刷新读取[文件不存在也是可以监听]
# 用与访问日志记录最为方便
使用:
tail -f 文件
2-8.拷贝
注意:
- 拷贝可以拷贝文件或者文件夹(需要使用-r参数)。
- 当拷贝文件或者文件夹时,是可以对拷贝的新文件或者新文件夹进行重命名的。
- 如果拷贝不进行重命名,就会引用原来的拷贝的文件或者文件夹名称。
问题:如果拷贝的文件或文件夹不存在,那么新的文件夹就会使用这个文件或者文件名称。
- 这种情况就是对文件夹或者文件进行重命名操作。所以在拷贝时请注意拷贝的位置是否存在,不然就会莫名奇妙的修改文件或者文件夹名称。
命令: cp 参数: -r 递归拷贝,对文件拷贝时使用。recursion,递归,用于复制目录。 使用: cp 参数 文件/文件夹
1.拷贝文件:
cp nginx.log ./file_cp/ # 将nginx.log拷贝到当前的file_cp 目录下
2.拷贝文件夹:
cp -r log/ ./file_cp/ # 将log/文件夹拷贝到当前的file_cp 目录下
3.拷贝文件,对新的文件进行重命名:
cp nginx.log ./file_cp/new_nginx.log # 将nginx.log拷贝到当前的file_cp 目录下,并且重命名为new_nginx.log
4.拷贝文件夹,对新的文件夹进行重命名:
cp -r log/ ./file_cp/new_log # 将log/文件夹拷贝到当前的file_cp 目录下,并重命名为new_log
2-9.移动剪切-修改重命名
注意:命令与cp命令相似
- 相似:将文件移动到新目录并且可以修改文件名。
- 不同: cp命令是拷贝过去,原文件还在当前目录,mv是将原文件移动至新目录。
作用: 可以在不同的目录之间移动文件或目录,也可以对文件和目录进行重命名。 命令: mv 参数: -n 不覆盖已存在文件 -i 覆盖前进行询问 使用: mv 参数 文件/文件夹 新位置或者重命名为其他名称
1.将文件移动到
mv nginx.log ./file_mv/ # 将nginx.log 移动到 file_mv 文件夹下
2.将文件夹移动
mv log ./file_mv/ # 将log 移动到 file_mv 文件夹下
3.将文件移动并重命名
mv nginx.log ./file_mv/new_nginx.log # 将nginx.log 移动到 file_mv 文件夹下 修改为new_nginx.log
4.将文件夹移动并重命名
mv log/ ./file_mv/new_log # 将log 移动到 file_mv 文件夹下 重名为 new_log
2-10.获取文件和文件名称
1.获取文件的名称
basename 文件的路径
basename /etc/sysconfig/network-scripts/ifcfg-ens33 # 获取 ifcfg-ens33
2.获取文件目录的路径
dirname 文件路径
dirname /etc/sysconfig/network-scripts/ifcfg-ens33 # 获取 /etc/sysconfig/network-scripts/
3.文件压缩
注意:解压时需要注意文件的类型(请使用file命令查看)。
3-1.tar命令
概念:
- 指的是一个文件或者目录集合,将这个集合存储到一个文件中。没有压缩功能,不节省空间。
- 归档文件没有经过压缩,占用的空间是所有文件和目录的总和。
- 将一堆小文件或者目录存储到一个文件夹内。
命令规范:
*.tar
:打包*.tar.gz
:打包 + 压缩*.tgz
:打包 + 压缩命令与参数
命令: tar 参数: -c 创建包 -v 查看打包的过程或者解包的过程 -u 更新原来打包的中的文件 -t 查看包中的文件有哪些 -f 指定打包的文件名称 # 必须添加,且在参数的最后一位 -x 解包,解压缩(自适应解压格式) -z 压缩命令,tar调用gzip命令的过程,压缩参数,需要确认是归档文件还是gzip类型的压缩文件,如果不是就会报错不是gzip格式。 -C 解压到那个指定目录下 使用: tar 参数 名称 被打包文件1 被打包的文件2 ... 被打包的文件N tar 参数 解包文件
3-1-1.打包
# 注意:打包不是压缩,所以文件不会变小。
参数:
-c 创建包
-f 指定包的文件
-v 查看打包过程
使用:
tar -cvf 打包的名称 被打包的文件1 被打包的文件2 ... 被打包的文件N
比如:
tar -cvf 111.tar 123.log 456.log
3-1-2.查看包中得内容
可以查看打包的内的文件都有哪些
参数:
-t 查看包的内容
-f 指定看那个打包文件
使用:
tar -tf 打包名称
例如:
tar -tf 111.tar
3-1-3.包中追加内容
对打包文件追加一个或者多个文件
参数:
-u 添加
-f 指定打包文件
使用:
tar -uf 打包文件名 追加文件1 追加文件2 追加文件3 ... 追加文件N
例如:
tar -uf 111.tar 789.log
3-1-4.解包
将打包的文件进行解包
参数:
-x 解包
-f 指定包文件
使用:
tar -xf 包文件
例如:
tar -xf 111.tar
3-1-5.压缩文件
压缩后文件会变小
参数:
-c 创建包
-z 调用gize压缩
-f 指定包文件名称
使用:
tar -cxf 包名称 文件1 文件2 ... 文件N
例如:
tar -cxf 111.tar.gz 123.log 456.log 789.log
3-1-6.解压缩文件
对压缩文件进行解压
参数:
-x 解压
-z 调用解压gzip
-f 指定压缩包文件名称
使用:
tar -xzf 压缩名称
例如:
tar -xzf 111.tar.gz
3-1-7.总结补充
打包:
是不会压缩包的大小,还是原来文件的大小总和
压缩:
会压缩包的大小
打包/解包命令:
tar -cf 包名 文件1 .. 文件N
tar -xf 包名
压缩/解压命令:
tar -czf 包名 文件1 .. 文件N
tar -xzf 包名 文件1 .. 文件N
打包与压缩的文件区别如下图:
3-2.zip压缩
解压时请使用
file
命令查看文件类型。命令与参数:
zip 需要进行安装: yum install -y zip # 压缩 yum install -y unzip # 解压缩 作用: 兼容类unix与windows,可以压缩多个文件或目录 参数: -r 递归压缩(压缩文件夹),对文件夹以及内部子文件夹进行递归压缩 -d 指定文件解压缩文件存储的目录 使用: zip 参数 压缩生成文件名称 被压缩文件1 ... 被压缩文件N unzip 压缩生成文件名称
3-2-1.压缩
压缩文件
使用:
zip 参数 压缩生成文件名称 被压缩文件1 ... 被压缩文件N
例如:
zip -r 111.zip 123.log 456.log test/
# 注意:
如果需要压缩文件夹,那么需要添加-r参数,不然只会压缩文件不会压缩文件夹中的内容
3-2-2.解压缩
使用:
zip 参数 压缩生成文件名称
例如:
unzip -d /tmp 111.zip
3-3.gzip压缩
命令与参数:
命令需要安装: yum install -y gizp 命令: gizp 参数 文件 参数: -d 解压缩,将gzip解压缩为归档文件 使用: gzip -d 文件(gzip类型) # 解压缩 gzip 文件 # 压缩
3-3-1.压缩
使用:
gzip 文件
例如:
gizp 123.log
# 可以使用tar 先进行打包
tar -cf 123.tar
# 在使用gzip压缩
gzip 123.tar
3-3-2.解压
参数:
-d 指定解压的文件
使用:
gzip -d 解压文件
例如:
gzip -d 123.gz
4.vim编辑器
作用:
- 对文件进行编辑使用。
- vim filename,打开filename文件进行编辑,如果没有这个文件,当编辑完成后保存就会创建这个文件。
- 如果只输入 vim 就会启动一个空的缓冲区。
模式:
- 命令行模式,当使用vim打开文件时,就进入了命令行模式,输入快捷键指令,对文件进行编辑,如插入字符,复制,粘贴,删除等操作。
- 输入模式,可以对文件内容进行编辑。
- 底线模式,进行一些特殊操作,如文本信息的查找,替换,保存,退出等。
注意:
- vim时需要进行安装的,
yum install vim -y
。
4-1.命令模式
- 当使用 vim 打开文件时,就会进行命令模式。
指令:
1.使用"上下左右"键
光标进行上下左右,可以使用键盘的上下左右按钮。
h:左移。
j:下移。
k:上移。
l:右移。
b:选中特殊符号。
2.光标移动开头行与结尾行位置
gg :光标到文件开头(第一行第一个字符)
G:光标到文件结尾(最后一个第一个字符)
: number :光标到达数字number指定行。
number + G :光标到达数字number指定行。
3.光标移动"当前行"的开头与结尾
0:数字0会将光标移动到"当前行"的第一个字符
shift + 4:光标会移动到"当前行"的最后一个字符
# 注意:光标需要再当前行的位置才生效。
4.复制
yy :复制当前光标所在的行
numbre yy:复制number数量的行(从光标的位置向下number行)
p:将复制的行进行输出到光标所在的位置
5.剪切
dd:对光标所在的行进行剪切
number dd: 剪切number数量的行(从光标的位置向下number行)
p:将剪切的进行输出到光标所在的行
# 注意:如果不进行输出剪切的内容,那么等同于删除操作。
5.撤销操作
u:对删除还是复制等操作进行撤销到上一步。
6.恢复撤销:
ctrl + r :针对撤销操作进行恢复
7.删除
x :小写x删除光标所在的字符。
X :大写的X删除当前光标的行。
dG : 从光标所在的位置向下,全部进行删除。
4-2.输入模式
指令:
i:在光标位置编辑
a:在光标的后一个字符开始编辑
o:在光标的下一行进行编辑(重新开一行)
4-3.底线模式
进入底线模式指令:
esc + :(英文的冒号) 进入底线模式
: # 在vim显示当前状态就是底线模式
1.退出指令:
1.:w :保存文件但不退出[如果文件不存在就会创建文件]
2.:w 文件名:将当前文件内容写入到指定的'文件中'[如果文件不存在就会创建文件]
3.:w!:强制保存,不退出
4.:q:不保存文件,退出vim
5.:q!:文件发生变化,强制退出vim
6.:wq:保存文件并退
7.:wq!:强制写入文件,并退出vim
8.:e!:放弃当前所有修改,回到文件打开的原始状态
9.!:强制执行操作
2.显示行号
set number # 显示行号
set nonumber # 关闭行号
3.显示语法高亮
syntax no # 开启
syntax off # 关闭
4.搜索关键字
/搜索内容 # 进行搜索需要的内容后点击回车,会对搜索的词进行标记高亮。
noh # 关闭搜索词高亮
n:查找下一个匹配的项
N:查找上一个匹配项
5.进入粘贴模式
set paste + i:进入粘贴模式,可以保持粘贴的格式。
set nopaste:退出粘贴模式。
6.替换语法
# 注意:
如果替换行的语法,光标必须在字符。
6.1.替换当前行
:s/原内容/替换的内容/ # 光标当前行才会替换,替换一次
:s/原内容/替换的内容/g # 光标当前行才会替换,替换多次
6.2.全文替换
: %s/原内容/替换的内容/ # 全文替换,逐行匹配第一个替换,只替换第一个匹配的
: %s/原内容/替换的内容/g # 全文替换,匹配全部的进行替换
4-4.可视化模式
ctrl + v # 进入可视化模式
确定光标的位置 可以通过上下左右进行选中(以光标为基点覆盖的范围)
指令:
y:复制,光标选中的范围。
d:删除,光标选中的范围。
p:粘贴,光标选中的范围。
操作:批量在选中的位置添加"#"号。
1.进入可视化模式。
ctrl + v
2.使用光标选中需要添加"#"号的范围行。
3.此时按I(大写的i),就会进入编辑模式。
I
4.输出"#"号。
5.按两次esc,即可将"#"输出到指定的光标选中的范围。
操作:批量删除"#"号
1.进入可视化模式。
ctrl + v
2.使用光标选中需要删除"#"号的范围行。
3.此时按d即可删除。
4-5.vim故障处理swp错误
出现原因:
- swp错误:是linux为了保护文件中得数据出现的。
- 你编辑文件时没有正常的保存退出,或者ssh链接终端等情况,简单来说就是没有正常退出vim导致的。
注意:
- 不要在异常状态下新添加内容,建议恢复后,在进行添加。因为恢复是恢复到出现异常状态前的文本内容,那在后面新添加的内容就在会恢复后消失。
解决方式:
提示的几种模式: [O]pen Read-Only: 只读 (E)dit anyway: 继续编辑 (R)ecover:修复 (Q)uit :退出 (A)bort :终止 # 当出现这种情况时,会在文件当前所做的目录下产生一个隐藏文件 xxx.swp 的文件。 1.vim打开文件后进入 R 模式进行修复 2.在将当前目录下, xxx.swp文件进行删除。
4-6.补充内容
1.不指定打开文件而进行vim保存
# 场景:vim不打开指定的文件,而直接使用vim。
wq /路径/文件名称 # 存储文件
2.vim打开多个文件操作
vim /opt/123.log /opt/456.log ....
3.vim打开了一个文件,怎么打开第二个文件 # 打开多个文件
:opt 第二个文件路径 # 打开第三个也是这样...
4.vim多文件切换
ctrl + 6 # 切换文件,前提操作文件后保存后才能切换
:bn # 切换打开的下一个文件
:bp # 切换打开的上一个文件
:ls # 显示使用vim打开了多少个文件
:b n # n是数字 按照索引切换文件
:vs # 垂直分屏显示,将文件分开两块显示,如果是多文件可以使用ctrl + 6 实现两块区域显示不同的文件
:sp # 水平分屏显示,将文件分开两块显示,如果是多文件可以使用ctrl + 6 实现两块区域显示不同的文件
5.文件的inode与block
5-1.inode
inode是什么:
- 文件系统的核心,能是文件系统管理文件的属性和数据,不依赖文件名称,及时文件名称被修改不会影响内容和属性。
- 可以理解为数据库中的ID值,在一行数据中除了ID,其他的字段都可以变化。
- inode不仅仅是一个编号(数据库的ID),同时它也是数据结构,文件的元数据包含文件大小,权限等等数据。
inode理解:
- 可以将它理解为一本书的章节名称,但是不会对内容记录,那么对内容在怎么修改不会影响到章节名称。
inode意义:
- inode可以让linux支持硬链接,多个文件名称指向这个inode,共享相同的文件数据,提供了一种共享的机制。
inode关键点:
- 具有唯一性,相同的文件系统下不可能出现两个相同的inode,就如数据库的ID字段一样不会出现两个一模一样的ID,所以使用硬链接时,不能夸文件系统就是这个原因。
- inode不可变化,当被创建后,这个inode值不会变化,但是其他的元数据会变化。
- 数量是有限的,取决于文件系统的大小和inode占据的空间,这个数量由文件系统的inode与数据块的比例决定。当inode用尽时,即使磁盘上还有未使用的数据块。
- inode的声明周期是与文件系统相关联,如果文件系统卸载,那么inode也会被销毁。
- inode不仅仅是唯一标识符号,同时还包含元数据(文件权限,大小,创建时间,修改时间等等)。
- 每个文件都有一个inode,但是一个inode可以对应多个文件名(硬链接概念),多个文件可以指向同一个inode。
- inode的回收,当文件被删除,inode被系统回收标记可用状态(前提是没有硬链接指向,如果有就是硬链接数量-1),这个文件的元数据彻底删除。
怎么查看:
怎么查看文件的indoe: stat 文件/文件夹 # 进行查看 # 123.html文件的inode [root@shell ~]# stat 123.html File: ‘123.html’ Size: 38 Blocks: 8 IO Block: 4096 regular file Device: fd00h/64768d Inode: 33575004 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) Context: unconfined_u:object_r:admin_home_t:s0 Access: 2024-10-25 11:31:17.924621688 -0400 Modify: 2024-10-25 11:30:36.556851837 -0400 Change: 2024-11-04 09:56:27.517495623 -0500 Birth: - 每个字段对应的作用: File: '123.html' - 这是你正在查看的文件名。 Size: 38 - 文件的大小,以字节为单位。 Blocks: 8 - 文件占用的数据块数量。 Inode: 33575094 - 这是文件的inode号,是文件系统中唯一标识该文件的编号。 Links: 1 - 指向该inode的硬链接数量。普通文件通常有1个链接,除非有硬链接指向它。 Access: (0644/-rw-r--r--) - 文件的访问权限。这里的权限表示文件所有者有读写权限,而组用户和其他用户只有读权限。 Uid: (0/root) - 文件所有者的用户ID和用户名。 Gid: (0/root) - 文件所有者的组ID和组名。 Access: 2024-10-25 11:31:17.924621688 - 文件的最后访问时间。 Modify: 2024-10-25 11:30:36.556851837 - 文件的最后修改时间。 Change: 2024-11-04 09:56:27.517495623 - 文件状态的最后改变时间,通常是inode信息(如权限、所有者等)的最后修改时间。
总结:
1.inode就是文件系统中文件/文件夹的元数据,非常简单的理解就是,类似于数据表的一行数据,记录了各种内容除了ID(inode号)不变其他都会变化。 2.inode是占据磁盘空间,这个空间是根据文件系统来定的,XFS文件系统中,inode的大小可以是512字节,EXT4文件系统中,inode的大小通常是128字节或256字节。占据这么多空间就是为了记录文件的inode数据(元数据)。 3.inode数量有限根据文件系统与磁盘大小进行计算而定,可以通过命令 "df -i "进行查看。
5-2.block
block是什么:
- 文件数据在磁盘中存储的物理最小单元,根据文件系统而定,创建文件或者文件夹时没有数据的情况下占据的最小空间。
- 文件储存在硬盘上,硬盘的最小存储单位叫做"扇区"(Sector)。每个扇区储存512字节(相当于0.5KB)。
- 操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个"块"(block)。这种由多个扇区组成的"块",是文件存取的最小单位。"块"的大小,最常见的是4KB,即连续八个 sector组成一个 block。
5-3.文件与文件夹的关系
# 目录是一个特殊的文件,目录保存的是当前目录下的文件名字
简单说,文件夹就是方便人类记忆文件存在哪、然后通过这个文件名吗,找到对应的文件inode号
inode号里记录了文件数据所处的block位置,最终访问到数据
可以理解为:
文件夹(文件夹的block)中存储的文件信息,在根据文件信息中inode编号找到block中的数据
文件夹记录 -> 文件夹内的文件的inode号
↓
根据文件inode号找到block的数据
6.软连接与硬链接
6-1.软连接
使用:
ln -s 源文件或目录 目录/文件
特点:
1.软连接的文件inode信息,只记录源文件的路径
2.删除软连接不会影响源文件。
3.如果删除源文件,软连接无法使用,因为找不到源文件。
源文件 = 家
软连接 = 传送门
传送门可以直接传送到家,如果家没了,那么传送门就没有意义了,传送门消失,不影响你回家。
6-2.硬链接
使用:
ln 源文件 目标文件夹/文件
特定:
1.只能对文件做硬链接,不能垮文件系统。
2.创建的硬链接的inode信息相同的,硬链接inode信息 = 源文件的inode信息 共享。
3.删除一个硬链接,不影响源文件与其他的硬链接。
4.可以用任意一个硬链接作为入口,操作文件
5.硬链接为0时,文件也就被删除,inode号被回收。
6.文件夹的硬链接,默认是2个,以及是2+(第一层子目录总数)=文件夹的硬链接数量
删除源数据,那么硬链接在本质上就变为了唯一路径也就变为源数据。只有在删除硬链接,那么数据才会真正的消失。
使用书本进行描述这个概念。
源数据 = (原书)
硬链接 = (原书分身)
无论哪个人来借来(分身还是原书)看,都是相同的内容。当归还这本书(无论是分身还是原书)(删除链接),那么就会立刻被销毁,但是书的内容不会消失,因为还有其他的分身存在,直到全部归还后才会消失(删除所有的链接),因为不在有分身指向这些内容。
Linux文件属性
文件属性有什么:
- 文件类型文件的权限。
- 文件的链接属(文件的硬链接)。
- 文件的属主属组。
- 文件的大小。
- 文件最后的修改时间。
- 文件的名称。
怎么查看文件属性:
- 使用:
ls -la
命令进行查看,-l
列表形式展开详情,-a
查看隐藏文件。1.文件类型和权限: -:表示这是一个普通文件。 rw-r--r--:表示文件的权限。从左到右,第一组rw-表示文件所有者(owner)的权限,可以读(r)和写(w);第二组r--表示与文件所有者同组的用户(group)的权限,可以读;第三 组r--表示其他用户(others)的权限,也可以读。 2.链接数: 1:表示这个文件有1个硬链接。硬链接是文件系统中指向文件数据的路径,一个文件至少有一个硬链接,即其文件名。 3.所有者和组: root root:第一个root表示文件的所有者是root用户,第二个root表示文件属于root组。 4.文件大小: 12:表示文件的大小是12字节。 5.修改日期和时间: Nov 12 09:47:表示文件最后一次被修改的日期和时间是11月12日的09:47。 6.文件名: 123.log:这是文件的名称。
第一个字符代表文件类型:
- [d]:文件夹
- [-] :文件
- [l]:软连接
- [b]:设备文件,提供存储的设备接口。
- [c]:串行端口设备,键盘鼠标等等(一次性读取设备)。
- 其他...
1.文件权限
权限说明:
- linux是多任务,多用户的系统,A用户 B用户 在一起使用linux系统时,对机器上的文件操作,权限是怎么样的。
- 为了保护数据的安全性。 在linux中,一切皆文件,我们要对文件进行读取,执行(脚本),权限就非常重要。
为什么用权限:
- 保护系统的数据,文件,进程。
- 权限限制,审计作用。
- 针对不同的员工,不同的员工职责,分工不同,权限设置不同。
- 对于外来的攻击进行防御。
权限的分类(用户的角色分类):
- 属主:user(创建者)
- 属组:group(属组)
- 其他:other(其他人)
文件权限说明:
[-] [rwx] [r-x] [r--] 1 2 3 4 1:代表是文件为目录还是文件 2:属主的权限 3:属组的权限 4:其他用户的权限
1-1.权限字母代表的作用
字符 | 文件 | 目录 |
---|---|---|
r | 可以查看文件 | 可以查看文件夹下的内容 |
w | 可以编辑修改文件 | 可以创建删除文件夹下的文件 |
x | 文件可以被系统执行 | 可以进入文件夹内 |
1-2.权限字母数字表示
权限 | 对应数字 | 意义 |
---|---|---|
r | 4 | 可读 |
w | 2 | 可写 |
x | 1 | 可执行 |
- | 0 | 无权限0表示 |
比如:- rwx r-x --- 对应的数字权限
rwx:421
r-x:401
---:000
计算:
rwx = 4 + 2 + 1 = 7
r-x = 4 + 0 + 1 = 5
--- = 0 + 0 + 0 = 0
- rwx r-x --- 最后总体计算后: 750
1-3.chmod修改权限位
作用:
修改(目录和文件)的权限位,权限包含属主属组其他的权限(包括 user group other对应的权限)
这个命令
命令:
chmod
参数:
-R 递归进行修改,如果相对目录下的全部文件修改使用这个参数
命令使用:
chmod 参数 权限设置 文件/文件夹
说明:
u:属主 user
g:属组 group
o:其他 other
a:代表了 属组属主其他 user+group+other
方式1:使用+ -设置权限
+:设置权限
-:取消权限
命令书写方式:
chmod u+x 123.log # 属主设置执行权限
chmod a+x 123.log # user+group+other设置了执行权限
chmod u-x 123.log # 属主取消执行权限
chmod a-x 123.log # user+group+other取消了执行权限
chmod u+x,u+w,u+r 123.log # 属主设置读写执行权限
chmod u+rwx 123.log # 属主设置读写执行权限
方式2:使用数字代表设置权限
r = 4
w = 2
x = 1
# 以数字的方式代表权限位进行设置。
书写方式:
chmod 777 123.log # 对user+group+other设置读写执行执行权限
第一个7:属主的权限数字总和rwx
第二个7:属组的权限数字总和rwx
第三个7:其他的权限数字总和rwx
# 无论是文件还是文件夹都可以使用chmod +- 或者 数字的方式对 属主属组其他进行权限设置。
1-4.chgrp修改属组
作用:
修改(文件/目录)属组,改变文件或者文件夹的属组
参数:
-R 递归进行修改,如果相对目录下的全部文件修改使用这个参数
用法:
chown 参数 新属组 文件/文件夹
使用:
chgrp wkx 123.log # 将 123.log的属组 修改为 wkx组
chgrp -R wkx test # 将test 文件夹属组 修改为 wkx组
1-5.chown修改属主
作用:
修改(目录/文件)属主,改变文件夹的属组
参数:
-R 递归进行修改,如果相对目录下的全部文件修改使用这个参数
用法:
chown 参数 新属主 文件/文件夹
使用:
chown wkx 123.log # 将文件 123.log的属主修改 wkx组
chown wkx:wkx 123.log # 将文件的属主与数组一起修改为 wkx
chown -R wkx test # 将文件夹以及内部的内容属主修改为 wkx组
2.文件特殊权限
有哪些:
- SUID
- SGID
- SBIT
SUID是什么,作用:
- 仅对二进制命令有用,仅在当前执行过程中才有效。
- 执行者对该命令具有 x 执行权限,执行者用于owner的权限。
- 当用户执行某条命令时,如果SUID权限,那么会以命令的属主进行执行。
SUID是什么,作用:
- 仅对二进制命令有效,用户对二进制命令具执行权限x。
- 执行者在执行命令时,会获取该程序的用户组支持。
SBIT是什么,作用:
- 仅仅对目录产生效果。
- 当用户对目录有 wx权限,即可有写入权限。
- 当用户在该命令下创建文件时,只有root和当前用户可以进行删除。
对照表
类别 suid sgid sticky 字符表示 S S T 出现位置 用户权限位x 用户组权限位x 其他用户权限位x 基本权限位有x s s t 数字表示法 4 2 1 八进制表示法 4000 2000 1000 生效对象 用户位 用户组 其他用户 说明:
特殊权限表示: suid:修改user权限 使用s表示出现在user权限为x位置 x存在:s表示 rwsrwxrwx x不存在:S表示 rwSrwxrwx 数字表示:4 # 如果要设置权限 4777 4放在最前面 suid:group 使用s表示出现在group权限为x位置 x存在:s表示 rwx rws rwx x不存在:S表示 rwx rwS rwx 数字表示:2 # 如果要设置权限 2777 2放在最前面 suid:other 使用s表示出现在other权限为x位置 x存在:t表示 rwx rwx rwt x不存在:T表示 rwx rwx rwT 数字表示:1 # 如果要设置权限 1777 1放在最前面
2-1.SUID
基本原理:
1.suid通过s标识,存在与用户权限为的x权限对应位置
2.如果某文件,用户权限本身就有x,那么设置的suid时,用小写的s标识,否者就是大写S
3.给文件设置s权限对应的数字表示4,八进制4000
4.suid同样可以使使用chmod命令进行修改,可以使用字符或者数字表示
作用:
1.suid特殊权限仅适用于可执行文件
二进制命令。
比如:/usr/bin/passwd 或者 /usr/bin/mount
2.文件设置suid权限的文件,那么当用户执行文件时,是以文件属主的身份执行这个文件的 # 可以理解为什么passwd命令普通用户也可以使用
3.一旦文件执行完毕,身份也就消失
1.怎么设置SUID
字母表示: u+s 设置suid
数字表示: 4777 设置ugid # 4就代表suid
chmod u+s 123 # 设置 suid
chmod 4777 123 # 设置uid
# 显示时,如果有x权限,那么x位置显示小s,如果没有x权限,x位置显示大写S
2.实际用法
suid可以让普通用户,暂时拥有root权限,进行操作。
比如命令:passwd命令具有suid特殊权限,将这个特殊权限取消
chmod u-s /usr/bin/passwd
那么普通用户虽然能执行命令(因为other是允许 r-x),命令输入的到最后,无法将新密码写入到/etc/shadow(root权限才能写入)中报错
总结:
SUID位的文件被执行时,该文件将以所有者的身份运行,也就是说无论谁来执行这个文件,他都有文件所有者的特权。
如果属主是root的话,那么执行人就有超级用户的特权了。这时该位将变成一个安全漏洞,因此不要轻易设置该位。
1. suid功能是针对二进制可执行命令设置的,不能用在shell脚本上。
2. 用户权限位的x权限位置处,如果有s或S,表示该命令存在suid权限。
3. suid的作用就是,让普通用户在执行设置了suid权限的命令时,可以拥有其(属主)的权限(一般默认是root)。
4. 二进制命令,如系统提供的ls,mkdir等命令,都需要有x权限才可以操作。
5. suid是一个危险的命令,对系统有一定威胁,一般依然是用sudo命令代替suid等特殊权限操作。
6. 系统安全优化时,会尽量去除所有设置suid的命令。
2-2.SGIU
原理:
1.对二进制命令来说,sgid的功能与suid基本相同,只不过一个是设置属主的权限,一个是设置属组的权限,和9位基本rwx那个理解概念一样。
2.suid是获取文件属主的权限,sgid获取属组的权限
3.sgid主要用于文件夹的设置,某个目录设置sgid之后,在该命令中创建文件,都是以(目录属组的)权限为准,'而不属于创建该文件的用户权限',以组的权限为准,实现了一个共享的文件夹
作用:
一般直接和文件夹结合使用,给文件夹设置sgid,等同于设置了一个共享的文件夹操作
当对文件夹设置的sgui时,那么文件内也会拥有这个sgui权限。
设置:
字母表示: g+s 设置sgid
数字表示: 2777 设置sgid # 2就代表sgid
chmod g+s test/
chmod 2777 test/
总结:
1.当无论是访问或者执行,都会以属组的权限进行操作文件二进制命令或者文件夹
2.sgiu与suid的性质类似。
3.最好的用法就是设置一个共享文件夹的,A组创建一个test文件夹,设置sgui权限,那么除了A组成员外,B组,C组也可以进行到文件中进行操作,操作时不在是按照其他(O)角色进行操作,而是按照属组的形式操作。
2-3.SBIT(sticky)粘滞位特殊权限
原理:
在一个权限为777的文件目录下,所有用户,可以进行rwx的操作,也就意味着,随时删除其他人的资料!!(很危险)
作用:
1.当目录有了粘滞位特殊权限,这个目录除了root用户特殊以外,任何用户都只能删除、移动自己的创建的文件,而不能影响到其他人
2.粘滞位(Sticky bit),又称作粘着位,linux下另一个特殊权限
sbit粘滞位,用的已经很少了,但是对于系统特殊文件夹/tmp来说,是整个系统所有用户的临时文件存放地,谁都有任意的权限,你会发现该目录的权限巨大。
比如:
tmp文件就是这样的,当A用户创建文件,B用户不能根据/tmp的权限对A创建的文件进行删除
# linux 中得 tmp / 但是看到了一个特殊权限t
[root@yuchao-tx-server ~]# ll -d /tmp/
drwxrwxrwt. 8 root root 4096 3月 16 18:54 /tmp/
设置:
字母表示: o+t 设置sbit
数字表示: 1777 设置sbit # 1就代表sbit
chmod o+t test/
chmod 1777 test/
3.隐藏属性权限
隐藏属性:
- 除了 r w x 权限外,ext2、ext3、ext4等扩展文件系统设计。
- 重要的属性就是可以设置其不可修改的特性,让文件属主也不可以进行修改。
- 可以提升系统的安全性。
命令使用:
- 设置:
chattr
- 查看:
lsattr
注意:
- 普通用户只能进行查看,不能进行设置,设置由root设置。
3-1.chattr命令
命令:
chattr
参数:
+ 添加某个特殊参数
- 删除某个特殊参数
a 文件只能增加数据,不能删除,只有root才能设置
i 类似于文件锁定,什么都不能干,只有root才能设置
-R 递归更改目录属性
使用:
chattr 参数 文件
例如:
chattr +i 123.log # 123.log设置i特殊属性
chattr -i 123.log # 取消123.log设置i特殊属性
3-2.lsattr命令
命令:
lsattr
参数:
-a 显示隐藏文件殊扩展权限 (显示全部)
-R 递归列出目录特殊扩展权限(查看目录内部)
-d 列出目录本身的扩展权限 (显示文件夹内部)
使用:
lsattr 参数 文件/文件夹
例如:
lsattr -a test/ # 查看全部特殊权限记录
lsattr -R test/ # 显示文件夹内部的特殊权限
lsattr -d test/ # 显示具有特殊权限的
5.文件默认权限:umask
umask是什么:
- 目前用户在新建文件或者目录时的权限默认值。
umask作用:
- 用来设置限制新文件权限的掩码。当新文件被创建时,其最初的权限由文件创建掩码决定。用户每次注册进入系统时,umask命令都被执行,并自动设置掩码改变默认值,新的权限将会把旧的覆盖。
注意:
- root用户与普通用户的umask是不同,可以通过/etc/profile文件中进行查看区分。
- 在与其他的用户(同一台服务器)进行分享文件或者文件夹,注意权限问题,需要适当的修改相应的权限。
4-1.怎么查看umask
命令:
umask # 默认以数字形式显示权限设置分数
参数:
-S 查看以符号显示文件与文件夹权限
umask 数值默认显示: 0022
umask 符号显示:u=rwx,g=rx,o=rx
[root@linux01 ~]# umask
0022
[root@linux01 ~]# umask -S
u=rwx,g=rx,o=rx
4-2.umask计算
在/ect/profile配置关于umask部分已经定义:
root umask值: 022
普通用户 umask值: 002
文件权限的数字:
r = 4
w = 2
x = 1
怎么进行计算(使用符号进行计算,如果使用数字计算容易出现问题):
1.文件:文件的默认最大权限(rw-rw-rw-)不具有执行权限,rw-rw-rw- = 666
root用户的文件权限:
(rw-rw-rw-) - (----w--w-) = rw-r--r--
普通用户的文件权限:
(rw-rw-rw-) - (-------w-) = rw-rw-r--
2.文件夹:文件夹默认最大权限(rwxrwxrwx),rwxrwxrwx = 777
root用户的文件权限:
(rwxrwxrwx) - (----w--w-) = rwxr-xr-x
普通用户的文件权限:
(rwxrwxrwx) - (-------w-) = rwxrwxr-x
4.ACL访问限制
场景:
- 开发组中有用户 a1 a2 a3 三个成员,他们有自己的私人文件和自己的主文件,但是他们需要再一个目录下进行工作。
# 假设工作的文件是 /srv/project 目录下 1.创建目录 mkdir -p /srv/project 2.修改文件权限 chmod 770 /srv/project # 只对 project 文件修改权限 3.将当前目录的属组修改为 project chgrp project /src/project # 只对project修改属组 [root@shell ~]# ls -ld /srv/project/ drwxrwx---. 2 root project 6 Nov 17 09:28 /srv/project/ 4.将a1 a2 a3用户添加到project组中 gpasswd -a a1 project # 将a1添加到project组中 gpasswd -a a3 project # 将a3添加到project组中 gpasswd -a a2 project # 将a2添加到project组中 那么 a1 a2 a3 就可以project组员的身份进行操作/srv(属主属组都是root,但是other权限 r-x 是允许进入到 srv文件中,srv文件权限不会影响到内部的srv下文件或者文件夹的权限) 下project文件夹
当有一天,公司安排一个审查人员 b1 需要监督审查project文件下的项目的情况,只能查看,不可以修改,那么权限怎么实现?
是直接将 b1 添加到 project 用户组?如果添加到用户组中,那么b1就会拥有project文件rwx权限,如果修改project文件权限rw-那么也可以,但是不是最优方案。
ACL是什么:
- ACL是Access Control List(访问控制列表)的缩写,不过在Linux系统中,ACL用于设定用户针对文件的权限。这个功能可以解决上述的问题,ACL只针对用户设置对文件的权限,不设置 user group other 三类权限,单独给用户设置独有的权限使用。
4-1.怎么检查与安装
1.检查是否支持ACL
dmesg |grep ACL
2.如果没有命令就需要单独安装
yum install -y acl
3.命令就2个
getfacl
setfacl
4-2.查看命令
命令:
getfacl
参数:
-p 不去除路径前面的/ # 这个参数加与不加都无所谓,因为在查询是如果是从 跟路径开始,那么就会存在提示,如果不想有提示就添加这个参数
使用:
getfacl 参数 文件/文件夹
例如:
getfacl /srv/project # 查看 project 的acl访问限制
4-3.设置命令
命令:
setfacl
参数:
-m 设置acl权限,
用户设置权限:则使用"u:用户名:权限"格式赋予;
组设置权限:则使用"g:组名:权限" 格式赋予
-x:删除acl权限
-b:删除所有的acl权限
-d:设置默认的acl权限
只对目录生效,指目录中新建立的文件拥有此默认权限;
-k:删除默认的acl权限
-R:递归设置acl权限
不加-R的话,生成新子目录后,权限不继承。
指设定的 ACL 权限会对目录下的所有子文件生效
使用:
setfacl 参数 文件/文件夹
setfacl -m u:用户名:权限(rwx) -R 文件/文件夹 # 对用户单独设置
setfacl -m g:用户组:权限(rwx) -R 文件/文件夹 # 对用户组设置
例如:
1.对用户设置
setfacl -m u:b1:rx -R /srv/project # 对用户b1单独设置project的rx权限
2.对组设置
setfacl -m g:g123:rx -R /srv/project # 对用户组g123单独设置project的rx权限
3.删除acl
setfacl -bR /srv/project # 删除acl权限
Linux用户与用户组
用户是什么:
- 用户是指拥有特定权限和身份标识的账户。每个用户都有自己的用户ID(UID)、主目录和一组权限,这些权限决定了用户可以执行哪些操作。
- 用户管理是Linux系统管理的一个重要方面,确保了系统的安全性和多用户环境下的有效资源管理。
- 而每个用户都有三重身份,主,组,其他。
用户的三重身份解释:
- 属主:文件或者文件夹的主用户,也就是所有者。
- 属组:文件或者文件夹的属于的用户组。
- 其他:除了上述的两种方式外的,也就是不包含属主与属组中的。
用户角色划分:
- 管理员用户(root):用于执行较高的权限任务,按照软件,修改系统参数等等。
- 普通用户:用户日常使用,可以限时敏感的部分访问。
- 虚拟用户:也被称为服务用户,不能进行登录,只能用于启动某项服务,比如:nginx安装后就会创建nginx的用户用来启动。
用户组:
- 通过用户组的号码(GID) 可以把多个用户加入同一个组中,从而方便为组中得用户统一规划指定任务。
- 每当创建一个新的用户,那么当前的用户就拥有一个单独的组(角色),只要在这个组内的其他成员就会拥有这个权限。
- 其实可以理解,方便管理,进行权限的划分,用户在不同组中,那么就可以使用不同组的权限,比如:A组有test_A文件权限,B组有test_B的权限,如果将C用户加入AB两个组,那么他就有这两个文件的权限。
用户组与用户关系:
- 一个用户可以存在一个组中,组中只有一个用户,也可以将用户添加的其他的组中,也就说用户与用户组是1对多的关系。
用户与用户组之间关系解释:
- 好比一个租房子,ABC三个人同时租了一套三室一庭的房子,那么ABC各一个房间,公用一个客厅,每一个人就是一个用户,房子就是一个用户组,房间就是用户的私人空间,而客厅就是三人的共用空间。
用户登录过程:
- 先从/etc/passwd(管理账户的)找到你登录的账户,从中读取UID与GIU,账户主目录和bash。
- 在进行校对密码/etc/shadow(密码相关的),成功后就会进入shell管控阶段。
1.root用户
linux系统特性就是可以满足多用户,同时工作,因此linux具有较好系统安全性。
root用户时系统中得超级管理员用户,它拥有最高的系统所有权,能够管理系统中得各项功能,如:添加用户,删除用户,启停,开启关闭硬件设备,由于root用户的权利较大,一个错误就会导致系统崩坏。
uid:用户的身份证
gid:就是当前用户的组id
groups:当前用户的除了自己的组(创建用户时,在不指定用户组的情况下会将用户名作为一个单独的组设置)还是添加的其他的组
# 补充:
系统中用户uid为1~999 linux在安装的服务程序都会创建的独立的用户使用的uid账户,安装程序使用
普通用户的uid是由1000开始,有管理员创建(centos 7 ), 最大的值1000-60000的范围,可以在 /etc/login.defs 文件中查看 UID_MAX 但是也可以超出这个 UID_MAX 创建用户,默认是允许的。
centos6创建的用户uid是500开始的
2.用户配置文件路径
1.用户目录,创建的用户都在这里
/etc/passwd
2.用户密码目录,创建用户的密码存放位置
/etc/shadow
3.用户组目录,用户存储的目录
/etc/group
4.用户组密码目录
/etc/gshadow
5.用户初始化目录,当用户创建时,就会将当前目录下的全部的文件复制到新创建的用户目录下,并且将用户属主与用户组调整为与此根目录相同(不指定单独的用户组)。
/etc/skel # 就是用户家目录下的模版
6.普通用户家目录,当用创建时,就在当前目录下创建一个以用户名为目录,用户的专属目录
/home
7.管理员目录
/root
8.密码策略,用户UID,GID范围,账户资源限制,密码验证,账户信息,安全设置。
/etc/login.defs
# 注意:/etc/skel 非常重要
假设不小心删除了家目录的文件,就可以拷贝当前目录下的全部文件到自己的家目录下,就会恢复,如下图的情况。
怎么修复,需要通过管理员用户:
cp -rf /etc/skel/. /home/wkx/
3./etc/passwd文件解读
字段名 | 解释 | 序号 |
---|---|---|
用户名 | 对应UID,是用户登录系统的名字,系统中唯一不得重复 | 1 |
用户密码 | 存放在/etc/shadow文件中进行保护密码 | 2 |
用户UID | 用户ID号,由一个整数表示 | 3 |
用户组GID | 范围、最大值和UID一样,默认创建用户会创建用户组 | 4 |
用户说明 | 对此用户描述 | 5 |
用户家目录 | 用户登录后默认进去的家目录,一般是【/home/用户名】 | 6 |
shell解释器 | 当前登录用户使用的解释器。centos/redhat系统中,默认的都是bash。若是禁止此用户登录机器,改为/sbin/nologin即可 | 7 |
4./etc/shadow文件解读
字段名 | 解释 | 序号 |
---|---|---|
用户名 | 用户名称 | 1 |
密码 | 加密的密码根据/etc/login.defs设置的密码加密算法获取 | 2 |
最近密码修改日期 | 最近密码修改日期 | 3 |
密码不可被更改天数 | 密码不可被更改天数 | 4 |
密码需要重新更改天数 | 密码需要重新更改天数 | 5 |
密码需要更改期限前的警告天数 | 密码需要更改期限前的警告天数 | 6 |
密码过期后账户宽限时间 | 密码过期后账户宽限时间 | 7 |
账户失效日期 | 账户的失效日期 | 8 |
5./etc/group文件解读
字段名 | 解释 | 序号 |
---|---|---|
组名称 | 用户的组的名称 | 1 |
组密码 | 用户组设置的密码,x表示 | 2 |
GUI | 组id | 3 |
用户组支持的账户 | 支持的账户名称,当前组中包含的哪些用户 | 4 |
6.用户管理命令
4-1.用户创建
命令:
useradd
参数:
-g 指定用户组(不指定情况下会按照用户名创建一个用户组) # 可以是组名或则组id
-G 添加额外用户用户(在原有基础上添加一个新的用户组) # 可以是组名或则组id
-u 设置用户uid
-c 设置用户的注释
-s 指定用户的登录的bash解释(登录 /bin/bash 不登录/sbin/nologin)
-M 不创建家目录(一般给某个服务创建用户时使用的)
# 注意:
在创建用户时,是没有密码的,需要进行设置密码。
使用:
useradd -g user w12 # 创建用户w12并且指定用户组
创建用户w12
-g user:指定用户user
useradd -g gg -G user w13
创建用户w13
-g gg:指定用户组 gg
-G user:指定额外用户组 user
useradd -u 10086 w15
创建w15用户指定
uid 10086:uid设置为10086
useradd -c '这是一个测试用户不能登录,并且没有家目录' -s /bin/nologin -M w18
创建w18用户
-M :不创建家目录
-s /bin/nologin:不设置登录解释器
-c:设置用户注释信息
4-2.用户修改
命令:
usermod
参数:
-u 修改用户uid
-c 修改注释
-s 修改登录解释器
-G 指定新用户组 # 可以是组名或则组id,如果额外用户组是1个情况下就会添加,如果额外用户组是两个就会修改最后一个为指定的用户组
-g 指定用户主组 # 可以是组名或则组id
-L 对用户加锁 # 不能登录
-U 对用户解锁 # 可以登录
使用:
usermod -g gg w11
修改原w11用户组
-g gg:修改为 gg
usermod -c '666666' w18
修改原 w18的注释信息
-c '666666':修改为 666666
usermod -G user w11
为w11添加额外组
-G user:添加额外user组
usermod -L w11
为w11设置锁
-L:加锁,用户无法登录。
4-3.用户删除添加额外组
命令:
gpasswd
参数:
-d 删除用户的某个组
-a 将用户添加到某个组中
-r 删除组的密码
使用:
gpasswd -d w11 wkx
将用户 w11 从 wkx 用户组删除
gpasswd -a w11 user
将用户 w11 添加到 user 用户组
4-4.修改密码
命令:
passwd
# 注意:
1.使用root用户修改密码,是可以指定相应用户的(因为是管理员)。
2.如果使用不是root,那么只能修改当前用户密码,不能指定用户。
参数:
--stdin 非交互式修改密码
echo 新密码 | passwd --stdin 用户名
命令2:kv形式的修改密码
chpasswd
echo 用户名:密码 | chpasswd
使用:
echo 123123 | passwd --stdin w11
这种方式可以进行批量创建用户同时设置密码。
echo w11:123123 | chpasswd
明文修改密码
4-5.删除用户
命令:
userdel
参数:
-r 删除用户和响应的配置文件(包括家目录登录)
-f 强制删除,那怕登录
使用:
userdel -rf 用户名
# 注意:
删除用户时,如果创建用户的组(在未指定组的情况下),其他用户也在用户的组中,那么这个组不会被删除
如果用户没有家目录,那么当使用-r删除时,就会存在提醒。
4-6.其他命令
1.id
参数:
-u 显示用户id
-g 显示用户组id
-un 显示用户名
-gn 显示组名
使用:
id 参数 用户名
2.显示当前的登录中段信息
who
tty:虚拟终端代称(登录了虚拟终端vmware才会有,没有登录就没有)
pts:ssh远程终端的代称(使用了多少个ssh链接服务器就会显示多少个,并且显示宣传链接ip)
3.打印当前登录用户
whoami
4.显示系统登录用户信息,以及负载信息
w
5.最新的终端登录信息
last
6.显示哪些用户正在登录
lastlog
4-7.用户切换
用户切换命令
su - 用户信息
su - 将用户的环境变量以及信息进行切换(相当于重新登录当前用户)
su [不加-] 不会加载用户的环境变量,日志信息与其他的资源还是用的上一个切换用户的资源。
加 - :切换环境变量
不加 : 使用切换之前的用户的环境变量
4-8.用户密码失效
# 管理员设置完毕用户的密码后,也可以对用户设置密码失效
命令:
chage
参数:
-l 查看用户密码设定情况
-d '格式:日期 yyyy-mm-dd' 修改上一次修改的日期,对应/etc/shadow 第三个字段(最后更改密码的日期)
-E '格式:日期 yyyy-mm-dd' 修改账户失效日期(账户失效后无法使用) 对应/etc/shadow第八个字段
-I '格式:天数 d' 对应/etc/shadow第七个字段 密码失效日期
-m '格式:天数 d' 对应/etc/shadow第四个字段 密码保留最小天数(在这个时间段内无法修改密码) 为零时代表任何时候都可以更改密码
-M '格式:天数 d' 对应/etc/shadow第五个字段 密码多久需要修改(密码需要保留多久后提示修改)
-w '格式:天数 d' 对应/etc/shadow第六个字段 用户密码到期前,提前收到警告信息的天数。
使用格式:
chage 参数 用户名
例如:
chage -l wkx # 查看密码的详细参数
chage -d 0 wkx # 强制用户登录时修改密码
chage -M 90 wkx # 设置用户密码过期 90天
7.用户提权
7-1.命令
作用:
提升普通用户的使用root命令权限
命令:
sudo
参数:
-u 根据用户名常见文件
例如:
sudo -u a1 touch /opt/123 # 就会根据a1用户在/opt文件下创建123文件,属主与属组都是 a1
使用普通用户提权
sudo 命令 # 普通用户大部分都没有权限,就可以sudo命令进行提权(拥有root权限)。
7-2.用户怎么提权
用户提权操作:
1.打开/ect/sudoers文件
vim /etc/sudoers 或者 visudo
2.添加一条提权信息
# 需要提供密码
用户名 ALL=(ALL) ALL(代表可以使用的指令) # 就可以当这个用户使用sudo命令提权
# 不需要输入密码
用户名 ALL=(ALL) NOPASSWD:ALL
3.可以将用户添加到wheel组中
%wheel ALL=(ALL) ALL # 利用默认的提权用户组进行操作
passwd -a 用户 wheel # 将用户添加到wheel组
# 注意:
如果不在/etc/sudoers文件中添加用户的信息无法使用sudo 如下图
7-3.命令限制操作
ALL 代表的是全部的命令,但是并不想让用户拥有这个些命令怎么处理?
1.以root用户打开文件
vim /etc/sudoers
2.修改某个用户,不让这个用户使用passwd命令
wkx ALL=(root) !/usr/bin/passwd
# 解释:
用户wkx可以以root权限执行任何命令,除了/usr/bin/passwd这个命令
# 注意:
因为 passwd命令有 suid设置,就算不使用 sudo为前缀也可以修改密码,在测试时,可以使用其他命令测试
大部分的命令几乎都带有other权限r-x,如果强制用户使用sudo就可以将这些命令的other权限设置为---
# 设置多条命令限制:
wkx ALL=(root) !/usr/bin/passwd,!/usr/bin/ls,!/usr/bin/pwd
# 解释:
用户wkx可以使用sudo提权到root权限执行任何命令,除了/usr/bin/passwd or /usr/bin/ls or /usr/bin/pwd 这个命令
# 别名方式设置命令限制语法:支持多个用户以及复杂的命令
1.设置用户别名:
User_Alias 用户别名 = 用户1,用户2,...,用户N
2.设置命令别名:
Cmnd_Alias 命令别名 = /sbin/fdisk, /sbin/sfdisk, .....,/bin/umount
3.使用:
用户别名 ALL=(root) 命令别名
8.组管理命令
8-1.组添加
命令:
groupadd
参数
-g 自定义组id
使用:
group 参数 组名
例如:
groupadd -g 12345 www # 创建一个www组
group www333 # 创建一个www33组
8-2.组修改
命令:
groupmod
参数:
-g 修改组id
-n 修改组名称
使用:
groupmod 参数 组名
例如:
groupmod -g 789456 www # 将www组id修改为 789456
groupmod -n xxxx www # 将www组名修改为 xxxx
8-3.组删除
命令:
groupdel
参数:
-f 强制删除组,及时它是用户的主组
# 注意:
如果有任何一个群组的使用者在线上的话就不能移除该群组。 最好先移除使用者后再移除群组。
例如:
groupdel xxxx # 删除xxxx组
8-4.用户额外组添加修改
命令:
gpasswd
参数:
-d 删除用户的某个组
-a 将用户添加到某个组中
-r 删除组的密码
使用:
gpasswd -d w11 wkx
将用户 w11 从 wkx 用户组删除
gpasswd -a w11 user
将用户 w11 添加到 user 用户组
9.特殊shell /sbin/nologin
/sbin/nologin 作用:
是用户无法使用bash获取其他的shell来登录系统,并不是让这个账户无法使用其他的系统资源。比如:nginx安装后,就会创建一个nginx的账户用来管理启动nginx服务,但是这个账户是无法进行登录的。
如果想要让某个具有/sbin/nologin的用户知道,无法登录怎么办?
1.在etc创建nologin.txt
touch /etc/nologin.txt
2.在当前文件中写入你想要提示的信息
echo "无法登录" > /etc/nologin.txt
3.使用su 切换测试查看
su - wkx
10.用户配置文件读取流程
Linux的shell
shell是什么:
- 理解为一个与操作系统交互的一款软件程序,通过bash这个shell提交指令到操作系统,操作系统负责沟通内核,内核就实际的操作电脑硬件。
- 只要能够操作程序接口都能被称为shell,狭义来说shell就是命令方面的软件,bash也包含在内。广义来说shell包含图形界面软件,因为图形界面也能操作应用程序来调度内核工作的。
为什么学习shell:
- 因为命令行操作的shell都是一样的或者说是类似的,一法通,万法通。虽然有可视化的界面进行操作,但是也会有不同的图形化操作系统,操作上可能不太一样增加学习成本。
- 远程管理,命令行界面操作比较快。不容易出现断线或者是信息外漏的情况。
1.系统合法的shell
通过 /etc/shells 文件中可以查看到系统中有哪些版本shell
/bin/sh # 已经被bash替代
/bin/bash # linux默认使用的shell
/bin/ksh # kornshell 由 at&bell lab 发展出来的 兼容于bash
/bin/tcsh # 整合C shell,提供更多功能
/bin/csh # 已经被tcsh替代
/bin/zsh # 给予 ksh发展出来的,功能更为强大
其实各家的shell都是大差不差的,可能在某种语法上有些差异,但是本质上还是相同的,一般情况下使用的就是linux自带的 /bin/bash
在/etc/passwd 用户文件中默认使用登录的shell使用的就是 /bin/bash
特殊shell,这种特殊的shell不具备登录的功能作用于特定的场景下(启动某些程序,触发磁盘同步等等)
/sbin/nologin
/bin/sync
...
2.bash shell具备的功能
- bash shell 是linux默认的shell,一般情况下都是使用这个shell进行操作。
功能:
- 具有命令历史记录功能
history
命令,可以查看历史输入的命令记录最大记录1000条,这个些命令记录在用户家目录.bash_history
文件内,如果linux被黑客攻破,那么你输入的历史命令就会在这里,如果有关于数据库方面的,那么就危险了。- 命令与文件自动补全功能Tab补全。
- 命令别名设置使用
alias
命令设置命令别名,如果命令特别长,那么就可以使用别名进行操作。- 作业控制,前台,后台(job control,foreground,background)
- 程序脚本
内置命令type:
作用: 可以通过type命令知道,使用的命令是外置的还是bash自带的。 命令: type 使用: type 命令 例如: type cd # 显示是内置命令 type hostname # 显示这个命令具体在哪个位置
3.环境变量
1.env
作用:
显示当前环境下的环境变量情况
命令:
evn
解释:
[root@shell ~]# env
XDG_SESSION_ID=102 # 会话 ID,用于区分不同的用户会话。
HOSTNAME=shell # 主机名称
SELINUX_ROLE_REQUESTED= # 安全增强型 Linux (SELinux) 角色请求,用于安全策略。
TERM=xterm # 终端机使用的环境是什么类型
SHELL=/bin/bash # 使用的bash的路径
HISTSIZE=1000 # 记录历史命令的条数,默认是1000
SSH_CLIENT=192.168.85.1 55372 22 # SSH 连接使用的终端设备
SELINUX_USE_CURRENT_RANGE= # SELinux 当前范围的使用。
SSH_TTY=/dev/pts/0 # SSH 连接使用的终端设备
USER=root # 用户名称
LS_COLORS=rs=0:di=01;34:ln=01;..... # 颜色显示
MAIL=/var/spool/mail/root # mailbox的位置
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin # 环境变量
PWD=/root # 当前用户所在的目录
LANG=en_US.UTF-8 # 语言类型
SELINUX_LEVEL_REQUESTED= # SELinux的策略级别
HISTCONTROL=ignoredups # 历史记录控制,这里设置为 ignoredups,表示忽略重复的命令。
SHLVL=1 # shell 层级,表示当前 shell 的嵌套深度。如果是存在嵌套的bash,那么就会根据嵌套的bash增加
HOME=/root # 主目录文件
LOGNAME=root # 登录用户
SSH_CONNECTION=192.168.85.1 55372 192.168.85.132 22 # ssh链接情况
LESSOPEN=||/usr/bin/lesspipe.sh %s # less 命令的预处理程序,用于查看文件内容。
XDG_RUNTIME_DIR=/run/user/0 # 运行时目录,用于存储临时文件和进程间通信。
_=/usr/bin/env # 上一次执行命令的最后一个参数(或者命令本身)
2.set
作用:
查看所有的变量(包含环境变量和自定义的变量)
使用:
set
例如:
set name=123 # 设置变量,如果变量存在就是修改变量
3.stty
命令:
stty
作用:
帮助设置终端机的输出按键代表含义
参数:
-a 累出所有的stty的参数
例如:
stty -a
[root@template ~]# stty -a
speed 38400 baud; rows 56; columns 241; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0;
-parenb -parodd -cmspar cs8 -hupcl -cstopb cread -clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc -ixany -imaxbel -iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke
解释:
intr = ^C; 代表利用 ctrl + c来完成,中断正在执行的进程
eof = ^D; 代表结束输入
erase = ^?; 向后删除字符
kill = ^U; 删除目前命令上的所有文字
quit = ^\; 发送一个quit信号给正在执行的进程
start = ^Q; 对停止进程重启
stop = ^S; 停止屏幕输出
susp = ^Z; 送出一个 terminal stop的信号给运行的进程
使用命令:
stty erase ^h # 将原来的 ctrl + ? 修改为 ctrl + h
4.语言区域设置
作用:
语言区域设置,也就类似与windows中对语言进行设置。
名称:
locale
参数:
-a 列出全部支持的语言
默认的文件位置,不同的发行版位置不同。
/etc/locale.conf
怎么修改:
1.打开/etc/locale.conf
2.修改后保存,需要重启服务器才会生效。
LANG="zh_CN.UTF-8" 修改为 LANG="en_US.UTF-8"
# 或者直接修改LANG变量
LANG="en_US.UTF-8"
不是参数输出内容如下:
LANG=zh_CN.UTF-8 # 默认的区域设置
LC_CTYPE="zh_CN.UTF-8" # 控制字符分类和处理,如字符宽度、字符类别(字母、数字等)
LC_NUMERIC="zh_CN.UTF-8" # 控制数字的格式,例如小数点和千位分隔符。
LC_TIME="zh_CN.UTF-8" # 控制日期和时间的显示格式。
LC_COLLATE="zh_CN.UTF-8" # 控制字符串的排序规则。
LC_MONETARY="zh_CN.UTF-8" # 控制货币的显示格式。
LC_MESSAGES="zh_CN.UTF-8" # 控制系统消息和应用程序消息的本地化。
LC_PAPER="zh_CN.UTF-8" # 控制纸张大小和方向的本地化。
LC_NAME="zh_CN.UTF-8" # 控制姓名的格式化。
LC_ADDRESS="zh_CN.UTF-8" # 控制地址的格式化。
LC_TELEPHONE="zh_CN.UTF-8" # 控制电话号码的格式化。
LC_MEASUREMENT="zh_CN.UTF-8" # 控制测量单位(如英制或公制)。
LC_IDENTIFICATION="zh_CN.UTF-8" # 控制软件包标识信息的本地化。
LC_ALL= # 变量如果被设置,它将覆盖其他所有 locale 相关的环境变量。
5.标准输出重定向
什么是数据流:
- 在 Linux 中,一切皆文件(everything is a file),包括硬件设备、进程间通信管道、网络套接字等。文件数据流指的是从文件读取或写入数据的过程。例如,使用
cat
命令读取文件内容时,文件内容就是以数据流的形式被读取并输出到终端。分类:
- 标准输入(stdin)代码是0,使用< 或者 <<
- 标准输出(stdout)代码是1,使用> 或者 >>
- 标准错误输出(stderr)代码2,使用 2> 或者 2>>
画图理解:
标准输入: 就是在终端进行输入的命令指令等等。 标准输入: 相应的结果,比如pwd,返回就是当前所在目录文件路径 标准错误输出: 命令输入错误,提示的错误信息。
1.标准输出重定向
数据流区分:
标准输入代表:0
标准输出代表:1
标准错误输出代表:2
把命令(可执行程序)的`标准输出`与`错误输出`(程序不可能百分百正确)重定向到指定的文件,这样输出就不会再终端上进行显示,而是到指定的文件中。
> 作用:覆盖写入
语法:
echo '6666' > 123.log
使用 ">" 符号将标准输出重定向覆盖写入到文件中。形式:命令 > 文件 # 有几次都覆盖几次,永远是最后一次结果
>>作用:追加写入
语法:
echo '6666' >> 123.log
使用 ">>" 符号将标准输出`重定向`追加写入到文件中。形式:命令 >> 文件
2>作用:错误覆盖写入
语法:
llll 2> 123.log
使用 "2>" 符号将标准错误输入重定向到覆盖写入入文件中。形式:命令 2> 文件 # 命令报错,重定向到文件中,错误信息不会打印到终端中
2>>作用:错误追加写入
语法:
llll 2>> 123.log
使用 "2>>" 符号将标准错误输入重定向到追加写入入文件中。形式:命令 2>> 文件 # 命令报错,重定向追加到文件中,错误信息不会打印到终端中
2>&1作用:错误变为正常
语法:
llll > 123.log 2>&1
使用 "2>&1" 符号 简写: "&>", 将标准错误输入stderror重定向到标准输入stdout。# 2> 是将命令标准错误写入文件,而 &1 则是将 变为标准输出处理,2>&1 就是将标准错误输出当做标准输出处理
/dev/null作用:
使用 "> /dev/null" 将执行的结果重定向到空设备中,不会显示任何文件信息。形式:命令 > /dev/null # /dev/null 空设备文件,可以理解为黑洞文件,ll > /dev/null 写入到黑洞文件中,不会输出内容,不会存储文件
6.组合热键
组合按键 | 执行结果 |
---|---|
ctrl + c | 终止目前的命令 |
ctrl + d | 解释eof,例如邮件结束后 |
ctrl + m | 回车键 |
ctrl + s | 暂停屏幕输出(屏幕会被锁死,无法操作) |
ctrl + q | 恢复屏幕输出 |
ctrl + u | 在提示符下,将这个命令删除 |
ctrl + z | 暂停目前命令 |
7.文件通配符
符号 | 含义 |
---|---|
* | 代表0个和N个任意字符 |
? | 代表一个任意字符 |
[] | 代表包含[]的任意一个字符,例如[abcd]匹配的一定会带有这个些字符 |
[-] | 存在减号,代表在编码顺序内的所有字符。例如[0-9],代表0到9之间的数字 |
[^] | 如果括号中第一个字符为^,匹配除了这个些字符外的所有字符。[^p-z]它表示匹配 除了字母 p 到 z 之间的所有字母。 |
例如:
ls -d /etc/cron* # 输出/etc下以cron开头的全部的文件以及文件夹
ls -d /etc/??? # 输出/etc/刚是3个字符的文件或者文件夹
ls -d /etc/*[0-9]* # 输出/etc下包含0-9数字的文件或者文件夹
ls -d /etc/[^a-b]* # 输出开头不是 a-b非小写文件名称
8.特殊符号
符号 | 含义 |
---|---|
# | 通常代表注释,例如shell语法,或者python。 |
\ | 转义符号,将特殊符号或者通配符,转换为没有含义的符号。 |
| | 管道符号,A命令 | B命令 将A命令的执行结果给到B命令处理 |
; | 连续命令执行分割符号,连续性命令的界定。与管道符号不同。A命令 ; B命令,执行完毕A,在执行B |
~ | 用户主文件夹 |
$ | 变量前导符号,需要通过这个符号打印变量。 |
& | 作业控制符号,将执行的命令放入后台执行 |
! | 逻辑符号,代表not,非的意思。 |
/ | 路径符号 |
>,>> | 数据重定向符号,将数据导出 |
<,<< | 数据重定向符号,将数据导入 |
’‘ | 单引号,不具备特殊符号或者变量的置换作用,在单引号内,输入是什么就是什么。 |
"" | 双引号,须有特殊符号与变量的置换作用 |
`` | 可以执行命令,与$()功能相同 |
() | 在中间为shell的其实与结束 |
{} | 在中间为命令块组合 |