0%

Linux运维学习笔记:centOS用户和文件管理(一)

写在前面

linux是一个多用户、多任务系统,具有很好的稳定性和安全性,而这与linux的用户和权限管理机制密不可分。

我们在linux系统中的操作,实际上都是操作进程访问文件,这里的访问权限是基于Linux的安全管理机制的。linux上最初的安全模型,叫做DAC,Discretionary Access Contorl,主动访问控制;后来在此基础上又增加了额外的权限管理机制,成为MAC,Mandatory Access Contorl,强制访问机制。为了区分两者,将支持MAC的linux系统成为selinux,意思是linux的安全加强系统。

在实际运行过程中,系统会先做DAC检查,如不通过则拒绝执行;如果通过DAC检查且支持MAC模块,则再做MAC检查。

这则笔记分为文件系统和用户管理两个部分进行整理。

linux的文件系统

在linux当中,一切都是文件。使用ll [filename] 或者 ls -l [filename/dirname] 查看文件类型。

linux文件系统构成

linux文件目录结构:

常用文件类型:

文件类型 描述 说明
- 普通文件,包括文本文件 可用touch命令创建
d 文件目录 可用 mkdir 命令创建
l 链接文件(指向另一个文件,类似于windows下的快捷方式) 可用ln 命令创建
s 套接字文件,用于进程通信 一般由应用程序在执行过程中创建
b 块设备文件,二进制文件
c 字符设备文件,如鼠标、键盘、终端
p 管道文件 可用mkfifo命令创建
普通文件:

一般类型的文件,主要包括:

  1. 纯文本档ASCII:文件内容可以直接读到数据,例如:字母,数字等。这里文件可以用cat 命令进行查看。

  2. 二进制文件binary:Linux当中可执行文件就是属于这种格式。例如,ls、 rm、mkdir 等等常见命令。

  3. 数据文件data:有些程序在运行的过程中会读取某些特定格式的文件,那些特定格式的文件可以被称为数据文件。例如,系统登录数据会记录在/var/log/wtmp ,这就是一个数据文件,可以用last -f /var/log/wtmp 命令查看。

目录 directory

windows 下的文件夹类似,用 ll 命令查看属性的第一个字母为d

类似Windows系统底下的快捷方式! 第一个属性为l,分为软链接和硬链接,这个上一则笔记已经整理过了,下面会专门讲到。

设备文件 device
  1. 区块设备文件 block:就是一些储存数据, 以提供系统随机存取的接口设备,第一个属性为 b 。例如,硬盘、软盘等。

  2. 字符设备文件 character:串行端口的接口设备,第一个属性为c 。例如,键盘、鼠标等。

Linux 常用文件后缀名

注意:与Windows系统不同,在Linux系统下, 一个文件是否能够被执行,关键是看有没有x 权限,与文件的后缀名无关。

这里的后缀名,仅仅是为了让我们便于区分,习惯在定义文件名是加上一个后缀名。

常见的文件后缀名包括:
  • .sh : shell脚本或批处理文件 (scripts)。

  • .tar, .tar.gz, .zip, .tgz: 经过打包的压缩文件。之所以有这么多后缀名,是对应不同的压缩软件,比如gunzip, tar 等。

  • .conf:系统的配置文件。

  • .pl:perl语言文件,通过perl语言开发的程序。

  • .html.htm.php.jsp:网页文件。

  • .py:Python语言文件,通过Python语言开发的程序。

  • .rpm:rpm安装的文件。

创建删除文件目录

mkdir 命令:创建文件夹

命令格式:mkdir [参数] [文件目录]

-m 设置文件权限

1
2
mkdir -m 777 test3     //输入
drwxrwxrwx 2 root root 4096 10-25 17:46 test3 //实现效果

-p 新建一个目录串

1
mkdir -p /test1/test2

-v 创建新目录都显示信息

1
mkdir -v /test3

在指定目录下创建多个目录(使用绝对路径)

rmdir 命令:删除目录

跟mkdir 相反,rmdir表示删除目录。命令格式为:mkdir [参数] [文件目录] 。这个命令的特点在于,只能删除空目录;即使加了 -p 参数,也只能删除一串空目录。如果目录当中有文件,这个命令就没有用了。

touch 命令:创建文件

命令行格式: touch [参数] [filename]

选项 命令行格式 作用
-a touch -a file 改变档案的访问时间记录。
-d touch -d time file 设定时间与日期,可以使用各种不同的格式。
-m touch -m file 改变档案的修改时间记录。
-r touch -r file1 file2 使用参考文档的时间记录。
-t touch -t time file 设定档案的时间记录,格式与 date 指令相同。

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// 在当前目录创建 test.txt 文件
touch test.txt

// 创建多个文件
touch test1.txt test2.txt

//修改访问时间
touch -a test.txt

//查看访问修改文件的时间
stat test.txt

// 更改为自定义格式、自定义时间戳(更改访问时间、修改时间)
touch -d '18-May-2017' test.txt

// 更改修改时间
touch -m test.txt

//修改 test1.txt 为 test2.txt 文件的时间戳。
touch -r test1.txt test2.txt

// 更改为自定义时间戳
touch -t 201703031558.28 test.txt
rm命令:删除文件或目录

用来删除文件或文件目录。命令格式为:

1
rm  [参数] [文件]
常用参数 含义
-f –force 忽略不存在的文件,从不给出提示。
-i –interactive 进行交互式删除
-r –recursive,将参数中列出的全部目录和子目录均递归地删除。

注意:

  • 如果要删除非空目录,需要使用rm -rf [文件目录]
  • 千万不要rm -rf / ,一旦输入这个命令,然后就没有然后了。
拓展:如何同时创建多个文件/目录
  • 创建多个文件
1
2
3
[root@steve test]# touch {1..5}.txt
[root@steve test]# ls
1.txt 2.txt 3.txt 4.txt 5.txt
  • 创建多个目录
1
2
3
[root@steve test]# mkdir dir{1..5}
[root@steve test]# ls
dir1 dir2 dir3 dir4 dir5

查看文件命令

cattac
1
cat <filename>

cat :一次性显示整个文件内容

tac :跟cat类似,只不过cat 是从前往后(第一行 => 最后一行),tac是从后往前(最后一行 => 第一行)。

常用参数:

参数名称 作用
cat -n -n 表示显示行号
cat -A -A 表示显示所有内容
headtail

这两个命令比前一组命令强的地方在于,如果文件的内容比较多,而你只需要查询文件开头或者结尾,使用这两条命令会轻松很多。

常见用法:

1
2
head -n 10 <filename>     //显示文件开头十行
tail -n 10 <filename> //显示文件结尾十行

注意:

上述示例中n可以省略,直接写成head -10 <filename>,效果也是一样的;

如果-n 省略,默认显示10行内容。

tail特殊用法:

1
tail -f <filename>

注:加 -f 参数,动态显示文件最后10行内容,在做日志监控的时候,可以方便直观的查看变化。

1
tail -f /var/log/messages
moreless

这两个命令比headtail更高级,使用起来也更加方便,能够一页一页地方便使用者逐页阅读。

more 的用法
1
more <参数>  <filename>

常用参数:

参数名称 作用
d 在每屏的底部显示友好的提示信息
l 忽略 Ctrl+l (换页符)。如果没有给出这个选项,则more命令在显示了一个包含有 Ctrl+l 字符的行后将暂停显示,并等待接收命令。
f 计算行数时,以实际上的行数,而非自动换行过后的行数(有些单行字数太长的会被扩展为两行或两行以上)
p 显示下一屏之前先清屏。
c 从顶部清屏然后显示。
s 文件中连续的空白行压缩成一个空白行显示。
u 不显示下划线
/ 先搜索字符串,然后从字符串之后显示

常用操作命令

操作命令 作用
Enter 向下n行,需要定义。默认为1行
Ctrl+F 向下滚动一屏
space 向下滚动一屏
Ctrl+B 返回上一屏
= 输出当前行的行号
:f 输出文件名和当前行的行号
v 调用vi编辑器
! 调用Shell,并执行命令
q 退出more
less命令
1
less <参数>  <filename>

常用参数:

参数名称 作用
b 设置缓冲区的大小
e 当文件显示结束后,自动离开
f 强迫打开特殊文件,例如外围设备代号、目录和二进制文件
g 只标志最后搜索的关键词
i 忽略搜索时的大小写
m 显示类似more命令的百分比

常用操作

参数名称 作用
space 翻页
j 光标向下移动一行
k 光标向上移动一行
/ 按下 /后输入关键词enter即可搜索,查看多个搜索结果时,按n进行切换。
/ 作用类似,不同之处在于/当千行向下搜索,是当前行向上搜索。

搜索文件

find 命令搜索文件

注:find是常用命令,需要熟练掌握。

命令行格式: find [路径] [参数] -print

上述命令可以简单地理解为find + 限定条件 通过限定条件来查找所需的文件。-print将匹配的文件输出到标准输出,可省略。

  • 结合路径进行搜索

路径,此选项可省略,指的是查找的目录路径,比如要在home目录下找某个文件,就是/home ;需要在etc 目录下找某个配置文件,就是 /etc

  • 查找$HOME目录中的文件
1
find ~ -name "*"    // ~ 表示家目录
  • 在当前目录及子目录中查找所有的‘ *.log‘文件
1
find . -name "*.log" //. 表示当前目录;*是通配符,表示任意字符
  • 在当前目录及子目录中查找文件名以一个大写字母开头的文件
1
find . -name "[A-Z]*"
  • -name 按照文件名查找文件
1
find . -name [filename]
  • -type按照文件类型查找文件
1
2
3
4
5
6
7
8
find . -type [filename]

b - 块设备文件。
d - 目录。
c - 字符设备文件。
p - 管道文件。
l - 符号链接文件。
f - 普通文件。
  • -time -n/+n 按照文件的更改时间来查找文件

文件的inode当中,有三个时间time 信息,分别是:

atime:Access time,在读取文件或者执行文件时更改,即文件最后一次被读取的时间。查看atime,使用 ls -lu filename

mtime:Modified time,在写入文件时随文件内容的更改而更改,是指文件内容最后一次被修改的时间。查看atime,使用ls -l filename

ctime:Change time,在写入文件、更改所有者、权限或链接设置时随 Inode 的内容更改而更改,即文件状态最后一次被改变的时间。查看atime,使用 ls -lc filename

后面的 n 表示天数,比如 -atime +n/-n 表示访问或者执行时间大于或小于n天的条件。

  • -perm 按照文件权限来查找文件
1
find . -perm 755 –print    //在当前目录下查找文件权限位为755的文件
  • -user 按照文件属主来查找文件
1
find ~ -user sam –print     //在$HOME目录中查找文件属主为sam的文件
which 查询可执行文件的绝对路径

命令行格式: which [filename]

whereis 查找文件

命令行格式: whereis [参数] [filename]

参数 含义
-b 只查找二进位制文件
-m 只查找帮助文件(man 目录下的文件)
-s 只查找代码文件

locate 查找文件

跟whereis 作用类似,通过查找预先生产的文件列表库来查找文件。

locate命令 需要单独安装,

1
yum -y install mlocate

安装完成后,初次使用需要生产文件列表库

1
updatedb

查找文件

1
locate [filename]

注:默认情况下,数据库每周更新一次;如果一个文件正在两次更新时间段之间的创建的,就搜不到结果。

文件路径

相对路径和绝对路径

顾名思义,文件路径就是用来描述存放文件的地方。这里有两种描述的方法:

  • 绝对路径:从根目录写起的,叫做绝对路径,比如 /var/... 或者 ~/...
  • 相对路径:与当前目录相对的写法,叫做相对路径。

举例来说:

pwd //查询当前所在的绝对路径

上图中,红框标示出来的部分,就是当前所在的绝对路径,即 /Users/stevey/documents/github-file ,通过 ls 命令可以看到,下面有一个 steveBlog 的文件夹。

要进入这个文件夹可以采用两种方法:

1
2
3
cd steveBlog        //相对路径

cd /Users/stevey/documents/github-file/steveBlog //绝对路径

文件路径相关的命令

tree 命令查看目录结构

tree命令是以树状形式显示目录下的文件或子目录;系统默认没有的,需要自行安装。

  • 安装
1
yum install -y tree
  • 命令格式
1
2
3
//n表示目录层级数
//dir表示目录名称
tree -L [n] [dir]
  • 使用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
//-L 表示查看目录层级,2表示查看两级目录。
[root@VM_0_7_centos ~]# tree -L 1 /tmp/
/tmp/
├── cvm_init.log
├── mysql.sock
├── net_affinity.log
├── nv_gpu_conf.log
├── sess_cv242b2kg0v1n6lier3cavvskctvd1dn
├── sess_d2360tgsa14ivnfsou9kspf4q6c70iq2
├── sess_e68jsk46a5bqdm6ummjj0crir1teb4v1
├── sess_vstbaspckikbfde14nqlh4ptvdbfgu36
└── setRps.log

0 directories, 9 files
ls 命令查看目录信息
名称 作用
ls 列出当前目录下的文件和文件夹,不包括隐藏文件
ls -a 列出当前目录下的文件和文件夹,不包括隐藏文件
ls -l 列出除隐藏文件之外的所有文件和目录的详细信息,包括权限、所属主、所属组、文件创建日期时间
ls <filename> -l 查看某个文件的详细信息
ls <file-Folder-name> 查看指定目录下的文件和目录
ls -Rl 显示当前目录及所有子目录信息
ls -tl 以时间排序显示目录,查找最新文件有用
ls -Sl 以文件大小排序
ls -s -l -S 显示文件大小,并按大小排序

示例:

pwd 命令:显示当前目录绝对路径

用于显示当前所在目录。在linux系统中, .表示当前目录, ..表示上一级目录。

示例:

1
2
[root@VM_0_7_centos ~]# pwd
/root
cd 命令:切换目录
名称 作用
cd 返回用户主目录
cd /etc 改变到其它路径
cd .. 返回到上一级目录
cd / 或 cd ~ 返回到根目录
cd - 返回之前的目录
alias 命令

alias 命令用来设置指令别名,如果命令过长,那么就考虑可以设置一个别名。

命令行格式:

1
alias 新的命令='原命令 -选项/参数'

示例:

  • 显示当前已设置的别名
1
alias

  • 设置vim别名
1
2
// 设置别名,输入`vi` 调用 `vim`
alias vi='/usr/bin/vim'
  • 删除别名
1
unalias vi
  • 查询alias 更多用法
1
man alias  //按 `space `下翻页,按` q `退出。
cp 命令:文件复制

命令格式为 cp [参数] [源文件] [目标文件],常见参数用法:

  • -r复制目录及目录内的所有项目

  • -i覆盖前询问

mv 命令:移动或重命名

命令格式为 mv [参数] [源文件或目录] [目标文件或目录] ,常见用法如下:

  • 目标是目录,且目录已存在

  • 目标是目录,但该目录不存在(实际相当于给文件重命名)

  • 目标是文件,且该文件已存在(实际相当于覆盖目标文件)

  • 目标是文件,但该文件不存在(实际相当于重命名源文件)

文件权限管理

文件基本权限

文件的基本权限包括读read、写write和执行execute,分别可以用4、2、1来表示;

它与用户密不可分,分为三组进行管理:

  • user:对文件/目录所属用户设定权限;

  • group:对文件/目录所属组设定权限;

  • other:对文件/用户其他的组和用户设定权限;

对于文件而言:

  • Read: 表示可读取文件内容;

  • Write:表示可编辑、新增、修改、删除文件内容;

  • execute:表示可执行一个脚本程序;

对于目录而言:

  • Read: 表示可读取目录内的文件列表;

  • Write:表示可在目录内编辑、新增、修改、删除文件内容;

  • execute:表示能够进入目录;

文件的特殊权限

set uid

这是一种对二进位制程序设置的特殊权限,临时允许二进位制程序执行者用户文件所属主的权限,这是一种临时的、特殊的、有条件的授权方法。

这里有两个前提,缺一不可:

  • 只有可执行的二进位制程序才能设定set uid权限;

  • 命令执行者对该程序拥有执行(execute)权限;

例如/etc/shadow 这个文件,用来保存用户信息,处于系统安全的考虑,这个文件读、写、执行的权限都没有;但是passwd命令拥有suid的特殊权限位,如下图所示,出现在x位置的那个s,即表示suid,这就好像尚方宝剑,赋予它临时修改密码配置文件,也就是更改密码的权限。

由上图可知,/etc/shadow 默认的权限为000rwx权限都没有的,也不能执行相应的操作。但 passwd赋予一个特殊权限,让我们在执行passwd命令时,临时拥有 root 权限,从而可以修改密码。

注意:

  1. 虽然常见的八位制权限掩码是三位数,但其实应该是四位数,第一位表示的特殊权限。set uid位采用八进制表示为4000

  2. passwd 是具有setuid的一个特殊命令。这样我们不需要是root用户,也可以对自己的密码进行修改。

  3. 设置set uid这个特殊权限很危险,不到万不得已,做好不要使用。

设置setuid的方法:
  • 方法一:
1
2
3
chmod 4755 [文件名]   // 设置set uid 

chmod 755 [文件名] // 取消 set uid
  • 方法二:
1
2
3
chmod u+s [文件名]   // 设置set uid 

chmod u-s [文件名] // 取消 set uid
set gid

set gid 就是将程序文件的 s 权限赋予组,当执行此程序时,此进程的属组不再是运行者本人所属的基本组,而是此程序文件的属组。

sgid 与suid相似,有一个重要特性,就是一旦对某个目录设置了sgid,该目录中创建的文件将继承该目录的所属组。

这就意味着如果我们要创建一个部门共享目录,可以早创建目录后,设置sgid权限,这样部门群组内的任何用户创建的文件都会属于该目录所属组。如此一来,该部门所有用户都能够顺利读取共享目录文件。

setgid位八进制表示为2000。

这里有两种情况:

  1. set gid 赋予文件:运行此文件的其它用户具有这个文件的属组特性;

  2. set gid 赋予目录:任何用户在该目录下创建的文件,则该文件属组都和目录的属组一致。

设置方法:
  • 方法一:
1
2
3
chmod 2755 [filename/dirname]   // 设置set gid 

chmod 755 [filename/dirname] // 取消set gid
  • 方法二:
1
2
3
chmod g+s [filename/dirname]   // 设置set gid 

chmod g-s [filename/dirname] // 取消 set gid
sticky bit (防删除位)

sticky bit(防删除位):用户是否能够删除文件,关键在于是否拥有文件所在目录的写权限, 有写权限就能够删除,否则就不能。

sticky位八进制表示为1000,添加sticky bit(防删除位)后,用户能够该目录下添加文件,但不能删除或者重命名文件。

例如,如果我们用root用户给共享目录设置sticky bit 权限,除非root用户,其他用户只能够添加文件,但不能删除或者重命名文件。

设置方法:
  • 方法一:
1
2
3
chmod 1755 [dirname]   // 设置sticky bit

chmod 755 [dirname] // 取消sticky bit
方法二:
1
2
3
chmod o+t [dirname]   // 设置sticky bit

chmod o-t [dirname] // 取消sticky bit

修改文件的隐藏权限

chatrr 命令

命令格式 chatrr [ +-= ] [ 参数 ] [文件或目录名]

常见参数用法

命令 含义
A 文件或目录的atime不可修改
a 只能追加不能删除,非root用户不能设定该属性
s 会将数据同步写入磁盘
c 自动压缩文件,读取时自动解压
i 不能删除、重命名、设定链接、编辑写入及新增数据

常用用法

a 用法
1
2
3
4
5
6
7
8
9
# touch a.txt
# ls
anaconda-ks.cfg a.txt
# chattr +a a.txt
# rm -rf a.txt
rm: cannot remove ‘a.txt’: Operation not permitted //不可删除
# echo 'this is a test' >> a.txt //只能追加内容
# cat a.txt
this is a test

注:删除a权限用 chattr -a a.txt

i 用法
1
2
3
4
5
6
7
8
9
10
 # touch b.txt
# ls
anaconda-ks.cfg b.txt
# chattr +i b.txt
# rm -rf b.txt //不可删除
rm: cannot remove ‘b.txt’: Operation not permitted
# echo 'this is a test' > b.txt //不可编辑写入
-bash: b.txt: Permission denied
# echo 'this is a test' >> b.txt //不可追加内容
-bash: b.txt: Permission denied

注:删除i权限 用chattr -i b.txt

lsattr 命令

lsattr 用来读取文件或目录的特殊权限,命令格式为 lsattr [ 参数 ] [文件或目录名]

参数 含义
a 类似于ls -a ,表示连同隐藏文件一起列出
R 连同子目录的信息一起列出

举个栗子

1
2
3
4
5
 # mkdir c1 
# lsattr c1 // c1是刚刚创建的一个空文件夹,因此里面没有文件,不会又显示
# lsattr -aR c1 //连同隐藏文件一起显示
---------------- c1/.
---------------- c1/..

链接文件

链接文件 ,即link file ,使用命令ls -l 查看文件信息,第一组属性首字母为l的文件,类似于 windows下的快捷方式。

链接文件link file 包括硬链接 hard link 和 软链接 symbolic link 两类。要搞清楚这两者的关系,需要先了解索引节点inode

索引节点inode

硬盘最小的文件单位位扇区“扇区” Sector,每个扇区储存512字节(相当于0.5KB);而linux系统文件存取的最小单位,叫做块 block,最常见的块 block是4KB,由连续八个扇区 sector组成一个块block

为了更方便的找到需要的文件,就需要有一个存储数据元信息的地方,比如文件的创建者、文件的创建日期、文件的大小等等。这种储存文件元信息的区域就叫做inode,中文译名为”索引节点”,作用就像目录索引一样。

Unix/Linux系统内部不使用文件名,而使用inode号码来识别文件。当我们打开文件时,系统大致将这个过程分为三步:

  1. 找到文件名对应的inode号码;

  2. 通过inode号码,获取inode信息;

  3. 根据inode信息,找到文件数据所在的块block,然后读出数据。

inode 查询

查看某个文件的inode信息,使用命令行:

1
stat [filename]

linux系统允许多个文件名指向同一个inode号,打个比方,每个人可以有不同的名字,大名、小名、别名、外号等等,但都只向
唯一的身份ID。因此,我们可以:

  • 通过不同的文件名访问文件;

  • 对文件内容进行修改,会影响到所有文件名;

  • 删除一个文件名,不影响另一个文件名的访问;

注意:新建一个空目录,默认会生成两个目录项:...,前者.等同于当前目录的”硬链接”,后者 ..等同于父目录的”硬链接”。所以,任何一个目录的”硬链接”总数,总是等于2加上它的子目录总数(含隐藏目录)。

硬链接的不足

硬链接虽然看起来很美好,但是有两个不能克服的缺点:

  1. 不能跨文件分区;每个分区在格式化之前就指定inode数据元信息存放区和文件数据存放区,inode和数据的对应关系就会在一个分区里面关联,所以不能够跨分区。

  2. 不能对目录做硬链接(原因不明);

基于上述两个先天不足,就有了软链接的用武之地。

ln 命令 创建硬链接
1
ln [源文件] [目标文件]

与硬链接不同,软链接是建立一个独立的文件。例如,文件A和文件B的inode号不一样,但A的内容是B的路径,相当于一个路标

这个路标是真实存在的独立文件,尽管它通常都很小。读取A时,系统会自动将访问者导向B,此时A就是B的软链接symbolic link

  • A依赖于B而存在,如果删除了B,打开文件A就会报错:No such file or directory

  • A指向B的文件名,而不是B的inode号码,因此B的inode链接数不会因此发生变化。

ln -s命令可以创建软链接
1
ln -s [源文文件或目录] [目标文件或目录]
-------------本文结束感谢您的阅读-------------
坚持原创技术分享,您的支持将鼓励我继续创作!