第一章: Linux文件与路径
1.1 文件结构
Centos没有盘符这个概念,只有一个根目录/,所有文件都在它下面
[root@localhost ~]# ls /
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
当我们输入ls / 可以查看更目录下的文件查看根目录下的系统文件
目录 | 说明 | 备注 |
---|---|---|
bin | 存放普通用户可执行的指令 | 即使在单用户模式下也能够执行处理 |
boot | 开机引导目录 | 包括Linux内核文件与开机所需要的文件 |
dev | 设备目录 | 所有的硬件设备及周边均放置在这个设备目录中 |
etc | 各种配置文件目录 | 大部分配置属性均存放在这里 |
lib/lib64 | 开机时常用的动态链接库 | bin及sbin指令也会调用对应的lib库 |
media | 可移除设备挂载目录 | 类似软盘 U盘 光盘等临时挂放目录 |
mnt | 用户临时挂载其他的文件系统 | 额外的设备可挂载在这里,相对临时而言 |
opt | 第三方软件安装目录 | 现在习惯性的放置在/usr/local中 |
proc | 虚拟文件系统 | 通常是内存中的映射,特别注意在误删除数据文件后,比如DB,只要系统不重启,还是有很大几率能将数据找回来 |
root | 系统管理员主目录 | 除root之外,其他用户均放置在/home目录下 |
run | 系统运行是所需文件 | 以前防止在/var/run中,后来拆分成独立的/run目录。重启后重新生成对应的目录数据 |
sbin | 只有root才能运行的管理指令 | 跟bin类似,但只属于root管理员 |
srv | 服务启动后需要访问的数据目录 | |
sys | 跟proc一样虚拟文件系统 | 记录核心系统硬件信息 |
tmp | 存放临时文件目录 | 所有用户对该目录均可读写 |
usr | 应用程序放置目录 | |
var | 存放系统执行过程经常改变的文件 |
在 Linux 系统中,有几个目录是比较重要的,平时需要注意不要误删除或者随意更改内部文件。
- /etc: 上边也提到了,这个是系统中的配置文件,如果你更改了该目录下的某个文件可能会导致系统不能启动。
- /bin, /sbin, /usr/bin, /usr/sbin: 这是系统预设的执行文件的放置目录,比如 ls 就是在/bin/ls 目录下的。
值得提出的是,/bin, /usr/bin 是给系统用户使用的指令(除root外的通用户),而/sbin, /usr/sbin 则是给root使用的指令。 - /var: 这是一个非常重要的目录,系统上跑了很多程序,那么每个程序都会有相应的日志产生,而这些日志就被记录到这个目录下(具体在/var/log 目录下),另外mail的预设放置也是在这里。
1.2 基本概念
1. 用户目录(工作目录/家目录): /home/user
使用~
回到root目录,使用/
回到根目录下
# 在home有一个user,这里就是之前创建的msb123用户
[root@localhost ~]# cd /home
[root@localhost home]# ls
msb123
[root@localhost msb123]# cd ~
[root@localhost ~]#
2. 登录信息:Linux的bash解析器终端用来显示主机名和当前用户的标识;
"""
root表示当前用户叫root(系统管理员账户)
localhost表示当前使用的主机名叫localhost(没有设置系统名字时,候默认名称是localhost)
/ 表示你当前所处的目录位置 (此时'/'表示当前在根目录下)
"""
[root@localhost /]#
3. 相对路径和绝对路径
- 绝对路径:从/目录开始描述的路径为绝对路径
- 相对路径:从当前位置开始描述的路径为相对路径
.
和..
:.
表示当前目录,..
表示上一级目录,即父目录。- pwd:确认当前目录
4. 文件权限
文件权限就是文件的访问控制权限,即哪些用户和组群可以访问文件以及可以执行什么样的操作。
Unix/Linux系统是一个典型的多用户系统,不同的用户处于不同的地位,对文件和目录有不同的访问权限。为了保护系统的安全性Unix/Linux系统除了对用户权限作了严格的界定外,还在用户身份认证、访问控制、传输安全、文件读写权限等方面作了周密的控制。
在 Unix/Linux中的每一个文件或目录都包含有访问权限,这些访问权限决定了谁能访问和如何访问这些文件和目录。
-
访问用户:用户分三种:文件拥有者(属主)、属主所在群组(属组)、其他用户
-
访问权限:文件或目录的访问程度,即读、写及执行权限:
- r:读取文件内容的权限,或浏览目录的权限。
- w:具有新增、修改文件内容的权限,或具有删除、移动目录内文件的权限。
- x: 具有执行文件的权限;用户具有进入目录的权限。
- -:无此权限
注意:通常,Unix/Linux系统只允许文件的属主(所有者)或超级用户,具有改变文件的读写权限。
[root@localhost /]# ls -l # 查看当前文件夹下详细信息
总用量 20
lrwxrwxrwx. 1 root root 7 8月 31 15:48 bin -> usr/bin
dr-xr-xr-x. 5 root root 4096 8月 31 15:58 boot
下面进行详细拆解:
l rwx rwx rwx
d r-x r-x r-x
"""
在Linux中第一个字符代表这个文件是目录、文件或链接文件等等。
[ d ] :目录
[ l ] :链接文档(link file)
[ - ] :普通文件
[ p ] :管道文件
[ b ] :装置文件里面的可供储存的接口设备(可随机存取装置)
[ c ] :装置文件里面的串行端口设备,例如键盘、鼠标(一次性读取装置)
其次接下来的字符中,给出属主、属组、其它这三种用户的权限组合,每种组合均为 [ rwx ] 的三个参数的组合,-表示无此权限
"""
5. 文件属主与属组
Linux系统按文件所有者、文件所有者同组用户和其他用户来规定了不同的文件访问权限。
[root@localhost /]# ls -l
总用量 20
...
dr-xr-xr-x. 5 root root 4096 8月 31 15:58 boot
...
[root@localhost /]# cd /home
[root@localhost home]# ls -l
总用量 0
drwx------. 2 msb123 msb123 83 9月 2 15:54 msb123
-
在以上实例中,msb123 文件是一个目录文件,属主和属组都为 msb123,
属主有可读、可写、可执行的权限;与属主同组的用户无权限读写执行;其他用户也无权限读写执行 -
对于 root 用户来说,一般情况下,文件的权限对其不起作用。
1.3 基本命令信息
1.3.1 查看linux 系统信息(修改主机名)
- hostname 显示主机名
-
hostname localhost
修改主机名为localhost,但这个只是瞬时修改,重启就没用了 -
hostnamectl --static set-hostname 主机名
可以永久修改主机名(相当于修改/etc/hostname ),重启生效。但同时还需要修改/etc/hosts (localhost后面添加刚刚修改的主机名ubantu2)。
-
WSL没有启用在 systemctl ,所以上一条命令会报错。直接使用vim 命令编辑
/etc/hostname
配置文件
-
- uname 显示系统及版本信息
- -a 显示系统及版本的所有信息
- -s 显示内核名称
- -n 显示网络节点名称(完整的计算机名称)
- -r 显示内核发行版本
- -v 显示内核版本信息
- -m 显示计算机类型
- -o 显示操作系统的类型
- –version 显示系统发行版本信息
- –help 系统命令的帮助信息和参数含义
root@localhost:/home/zhxscut# uname
Linux
root@localhost:/home/zhxscut# uname -a
Linux localhost 4.4.0-19041-Microsoft #1237-Microsoft Sat Sep 11 14:32:00 PST 2021 x86_64 x86_64 x86_64 GNU/Linux
root@localhost:/home/zhxscut# uname -s
Linux
root@localhost:/home/zhxscut# uname -n
localhost
root@localhost:/home/zhxscut# uname -r
4.4.0-19041-Microsoft
root@localhost:/home/zhxscut# uname -v
#1237-Microsoft Sat Sep 11 14:32:00 PST 2021
root@localhost:/home/zhxscut# uname -o
GNU/Linux
root@localhost:/home/zhxscut# uname --version
uname (GNU coreutils) 8.30
Copyright (C) 2018 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Written by David MacKenzie.
whoami 显示当前用户
who 当前系统所登陆的用户,以及所登录的控制台
w 当前系统所登陆的用户,以及所登录的控制台的详细信息
root@localhost:/home/zhxscut# w
00:28:40 up 10 min, 0 users, load average: 0.52, 0.58, 0.59
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
1.3.2 ls
- ls 命令:显示指定工作目录内容(列出目前工作目录所含之文件及子目录)。
- 语法:
ls [-alrtAFR](选项) [name...](参数)
- 参数:
-a
:显示所有文件及目录
ls内定将文件名或目录名称开头为"."的视为隐藏档,不会列出-l
除文件名称外,亦将文件型态、权限、拥有者、文件大小等资讯详细列出ll
、ls -la
、ll -a
、ls -l -a
:列出当前目录的全部文件和文件夹的基本属性和详细信息-r
: 将文件以相反次序显示(原定依英文字母次序)-t
:将文件依建立时间之先后次序列出-A
:同-a
,但不列出 “.” (目前目录) 及 “…” (父目录)-F
:在列出的文件名称后加一符号;例如可执行档则加 “*”, 目录则加 “/”-R
:递归列出所有子文件有文件-n
:以用户识别码和群组识别码替代其名称ls t*
:列出所有以t
开头的文件和目录
[root@localhost ~]# ls -a
. .. anaconda-ks.cfg .bash_history .bash_logout .bash_profile .bashrc .cshrc .tcshrc
[root@localhost ~]# ls -l
总用量 4
-rw-------. 1 root root 1437 8月 31 15:54 anaconda-ks.cfg
[root@localhost ~]# ls -ra
.tcshrc .cshrc .bashrc .bash_profile .bash_logout .bash_history anaconda-ks.cfg .
[root@localhost ~]# ls -lt
总用量 4
-rw-------. 1 root root 1437 8月 31 15:54 anaconda-ks.cfg
[root@localhost ~]# ls -A
anaconda-ks.cfg .bash_history .bash_logout .bash_profile .bashrc .cshrc .tcshrc
[root@localhost ~]# ls -F /home
msb123/
[root@localhost ~]# ls -R /home
/home:
msb123
/home/msb123
[root@localhost ~]# ls -n test.log
-rwxr-xr-x. 1 0 0 36 9月 8 18:36 test.log
常用组合
[1]查看文件详情:ls -l 或 ll
[2]增强对文件大小易读性,以人类可读的形式显示文件大小: ls -lh
[3]对文件或者目录进行从大到小的排序: ls -lhs
[4]查看当前目录下的所有文件或者目录,包括隐藏文件: ls -la
[5]只查看当前目录下的目录文件: ls -d .
[6]按照时间顺序查看,从上到倒下时间越来越近: ls -ltr
[7]查看文件在对应的inode信息:ls -li
1.3.3 cd/pwd
cd
命令:切换目录。
~
回到root目录,/
回到根目录,/home
回到家目录
# 这是ubantu系统的测试结果,用户名zhxscut
zhxscut@DESKTOP-OHLNREI:$ cd /home # 切换到家目录
zhxscut@DESKTOP-OHLNREI:/home$ ls
zhxscut
zhxscut@DESKTOP-OHLNREI:/home$ cd / # 切换到根目录
zhxscut@DESKTOP-OHLNREI:/$ ls
bin dev home lib lib64 lost+found mnt proc run snap sys usr
boot etc init lib32 libx32 media opt root sbin srv tmp var
zhxscut@DESKTOP-OHLNREI:/$ cd ~ # 切换到root目录,还是刚装的系统,所以root下啥也没有
zhxscut@DESKTOP-OHLNREI:~$ ls
zhxscut@DESKTOP-OHLNREI:~$
.
和..
:.
表示当前目录,..
表示上一级目录,即父目录。../..
:上两层目录,以此类推-
:跳到上次所在目录!$
:重复上次的切换参数pwd
:获取当前工作目录的绝对路径名称
# 把上个命令的最后参数作为dir
这里我们先将文件夹cd 到python2.7路径
[root@localhost /]# cd /usr/include/python2.7/
[root@localhost python2.7]#
# 这里使用cd ./..参数作为引子
[root@localhost python2.7]# cd ./..
# 这里我们使用命令,重复最后一个命令参数,直到回到了根目录
[root@localhost include]# cd !$
cd ./..
[root@localhost usr]# cd ./..
[root@localhost /]#
1.3.4 pushd命令创建目录栈
pushd
:创建目录栈
目录栈用于快速切换目录。比如现在在etc/sysconfig
目录下,想切换到var/lock
目录,可以输入 pushd /var/lock 就直接切换过去了,且创建了一个目录栈 :
/var/lock
/etc/sysconfig
此时直接输入pushd就可以在最顶端两个目录之间切换。目录栈顶端永远是当前目录。 每次 pushd 命令执行完成之后,默认都会执行一个 dirs 命令来显示目录栈的内容
dirs
:显示目录栈。- -p :每行显示一条记录
- -v :每行显示一条记录,同时展示该记录在栈中的index
- -c :清空目录栈
其中,-p
与 -v
选项的区别是,-v
选项将显示每条记录在栈中的索引,除此之外完全一样。此时输入pushd+n或者pushd-n可以快速任意切换目录栈,+表从上往下查找,-为从下往上查找。
0 /etc/rc0.d
1 /var/lock
2 /etc/sysconfig
3 /var/run
popd /目录名
:在目录栈中删除此目录。
第二章: 文件/目录的创建、删除、复制、阅读
ctrl+g | 移动到底部 |
---|---|
Tab | 命令行自动补全 |
[向上] 和 [向下] 箭头 | 显示命令历史 |
Ctrl L或者clear | 清屏,等于光标移动到顶部 |
exit | 注销当前用户 |
history n | 查看n个历史命令 |
2.1 mkdir
mkdir
-
**作用:**命令用来 创建指定的名称的目录 ,要求创建目录的用户在当前目录中具有写权限,并且指定的目录名不能是当前目录中已有的目录
-
语法:mkdir [选项] 目录
-
**命令功能:**通过 mkdir 命令可以实现在指定位置创建以 DirName(指定的文件名)命名的文件夹或目录。要创建文件夹或目录的用户必须对所创建的文件夹的父文件夹具有写权限。并且不能与其它文件名重名(区分大小写)
-
命令参数:
选项参数 | 完整参数 | 功能描述 |
---|---|---|
-m | –mode=模式 | 设定权限<模式> (类似 chmod),而不是 rwxrwxrwx 减 umask |
-p | –parents | 可以是一个路径名称。如不存在直接创建 一次可以建立多个子父目录;(如果不输入-p由于父目录也不存在将报错) |
-v | –verbose –help –version |
–verbose 每次创建新目录都显示信息 –help显示此帮助信息并退出 –version输出版本信息并退出 |
示例如下:
# 使用参数 -p 进行递归创建目录
[root@localhost mydir]# mkdir -p text1/text2
"""
ls -R查看当前目录的所有子目录(包括子目录的子目录)
比如在root家目录下创建 mkdir -p x/y/(后一个/可以不写),此时输入ls只能看到x目录,输入ls -R看到x/y
"""
[root@192 ~]# ls -R
.:
anaconda-ks.cfg x
./x:
y
./x/y:
# 分别创建三个目录,并设置权限 使用参数 -m
[root@localhost text2]# mkdir -m 777 exercise1
[root@localhost text2]# mkdir -m 765 exercise2
[root@localhost text2]# mkdir -m 654 exercise3
[root@localhost text2]# ll
总用量 0
drwxrwxrwx. 2 root root 6 9月 7 13:22 exercise1
drwxrw-r-x. 2 root root 6 9月 7 13:23 exercise2
drw-r-xr--. 2 root root 6 9月 7 13:23 exercise3
总结:# 使用参数 -m 可以创建文件并设置文件的权限
注意(777,765,654 其中每一个数字,分别表示User、Group、及Other的权限。r=4,w=2,x=1)
# 创建一个目录,并设置权限 使用参数 -v -m
[root@localhost text2]# mkdir -v -m 654 exercise4
mkdir: 已创建目录 "exercise4"
2.2 touch/stat 命令
1. stat
stat filename
:查看文件具体信息(三种时间属性和大小类型等)
文件:"zhang.txt"
大小:0 块:0 IO 块:4096 普通空文件
设备:fd00h/64768d Inode:67227145 硬链接:1
权限:(0644/-rw-r--r--) Uid:( 0/ root) Gid:( 0/ root)
环境:unconfined_u:object_r:user_home_t:s0
最近访问:2021-05-22 17:46:21.314187982 +0800 打开文件才叫文件的访问
最近更改:2021-05-22 17:46:21.314187982 +0800 更改是修改文件内容
最近改动:2021-05-22 17:46:21.314187982 +0800 改动是修改文件其它属性,例如文件名
创建时间:-
当只是修改文件名时前两个时间属性不变,只有最后一个变化。
2 touch
-
作用:用于 修改文件或者目录的时间属性 ,包括存取时间和更改时间。若文件不存在,系统会建立一个新的文件。已有的文件touch会改动三个时间属性。
-
语法:touch [-acfm] [-d<日期时间>] [-r<参考文件或目录>] [-t<日期时间>] [–help] [–version] [文件或目录…]
-
命令参数:
参数 | 参数描述 |
---|---|
-a | 只更新访问时间,不改变修改时间(第1.3个时间) |
-c | 不创建不存在的文件 |
-f | 不使用,是为了与其他 unix 系统的相容性而保留。 |
-m | 只更新修改时间,不改变访问时间(改动第2.3个时间) |
-r file newfile | 将文件file的1.2时间更新为文件newfile的时间 |
-t | 将1.2时间修改为参数指定的日期,如:07081556代表7月8号15点56分 |
–no-create | 不会建立文件 |
–help | 列出指令格式 |
–version | 列出版本讯息 |
ls -l 可以显示档案的时间记录。
- 示例
- 使用指令
touch
创建"text1.txt"文件
[root@localhost exercise1]# touch text1.txt text2.txt text3.txt
[root@localhost exercise1]# ls -l
总用量 0
-rw-r--r--. 1 root root 0 9月 7 13:44 text1.txt
-rw-r--r--. 1 root root 0 9月 7 13:45 text2.txt
-rw-r--r--. 1 root root 0 9月 7 13:45 text3.txt
- 使用指令
touch
修改文件"text1.txt"的时间属性为当前系统时间,发现如果文件存在,这里直接是修改时间了
[root@localhost exercise1]# touch text1.txt
[root@localhost exercise1]# ls -l
总用量 0
-rw-r--r--. 1 root root 0 9月 7 13:46 text1.txt
# 发现时间是已经修改了(三个时间都被修改)
-
使用参数
-c
,强制避免创建新文件
有时,如果新文件不存在,则需要避免创建新文件。 在这种情况下,可以使用touch命令使用’-c’选项 -
使用参数
-a
,更改文件的访问和改动时间 (第1.3个)
[root@localhost exercise1]# stat text3.txt
最近访问:2020-09-07 14:04:07.539848285 +0800
最近更改:2020-09-07 14:04:07.539848285 +0800
最近改动:2020-09-07 14:04:07.539848285 +0800
创建时间:-
[root@localhost exercise1]# touch -a text3.txt
[root@localhost exercise1]# stat text3.txt
最近访问:2020-09-07 14:08:33.788865586 +0800
最近更改:2020-09-07 14:04:07.539848285 +0800
最近改动:2020-09-07 14:08:33.788865586 +0800
创建时间:-
我们看到先是使用stat查看文件详细信息 最近访问和最近更改时间
当我们使用命令使用参数-a 对文件 text3.txt 做了一些操作 touch -a text3.txt
再查看时间时,发现文件已经修改好了
- 使用参数
-m
,仅更改此文件的修改时间 (第2.3个时间)
[root@localhost exercise1]# touch -m text3.txt
[root@localhost exercise1]# stat text3.txt
最近访问:2020-09-07 14:08:33.788865586 +0800
最近更改:2020-09-07 14:15:59.782894567 +0800
最近改动:2020-09-07 14:15:59.782894567 +0800
创建时间:-
- 使用参数
-r
,将访问和修改时间从一个文件复制到另一个文件
[root@localhost exercise1]# touch text3.txt -r text1.txt
[root@localhost exercise1]# stat text1.txt
[root@localhost exercise1]# stat text3.txt
# 输出显示text3.txt现在具有与text1.txt相同的访问和更改值
- 参数
-t
,使用指定的时间戳创建新文件
[root@localhost exercise1]# touch -t 2001011314.52 time.log
[root@localhost exercise1]# stat time.log
文件:"time.log"
大小:0 块:0 IO 块:4096 普通空文件
设备:fd00h/64768d Inode:16627 硬链接:1
权限:(0644/-rw-r--r--) Uid:( 0/ root) Gid:( 0/ root)
环境:unconfined_u:object_r:admin_home_t:s0
最近访问:2020-01-01 13:14:52.000000000 +0800
最近更改:2020-01-01 13:14:52.000000000 +0800
最近改动:2020-09-07 14:26:23.916935124 +0800
创建时间:-
# 最近访问与最近更改时间为设定的时间 2020-01-01 13:14:52.000000000
- 使用参数
-c -t
,修改文件的时间戳
[root@localhost exercise1]# touch -c -t 1801011314.52 time.log
[root@localhost exercise1]# stat time.log
文件:"time.log"
大小:0 块:0 IO 块:4096 普通空文件
设备:fd00h/64768d Inode:16627 硬链接:1
权限:(0644/-rw-r--r--) Uid:( 0/ root) Gid:( 0/ root)
环境:unconfined_u:object_r:admin_home_t:s0
最近访问:2018-01-01 13:14:52.000000000 +0800
最近更改:2018-01-01 13:14:52.000000000 +0800
最近改动:2020-09-07 14:30:45.188952101 +0800
创建时间:-
# 使用参数修改为指定的时间戳
2.3 rm &rmdir
- 作用:用于删除一个文件或者目录。
- 命令参数:
参数 | 参数描述 |
---|---|
-i | 删除前逐一询问确认(要习惯用-i模式还可以反悔) |
-f | 删除时无需确认 |
-r | 将目录及以下之档案亦逐一删除 (递归删除)-ri递归删除并确认 |
rm -f file1 file2 file3
:不用确认同时删除多个文件rm /tmp/file1
:删除指定目录/tmp下的文件 file1rm fi*
:删除以fi 开头的文件rmdir
:删除空目录,删除时必须具有对其父目录的写权限。不能删除非空目录(有空子目录也不行)rmdir -p mydir/text1/text2/
:递归删除空目录(只写子目录或父目录都是错的)。
工作目录下的 text1 目录中,删除名为 text2 的子目录。若 text2 删除后,text1 目录成为空目录,则 text1 亦予删除,以此类推rm -r dir
:递归的方式删除非空目录dirrm -rf dir
: 不用确认直接删除非空目录dir
2.5 mv
- 作用: 用来为文件或目录改名、或将文件或目录移入其它位置。
- 命令参数:
参数 | 参数描述 |
---|---|
-i | 询问是否覆盖同名文件; |
-f | 覆盖同名文件不提示 |
mv /home/file /tmp
:移动/home目录下的file文件到/tmp 目录下,也可移动多个文件mv /home/file /tmp/file2
:移动/home/file文件到/tmp 目录下并改名为file2mv file dirname1 dirname2 /tmp
:移动目录和文件到/tmp下mv file3 file4
:将file3 改名为file4mv dir10 dir11
:目录dir10 改名为dir11mv -i text2.txt text1.txt
:改名前询问如果重名是否覆盖mv * ../
: 移动当前文件夹下的所有文件到上一级目录(*代表当前目录所有文件,也可写作./ *) |
2.6 cp
cp /tmp/file2 /home
:复制/tmp/file2文件到/home 目录下cp /home/file2 /tmp/file3
:复制/home/file2到/tmp 目录下并改名为file3cp -p file3 /home
:复制file3到/home 目录下并复制文件属性cp -r /dir5 /tmp
:复制/dir5目录下所有内容到/tmp 下cp -ai mydir/text1.txt mydir/test1
:复制 text1.txt 到 test1 目录下,保持原文件时间,如果原文件存在提示是否覆盖。
- **作用:**用于复制文件或目录。
- 语法:
cp [options] source dest 将source文件复制并改名为dest
cp [options] source... directory 将source文件复制到目录directory
- 命令参数:
参数 | 参数功能描述 |
---|---|
-a | 此选项通常在复制目录时使用,它保留链接、文件属性,并复制目录下的所有内容。其作用等于dpR参数组合 |
-d | 复制时保留链接。这里所说的链接相当于Windows系统中的快捷方式。 |
-f | 覆盖已经存在的目标文件而不给出提示。 |
-i | 重名时提示是否覆盖目标文件 |
-p | 除复制文件内容及属性,比如修改时间和访问权限。 |
-r | 复制目录下所有的子目录和文件。 |
-RT | 复制该目录下所有的子目录和文件,同时不复制原始目录 |
-s | 为文件生成快捷方式 (上链接) |
# 常用的一些有以下参数
-i 提示
-r 复制目录及目录内所有项目
-a 复制的文件与原文件时间一样
2.7 cat
cat /etc/passwd
:显示整个文档内容cat /etc/passwd |more
:分屏查看文件内容,按空格键往下翻页,“q”退出cat /etc/passwd |less
:分屏查看文件内容,可以pagedown/pageup上下翻页,“q”退出cat text1.txt > text2.log
:复制text1.txt 的内容到 text2.logcat -n text1.txt > text2.log
:复制text1.txt 的内容到 text2.log ,并加上行号cat -b text1.txt text2.log >> text3.txt
:把 text1.txt 和 text2.txt 的文档内容加上行号(空白行不加),之后将内容附加到 text3.txt 文档里cat /dev/null > text1.txt
:清空 /mydir/text1.txt 文档内容
- 作用:用于连接文件(只能是txt和log、docx,压缩文件不行)并打印到标准输出设备上
- 语法:
cat [-AbeEnstTuv] [--help] [--version] fileName
- 命令参数:
-n | –number 用的最多 | 由 1 开始对所有输出行编号,输出到控制台,相当于查看文件内容 |
-b | –number-nonblank | 和 -n 相似,只不过对于空白行不编号 |
-s | –squeeze-blank | 当遇到有连续两行以上的空白行,就代换为一行的空白行 |
-v | –show-nonprinting | 使用 ^ 和 M- 符号,除了 LFD 和 TAB 之外 |
-E | –show-ends | 在每行结束处显示 $ |
-T | –show-tabs | 将 TAB 字符显示为 ^I |
-A | –show-all | 等价于 -vET |
-e | 等价于"-vE"选项 | |
-t | 等价于"-vT"选项 |
- cat :显示整个文件内容
[root@localhost ~]# cat mydir/text1.txt
# 编辑文本,使用vi打开文本
# 按i键进入编辑界面
# 输入对应的内容后
# 按ESC退出编辑模式
# 按住shift+;进入命令行界面
# 输入wq回车接口保存退出
- 复制text1.txt 的内容到 text2.log ,并加上行号
[root@localhost mydir]# cat -n text1.txt > text2.log
[root@localhost mydir]# cat text2.log
1 # 编辑文本,使用vi打开文本
2 # 按i键进入编辑界面
3 # 输入对应的内容后
4 # 按ESC退出编辑模式
5 # 按住shift+;进入命令行界面
6 # 输入wq回车接口保存退出
- 把 text1.txt 和 text2.txt 的文档内容加上行号(空白行不加),之后将内容附加到 text3.txt 文档里
[root@localhost mydir]# cat -b text1.txt text2.log >> text3.txt
[root@localhost mydir]# cat text3.txt
1 # 编辑文本,使用vi打开文本
2 # 按i键进入编辑界面
3 # 输入对应的内容后
4 # 按ESC退出编辑模式
5 # 按住shift+;进入命令行界面
6 # 输入wq回车接口保存退出
7 1 # 编辑文本,使用vi打开文本
8 2 # 按i键进入编辑界面
9 3 # 输入对应的内容后
10 4 # 按ESC退出编辑模式
11 5 # 按住shift+;进入命令行界面
12 6 # 输入wq回车接口保存退出
- 清空 /mydir/text1.txt 文档内容
[root@localhost mydir]# cat /dev/null > text1.txt
[root@localhost mydir]# cat text1.txt
[root@localhost mydir]# ls
test1 test2 text1.txt text2.log text3.txt
2.8 more
- 作用:类似
cat
,但会逐页显示,方便阅读
按空白键(space)往下翻页,按 b 键就会往往上翻页。而且还有搜寻字串的功能(与 vi 相似),使用中的说明文件,请按 h 。阅读到任何一页想退出按Q键(不用大写) - 语法:
more [-dlfpcsu] [-num] [+/pattern] [+linenum] [fileNames..]
- 命令参数:
参数 | 参数功能描述 |
---|---|
-num | 一次显示的行数 |
-d | 提示使用者,在画面下方显示 [Press space to continue, ‘q’ to quit.] , 如果使用者按错键,则会显示 [Press ‘h’ for instructions.] 而不是 ‘哔’ 声 |
-l | 取消遇见特殊字元 ^L(送纸字元)时会暂停的功能 |
-f | 计算行数时,以实际上的行数,而非自动换行过后的行数(有些单行字数太长的会被扩展为两行或两行以上) |
-p | 不以卷动的方式显示每一页,而是先清除萤幕后再显示内容 |
-c | 跟 -p 相似,不同的是先显示内容再清除其他旧资料 |
-s | 当遇到有连续两行以上的空白行,就代换为一行的空白行 |
-u | 不显示下引号 (根据环境变数 TERM 指定的 terminal 而有所不同) |
+/pattern | 在每个文档显示前搜寻该字串(pattern),然后从该字串之后开始显示 |
+num | 从第 num 行开始显示 |
fileNames | 需要显示内容的文档,可为复数个数 |
常用的操作命令
按键 | 按键功能描述 |
---|---|
Enter | 向下 n 行,需要定义。默认为 向下1 行,即一行行阅读 |
Ctrl+F | 向下滚动一屏 |
空格键 | 向下滚动一页,即一页页阅读 |
Ctrl+B | 返回上一页 |
= | 输出当前行行号 |
:f | 输出文件名和当前行的行号 |
V | 调用vi编辑器 |
!命令 | 调用Shell,并执行命令 |
q | 退出more |
- 显示文件中从第3行起的内容
[root@localhost mydir]# more +3 text3.txt
3 # 输入对应的内容后
4 # 按ESC退出编辑模式
5 # 按住shift+;进入命令行界面
6 # 输入wq回车接口保存退出
7 1 # 编辑文本,使用vi打开文本
8 2 # 按i键进入编辑界面
9 3 # 输入对应的内容后
10 4 # 按ESC退出编辑模式
11 5 # 按住shift+;进入命令行界面
12 6 # 输入wq回车接口保存退出
- 在所列出文件目录详细信息,借助管道使每次显示 5 行
[root@localhost mydir]# ls -l / | more -5
总用量 20
lrwxrwxrwx. 1 root root 7 8月 31 15:48 bin -> usr/bin
dr-xr-xr-x. 5 root root 4096 8月 31 15:58 boot
drwxr-xr-x. 20 root root 3240 9月 5 13:07 dev
drwxr-xr-x. 75 root root 8192 9月 7 10:30 etc
--More--
# 空格会显示下5行
# 回车会显示下1行
2.9 less 命令
-
作用:与
more
类似,但可以随意浏览文件,而 more 仅能向前移动,却不能向后移动,而且 less 在查看之前不会加载整个文件。 -
语法:less [参数] 文件
-
命令参数:
参数 | 参数功能描述 |
---|---|
-i | 忽略搜索时的大小写 |
-N | 显示每行的行号 |
-o | <文件名> 将less 输出的内容在指定文件中保存起来 |
-s | 显示连续空行为一行 |
/字符串: | 向下搜索“字符串”的功能 |
?字符串: | 向上搜索“字符串”的功能 |
n | 重复前一个搜索(与 / 或 ? 有关) |
N | 反向重复前一个搜索(与 / 或 ? 有关) |
-x <数字> | 将“tab”键显示为规定的数字空格 |
b | 向前翻一页 |
d | 向后翻半页 |
h | 显示帮助界面 |
Q | 退出less 命令 |
空格键 | 滚动一页,和more一样 |
回车键 | 滚动一行,和more一样 |
[pagedown] | 向下翻动一页 |
[pageup] | 向上翻动一页 |
- 查看文件
[root@localhost mydir]# less text3.txt
1 # 编辑文本,使用vi打开文本
2 # 按i键进入编辑界面
...省略...
# 进入后查看,Q键退出界面
- ps查看进程信息并通过less分页显示(ps.aux|less)(shift+\打出|)
[root@localhost mydir]# less text3.txt
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 05:06 ? 00:00:02 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root 2 0 0 05:06 ? 00:00:00 [kthreadd]
...省略...
3. 查看命令历史使用记录并通过less分页显示
[root@localhost test]# history(历史命令) | less
1 exit
2 reboot
3 shutdowm -r now
4 poweroff
5 cd
...省略...
- 查看多个文件(这个麻烦基本不用,直接再开一个标签来看两个屏幕)
查看多屏直接选项卡右键复制就行。
[root@localhost mydir]# less text3.txt
# 此时如果需要查看多个文件可以使用 可以输入shift+;进入命令行模式
# 使用 p 和 n 进行上下页面翻页查看
附加备注
1.全屏导航
ctrl + F - 向前移动一屏
ctrl + B - 向后移动一屏
ctrl + D - 向前移动半屏
ctrl + U - 向后移动半屏
2.单行导航
j - 向前移动一行
k - 向后移动一行
3.其它导航
G - 移动到最后一行
g - 移动到第一行
q / ZZ - 退出 less 命令
4.其它有用的命令
v - 使用配置的编辑器编辑当前文件
h - 显示 less 的帮助文档
&pattern - 仅显示匹配模式的行,而不是整个文件
5.标记导航
当使用 less 查看大文件时,可以在任何一个位置作标记,可以通过命令导航到标有特定标记的文本位置:
ma - 使用 a 标记文本的当前位置
'a - 导航到标记 a 处
Linux 命令大全 Linux 命令大全
2.10 head /tail(查看文件开头/结尾)
- 作用:用于查看文件的开头部分的内容,有一个常用的参数 -n 用于显示行数,默认为 10行,即显示 10 行的内容。 如果一个文件太大,我们只需要看开头就用head
- 语法:
head [参数] [文件]
- 命令参数:
参数 | 参数描述 |
---|---|
-q | 隐藏文件名 |
-v | 显示文件名 |
-c<数目> | 显示的字节数 |
-n<行数> | 显示的行数 |
显示 t.log最后 10 行
[root@localhost ~]# tail -n t.log 查看t.log后n行
[root@localhost ~]# tail -f t.log 查看t.log末尾并不断显示
当一个文件不停写入更新时使用tail -f可以一直查看文件末尾,不停更新。要退出按ctrl+c
第三章: 查找、权限、进程
3.1 which 命令(查找可执行文件)
在 linux 要查找某个命令或者文件,但不知道放在哪里了,可以使用下面的一些命令来搜索
which 查看可执行文件的位置(PATH里的文件)。
whereis 查看文件的位置。
locate 配合数据库查看文件位置。
find 实际搜寻硬盘查询文件名称。
- 作用:用于查找文件( which指令会在环境变量$PATH设置的目录里查找符合条件的文件 。)
- 语法:which [文件…]
- 命令参数:
参数 | 参数描述 |
---|---|
-n<文件名长度> | 指定文件名长度,指定的长度必须大于或等于所有文件中最长的文件名 |
-p<文件名长度> | 与-n参数相同,但此处的<文件名长度>包括了文件的路径 |
-w | 指定输出时栏位的宽度 |
-V | 显示版本信息 |
- 查看 几个命令是否存在(任何一个命令都有一个exe文件,放在PATH下)
[root@localhost ~]# which ls 查看ls命令的执行文件在哪里
alias ls='ls --color=auto'
/usr/bin/ls
[root@localhost ~]# which cd
(注意:显示不存在,因为 cd 是内建命令,而 which 查找显示是 PATH 中的命令)
- 查看当前 PATH 配置
# linux中引用环境变量使用$,PATH大写。echo是xshell语言中的打印函数
[root@localhost ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
3.2 whereis(查找命令)
- whereis :只能用于程序名的搜索,而且只搜索二进制文件(可执行文件,参数
-b
)、man说明文件(帮助手册,参数-m
)和源代码文件(参数-s
)。如果省略参数,则返回所有信息。- where is 及 locate :都基于系统内建的数据库进行搜索,因此效率很高,
- find:遍历硬盘查找文件
- 作用:用于查找文件
- 语法:whereis [-bfmsu][-B <目录>…]-M <目录>…][-S <目录>…][文件…]
- 命令参数:
参数 | 参数描述 |
---|---|
-b | 定位可执行文件 |
-B<目录> | 只在设置的目录下查找可执行文件 |
-f | 不显示文件名前的路径名称 |
-m | 定位帮助文件 |
-M<目录> | 只在设置的目录下查找说帮助文件 |
-s | 定位源代码文件 |
-S<目录> | 只在设置的目录下查找源代码文件 |
-u | 搜索默认路径下除可执行文件、源代码文件、帮助文件以外的其它文件 |
查找ls程序相关文件、源码文件、帮助文件
[root@localhost ~]# whereis ls
ls: /usr/bin/ls /usr/share/man/man1/ls.1.gz
[root@localhost ~]# whereis -s ls
[root@localhost ~]# whereis -m ls
ls: /usr/share/man/man1/ls.1.gz
3.3 locate(数据库查找)
locate可以查看所有类型文件,不指定目录时默认查找所有目录里的文件(可以只给出关键词,也可加文件类型),需要注意这个命令在我们的最小mini系统里面是没有安装的。
[root@localhost ~]# yum install mlocate
...省略...
[root@localhost ~]# updatedb(更新数据库以便在里面查找,没更新之前无法用locate查找数据库)
- 作用:用于查找符合条件的文档,他会去保存文档和目录名称的数据库内,查找合乎范本样式条件的文档或目录(将linux所有文件建立索引数据库,在里面查找)
- 语法:locate [-d ][–help][–version][范本样式…]
- 命令参数:
参数 | 参数描述 |
---|---|
-b | 仅匹配路径名的基本名称 |
-c | 只输出找到的数量 |
-d | 使用 DBPATH 指定的数据库,而不是默认数据库 /var/lib/mlocate/mlocate.db |
-e | 仅打印当前现有文件的条目 |
-1 | 如果 是 1.则启动安全模式。在安全模式下,使用者不会看到权限无法看到 的档案。 这会始速度减慢,因为 locate 必须至实际的档案系统中取得档案的 权限资料 |
-0 | 在输出上带有NUL的单独条目 |
-S | 不搜索条目,打印有关每个数据库的统计信息 |
-q | 安静模式,不会显示任何错误讯息 |
-P | 检查文件存在时不要遵循尾随的符号链接 |
-l | 将输出(或计数)限制为LIMIT个条目 |
-n | 至多显示 n个输出 |
-m | 被忽略,为了向后兼容 |
-r | REGEXP – 使用基本正则表达式 |
–regex | 使用扩展正则表达式 |
-o | 指定资料库存的名称 |
-h | 显示帮助 |
-i | 忽略大小写 |
-V | 显示版本信息 |
常用参数:
参数 | 参数描述 |
---|---|
-l | num(要显示的行数) |
-f | 将特定的档案系统排除在外,如将proc排除在外 |
-r | 使用正则运算式做为寻找条件 |
- 查找和 pwd 相关的所有文件(文件名中包含 pwd)
[root@localhost ~]# locate pwd
/etc/.pwd.lock
/usr/bin/pwd
...省略...
- 搜索 etc 目录下所有以 sh 开头的文件
[root@localhost ~]# locate /etc/sh
/etc/shadow
/etc/shadow-
/etc/shells
- 查找 /root 目录下,以 sh 结尾的文件
[root@localhost ~]# locate -r '^/root.*sh$'
/root/test.sh
3.4 find(磁盘查找)
find /etc/pass*
:在/etc目录中查找以 pass开头的文件find /etc/pass* -print
:在/etc目录中查找以 pass开头的文件,并显示出来
- 作用:用于在文件树中查找文件,并作出相应的处理
- 语法:
find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]
- 命令参数:
参数 | 参数描述 |
---|---|
pathname | find命令所查找的目录路径。例如用.来表示当前目录,用/来表示系统根目录 |
find命令将匹配的文件输出到标准输出 | |
-exec | 对find命令找出的文件执行exec后面的shell命令。{ }表前面查找的文件名以 ;结束,注意{ }和\;之间的空格如find ./ -name ‘*.txt’ -exec cp {} ./x/ ; |
-ok | 和-exec的作用相同,只不过以一种更为安全的模式来执行该参数所给出的shell命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行 |
命令选项:
选项 | 选项描述 |
---|---|
-name | 按照文件名查找文件,find ./ -name '*.txt’表示当前目录下查找所有log文件(三空格) |
biaos-perm | 按文件权限查找文件 |
-user | 按文件属主查找文件 |
-group | 按照文件所属的组来查找文件 |
-type | 查找某一类型的文件,诸如: b - 块设备文件 d - 目录 c - 字符设备文件 l - 符号链接文件 p - 管道文件 f - 普通文件(前有空格) |
-size +nc | 查找文件长度为n字节大小的文件 |
-amin -n | 查找系统中最后N分钟访问的文件 |
-atime -n | 查找系统中最后n*24小时访问的文件 |
-cmin n | 查找系统中最后N分钟被改变文件状态的文件 |
-ctime n | 查找系统中最后n*24小时被改变文件状态的文件 |
-mmin n | 查找系统中最后N分钟被改变文件数据的文件 |
-mtime n | 查找系统中最后n*24小时被改变文件数据的文件 |
-maxdepth n | 最大查找目录深度 |
-prune | 选项来指出需要忽略的目录。在使用-prune选项时要当心, 因为如果你同时使用了-depth选项,那么-prune选项就会被find命令忽略 |
-newer | 如果希望查找更改时间比某个文件新但比另一个文件旧的所有文件,可以使用-newer选项 |
- 查找 48 小时内修改过的文件
[root@localhost ~]# find -atime -2
.
./.bash_profile
...省略...
- 在当前目录查找 以 .log 结尾的文件
[root@localhost ~]# find ./ -name '*.log' 如果不接任何参数表示只在当前目录查找
./mydir/text2.log
./test.log
- 查找 /opt 目录下 权限为 777 的文件
[root@localhost ~]# find /opt -perm 777
- 查找大于 1K 的文件
[root@localhost ~]# find -size +1000c
./anaconda-ks.cfg
./.bash_history
./.viminfo
- 查找等于 1000 字符的文件
[root@localhost ~]# find -size 1000c
- 在当前目录中查找更改时间在10日以前的文件,并删除它们(无提醒)
[root@localhost ~]# find . -type f -mtime +10 -exec rm -f {} \;
# 可以不用操作,了解一下结构即可
- 当前目录中查找所有文件名以.log结尾、更改时间在0日以上的文件,并删除它们(提示)
[root@localhost ~]# find . -name '*.log' -mtime +0 -ok -exec rm {} \;
< -exec ... ./mydir/text2.log > ? n
- 用
exec
选项执行 cp 命令
注意:-exec
参数后面跟的是 command 命令,它的终止是以;
为结束标志的,所以这句命令后面的分号是不可缺少的,考虑到各个系统中分号会有不同的意义,所以前面加反斜杠。{} 花括号代表前面find查找出来的文件名
[root@localhost ~]# find . -name '*.log' -exec cp {} test3 \;
- -xargs find
-xargs find
命令把匹配到的文件传递给 xargs 命令,而 xargs 命令每次只获取一部分文件而不是全部,不像 -exec 选项那样。这样它可以先处理最先获取的一部分文件,然后是下一批,并如此继续下去。
查找当前目录下每个普通文件,然后使用 xargs 来判断文件类型
[root@localhost ~]# find . -type f -print | xargs file
- 查找当前目录下所有以 js 结尾的并且其中包含 ‘editor’ 字符的普通文件
[root@localhost ~]# find . -type f -name "*.js" -exec grep -lF 'ueditor' {} \;
[root@localhost ~]# find -type f -name '*.js' | xargs grep -lF 'editor'
- 利用 xargs 执行 mv 命令
[root@localhost ~]# find . -name "*.log" | xargs -i mv {} test4
- 用 grep 命令在当前目录下的所有普通文件中搜索 hostnames 这个词,并标出所在行:
[root@localhost ~]# find . -name \*(转义) -type f -print | xargs grep -n 'hostnames'
- 查找当前目录中以一个小写字母开头,最后是 4 到 9 加上 .log 结束的文件:
[root@localhost ~]# find . -name '[a-z]*[4-9].log' -print
- 在 test 目录查找不在 test4 子目录查找
[root@localhost ~]# find test -path 'test/test4' -prune -o -print
- 实例1:查找更改时间比文件 log2012.log新但比文件 log2017.log 旧的文件
[root@localhost ~]# find -newer log2012.log ! -newer log2017.log
- depth
depth 选项可以使 find 命令向磁带上备份文件系统时,希望首先备份所有的文件,其次再备份子目录中的文件。
实例:find 命令从文件系统的根目录开始,查找一个名为 CON.FILE 的文件。 它将首先匹配所有的文件然后再进入子目录中查找
```bash
[root@localhost ~]# find / -name "CON.FILE" -depth -print
3.5 chmod(修改权限)
Linux/Unix 的文件调用权限分为三组 :文件拥有者(属主)、属主所在群组(属组)、其他用户;每组权限用rwx三位表示,分别为文件的读、写和执行权限(详细见本文1.2 章节基本概念):
- 权限代号:
- r :读权限, 数值表示4
- w :写权限 ,数值表示2
- x :执行权限 ,数值表示1
- +/-:增加/删除权限
- 用户代号;
- u :属主,前三位
- g: 属组 ,中间三位
- o :其他用户, 后三位
- a:所有用户
这些权限可以使用chmod
进行修改。其用法有两种:
- 包含字母和操作符表达式的文字设定法
chmod?? 属主(或属组或其他人或所有的)=(或者+或者-)权限 文件名/目录名
chmod u=r file1 # 给文件的属组赋予读取权限
chmod u=wx file1 # 给文件的属组赋予写和执行权限
chmod g+rw file1 # 给文件的属组增加读写权限
chmod g-rw file1 # 给文件的属组去掉读写权限
chmod o=rw file1 # 给文件的其他用户的权限改为读写
chmod a+rwx file1 # 给所有用户增加读写和执行权限
- 包含数字的数字设定法,这种更快捷
1 代表执行,2 代表写,3 代表 1+2,4 代表读,5代表 1+4,6代表2+4,7 代表1+2+4
chmod 766 dir1 #将目录dir1 的权限更改为rwx rw rw
chmod 777 file1 #将文件file1 的权限更改为 rwx rwx rwx
chmod -a 777 test.log # 增加文件 t.log 所有用户可执行权限
语法:chmod [-cfvR] [--help] [--version] mode file
…
常用参数:
参数 | 参数描述 |
---|---|
-c | 当发生改变时,报告处理信息 |
-R | 处理指定目录以及其子目录下所有文件 |
将mydir 目录及其子目录所有文件添加可读权限
[root@localhost ~]# chmod u+r,g+r,o+r -R text/ -c
3.6 chown(改文件属主)
chown u1 dir1
:将dir1 目录的属主改为u1chown u2.g1 dir1
:将dir1 目录的属主改为u2,属组改为 g1
- 作用:: 将指定文件的拥有者改为指定的用户或组,其中用户可以是用户名或者用户 ID;组可以是组名或者组 ID;文件是以空格分开、要改变权限的文件列表(支持通配符)
注意:一般来说,这个指令只有是由系统管理者(root)所使用,一般使用者没有权限可以改变别人的文件拥有者,也没有权限把自己的文件拥有者改设为别人。
- 语法:
chown [-cfhvR] [--help] [--version] user[:group] file...
- 常用参数:
参数 | 参数描述 |
---|---|
user | 新的文件拥有者 ID |
group | 新的文件拥有者的使用者组(group) |
-c | 显示更改的部分的信息 |
-f | 忽略错误信息 |
-h | 修复符号链接 |
-v | 显示详细的处理信息 |
-R | 处理指定目录以及其子目录下的所有文件(递归改变) |
- 改变拥有者和群组 并显示改变信息
[root@localhost ~]# chown -c mail:mail test.log(前一个是用户,有一个为群组)
changed ownership of "test.log" from root:root to mail:mail
-r--r-xr-x. 1 mail mail 36 9月 8 18:36 test.log
- 改变文件群
[root@localhost ~]# chown -c :mail test.sh
changed ownership of "test.sh" from root:root to :mail
- 改变文件夹及子文件目录属主及属组为 mail
[root@localhost ~]# chown -cR mail: mydir
changed ownership of "mydir/test1/text1.txt" from root:root to mail:mail
changed ownership of "mydir/test1" from root:root to mail:mail
...省略...
3.7 grep(文本搜索)
grep(Global Regular Expression Print) 全局正则表达式搜索, 是一个强大的文本搜索命令。grep -模式 'key' filename
可以查找文件中的关键字,或者使用grep ps aux| key
控制台查找(不加引号)
grep 的工作方式:在一个或多个文件中搜索字符串模板。如果模板包括空格,则必须被引用,模板后的所有字符串被看作文件名。搜索的结果被送到标准输出,不影响原文件内容
注意:如果发现某文件的内容符合所指定的范本样式,预设 grep 指令会把含有范本样式的那一列显示出来。若不指定任何文件名称,或是所给予的文件名为 -,则 grep 指令会从标准输入设备读取数据
- 作用: 用于查找文件里符合条件的字符串
- 语法:
grep [option] pattern file|dir
常用参数:
参数 | 参数描述 |
---|---|
-A n | 显示匹配字符后n行 |
-B n | 显示匹配字符前n行 |
-C n | 显示匹配字符前后n行 |
-c | 计算符合样式的列数 |
-i | 忽略大小写 |
-l | 只列出文件内容符合指定的样式的文件名称 |
-f | 从文件中读取关键词 |
-n ‘for’ filename | 找出file文件中所有含’for’的部分并显示其行数 |
-R | 递归查找文件夹 |
grep 的规则表达式(都是在文件中查找)
参数 | 作用 |
---|---|
^ |
锚定行的开始 如:'^grep’匹配所有以grep开头的行。 |
$ |
锚定行的结束 如:'grep$'匹配所有以grep结尾的行。 |
. |
匹配一个非换行符的字符 如:'gr.p’匹配gr后接一个任意字符,然后是p。 |
* |
匹配零个或多个先前字符 如:'*grep’匹配所有一个或多个空格后紧跟grep的行。 |
.* |
一起用代表任意字符。 |
[] |
匹配一个指定范围内的字符,如’[Gg]rep’匹配Grep和grep。 |
[^] |
匹配一个不在指定范围内的字符,如:'[^A-FH-Z]rep’匹配不包含A-R和T-Z的一个字母开头,紧跟rep的行。 |
\(..\) |
标记匹配字符,如’(love)',love被标记为1。 |
\< |
锚定单词的开始,如:'<grep’匹配包含以grep开头的单词的行。 |
\> |
锚定单词的结束,如’grep>'匹配包含以grep结尾的单词的行。 |
x\{m\} |
重复字符x,m次,如:'0{5}'匹配包含5个o的行。 |
x\{m,\} |
重复字符x,至少m次,如:'o{5,}'匹配至少有5个o的行。 |
x\{m,n\} |
重复字符x,至少m次,不多于n次,如:'o{5,10}'匹配5–10个o的行。 |
\w |
匹配文字和数字字符,也就是[A-Za-z0-9],如:'G\w*p’匹配以G后跟零个或多个文字或数字字符,然后是p。 |
\W |
\w的反置形式,匹配一个或多个非单词字符,如点号句号等。 |
\b |
单词锁定符,如: '\bgrep\b’只匹配grep。 |
- 查找指定进程
[root@localhost ~]# ps -ef | grep svn
root 6771 9267 0 15:17 pts/0 00:00:00 grep --color=auto svn
- 查找指定进程个数
[root@localhost ~]# ps -ef | grep svn -c
1
- 从文件中读取关键词
[root@localhost ~]# cat test.log | grep -f test.log
马士兵教育:www.mashibing.com
- 从文件夹中递归查找以.sh结尾的行,并只列出文件
[root@localhost ~]# grep -lR '.sh$'
.bash_history
test.sh
.viminfo
log.tar
- 查找非x开关的行内容
[root@localhost ~]# grep '^[^x]' test.log
马士兵教育:www.mashibing.com
- 显示包含 ed 或者 at 字符的内容行
[root@localhost ~]# grep -E 'ed|at' test.log
3.8 ps命令
ps -A
:简明查看系统启动的所有进程ps -aux
:显示所有用户所有进程的详细信息ps -A |grep 服务名
:显示指定服务的进程简明信息ps -aux |grep 服务名
:显示指定服务的详细进程信息
-
作用: 用于显示当前进程 (process) 的状态
-
语法:
ps [options] [--help]
linux上进程有5种状态,ps 标识进程的5种状态码如下:
- 运行,代码R(runnable):正在运行或在运行队列中等待
- 中断,代码S(sleeping):休眠中, 受阻, 在等待某个条件的形成或接受到信号
- 不可中断,代码D:收到信号不唤醒和不可运行, 进程必须等待直到有中断发生
- 僵死,代码Z(zombie):进程已终止, 但进程描述符存在, 直到父进程调用wait4()系统调用后释放
- 停止,代码T( traced or stopped):进程收到SIGSTOP, SIGSTP, SIGTIN, SIGTOU信号后停止运行运行
- 命令参数
参数 | 参数描述 |
---|---|
-A | 显示所有进程 |
a | 显示所有进程 |
-a | 显示同一终端下所有进程 |
c | 显示进程真实名称 |
e | 显示环境变量 |
f | 显示进程间的关系 |
r | 显示当前终端运行的进程 |
-aux | 显示所有包含其它使用的进程 |
- 显示当前所有进程环境变量及进程间关系
[root@localhost ~]# ps -ef
- 找出与 cron 与 syslog 这两个服务有关的 PID 号码
[root@localhost ~]# ps aux | grep '(cron|syslog)'
root 20454 0.0 0.0 112824 984 pts/0 S+ 15:30 0:00 grep --color=auto (cron|syslog)
3.9 kill命令
kill 进程号
:关闭指定进程killall 服务名
:关闭服务的所有进程kill -9 进程号
:强制关闭指定进程killall -9 服务名
:强制关闭服务的所有进程
kill
命令用于删除执行中的程序或工作
kill
可将指定的信息送至程序。预设的信息为 SIGTERM(15),可将指定程序终止。若仍无法终止该程序,可使用 SIGKILL(9) 信息尝试强制删除程序(kill-9 进程编号。程序或工作的编号可利用 ps 指令或 jobs 指令查看
- 语法:
kill [-s <信息名称或编号>][程序] 或 kill [-l <信息编号>]
- 常用参数:
参数 | 参数描述 |
---|---|
-l | 信号,若果不加信号的编号参数,则使用“-l”参数会列出全部的信号名称 |
-a | 当处理当前进程时,不限制命令名和进程号的对应关系 |
-p | 指定kill 命令只打印相关进程的进程号,而不发送任何信号 |
-s | 指定发送信号 |
-u | 指定用户 |
先使用ps查找进程pro1,然后用kill杀掉
[root@localhost ~]# kill -9 $(ps -ef | grep pro1)
-bash: kill: root: 参数必须是进程或任务 ID
-bash: kill: (27319) - 没有那个进程
-bash: kill: (27317) - 没有那个进程
第四章 压缩/解压、时间
在Linux中,有许多种解压,压缩文件的命令,本章会一一介绍
4.1 zip &unzip
本节介绍zip压缩可解压命令unzip
- 安装
sudo apt-get install zip # ubantu安装
yum install -y unzip zip # centos安装
- zip压缩文件
zip可能是目前使用的最多的文档压缩格式。它最大的优点就是在不同的操作系统平台上使用。
缺点就是支持的压缩率不是很高,而tar.gz和tar.bz2在压缩率方面做得非常好。
语法:zip -r archive_name.zip filename
(-r是压缩文件)
# 把/home目录下面的mydata 目录压缩为 mydata.zip
zip -r mydata.zip mydata #压缩mydata目录
# 把/home目录下面的abc文件夹和123.txt压缩成为abc123.zip
zip -r abc123.zip abc 123.txt
- unzip解压文件
unzip archive_name.zip # 解压至当前文件夹
unzip archive_name.zip -d dirname # 解压文件至指定目录
4.2 tar (常用解压)
搜索压缩文件参考《linux压缩和解压缩命令tar,zip,gzip》
tar
本身不具有压缩功能,只具有打包功能,有关压缩及解压是调用其它的功能来完成。
- 打包:将一大堆文件或目录变成一个总的文件
- 压缩则是将一个大的文件通过一些压缩算法变成一个小文件
安装:
sudo apt-get install tar # ubantu
yum install -y tar # centos
作用: 用于备份文件(tar是用来建立,还原备份文件的工具程序,它可以加入,解开备份文件内的文件)
语法:
tar [-ABcdgGhiklmMoOpPrRsStuUvwWxzZ][-b <区块数目>][-C <目的目录>][-f <备份文件>][-F <Script文件>][-K <文件>][-L <媒体容量>][-N <日期时间>][-T <范本文件>][-V <卷册名称>][-X <范本文件>][-<设备编号><存储密度>][--after-date=<日期时间>][--atime-preserve][--backuup=<备份方式>][--checkpoint][--concatenate][--confirmation][--delete][--exclude=<范本样式>][--force-local][--group=<群组名称>][--help][--ignore-failed-read][--new-volume-script=<Script文件>][--newer-mtime][--no-recursion][--null][--numeric-owner][--owner=<用户名称>][--posix][--erve][--preserve-order][--preserve-permissions][--record-size=<区块数目>][--recursive-unlink][--remove-files][--rsh-command=<执行指令>][--same-owner][--suffix=<备份字尾字符串>][--totals][--use-compress-program=<执行指令>][--version][--volno-file=<编号文件>][文件或目录...]
命令参数:
参数 | 参数描述 |
---|---|
-c | 打包,建立新的压缩文件 |
-z | 支持gzip压缩 |
-v | 显示操作过程 |
-f | 指定压缩包文件名 |
-x | 解压,从压缩包中抽取文件 |
-j | 支持bzip2压缩 |
-cvf、-zcvf 、-jcvf 压缩包名 文件名 | tar 格式、tar.gz 格式,tar.bz2 格式打包,指定打包名并显示过程(不能写成cfv) |
-xvf、-zxvf 、–jxvf 压缩包名 目录名 | 将压缩文件解压到指定目录,显示过程 |
-C | 指定压缩、解压后存储目录 |
-r | 添加文件到已经压缩文件包中 |
-u | 添加改了和现有的文件到压缩包中 |
-t | 显示压缩文件中的内容 |
-Z | 支持compress解压文件 |
- 多个文件进行
tar
打包
# 将test.log test.sh全部打包成tar包
[root@localhost ~]# [root@localhost ~]# tar -cvf log.tar test.log test.sh
[root@localhost ~]# ls
test.log test.sh log.tar
- 目录下所有文件进行
tar.gz
打包
将/etc
下的所有文件及目录打包到/home目录,并使用 gz 压缩
[root@localhost ~]# tar -zcvf etc.tar.gz /etc -C /home
- 查看刚打包的文件内容(一定加z,因为是使用 gzip 压缩的)
[root@localhost ~]# tar -zxvf ./etc.tar.gz(xzvf也可以)
...省略...
- 要压缩打包 /home, /etc ,但不要 /home/mashibing ,只能针对文件,不能针对目录
[root@localhost ~]# tar --exclude /home/mshibing -zcvf myfile.tar.gz /home/* /etc
gzip 实例:
- 压缩: gzip fileName .tar.gz 和.tgz
- 解压:gunzip filename.gz 或 gzip -d filename.gz
- 对应:tar zcvf filename.tar.gz tar zxvf filename.tar.gz
bz2实例:
- 压缩: bzip2 -z filename.tar.bz2
- 解压:bunzip filename.bz2或bzip -d filename.bz2
- 对应:tar jcvf filename.tar.gz 解压:tar jxvf filename.tar.bz2
4.3 date(系统时间)
-
作用: 用来显示或设定系统的日期与时间
-
语法:
date [-u] [-d datestr] [-s datestr] [--utc] [--universal] [--date=datestr] [--set=datestr] [--help] [--version] [+FORMAT] [MMDDhhmm[[CC]YY][.ss]]
时间参数
参数 | 描述参数 |
---|---|
% | 印出 % |
%n | 下一行 |
%t | 跳格 |
%H | 小时(00…23) |
%I | 小时(01…12) |
%k | 小时(0…23) |
%l | 小时(1…12) |
%M | 分钟(00…59) |
%p | 显示本地 AM 或 PM |
%r | 直接显示时间 (12 小时制,格式为 hh:mm:ss [AP]M) |
%s | 从 1970 年 1 月 1 日 00:00:00 UTC 到目前为止的秒数 |
%S | 秒(00…61) |
%T | 直接显示时间 (24 小时制) |
%X | 相当于 %H:%M:%S |
%Z | 显示时区 |
日期参数
参数 | 描述参数 |
---|---|
%a | 星期几 (Sun…Sat) |
%A | 星期几 (Sunday…Saturday) |
%b | 月份 (Jan…Dec) |
%B | 月份 (January…December) |
%c | 直接显示日期与时间 |
%d | 日 (01…31) |
%D | 直接显示日期 (mm/dd/yy) |
%h | 同 %b |
%j | 一年中的第几天 (001…366) |
%m | 月份 (01…12) |
%U | 一年中的第几周 (00…53) (以 Sunday 为一周的第一天的情形) |
%w | 一周中的第几天 (0…6) |
%W | 一年中的第几周 (00…53) (以 Monday 为一周的第一天的情形) |
%x | 直接显示日期 (mm/dd/yy) |
%y | 年份的最后两位数字 (00.99) |
%Y | 完整年份 (0000…9999) |
若是不以加号作为开头,则表示要设定时间,而时间格式为 MMDDhhmm[[CC]YY][.ss],其中 MM 为月份,DD 为日,hh 为小时,mm 为分钟,CC 为年份前两位数字,YY 为年份后两位数字,ss 为秒数。
当您不希望出现无意义的 0 时(比如说 1999/03/07),则可以在标记中插入 - 符号,比如说date '+%-H:%-M:%-S'
会把时分秒中无意义的 0 给去掉,像是原本的 08:09:04 会变为 8:9:4。另外,只有取得权限者(比如说 root)才能设定系统时间。
当您以 root 身分更改了系统时间之后,请记得以 clock -w 来将系统时间写入 CMOS 中,这样下次重新开机时系统时间才会持续抱持最新的正确值。
- 常见参数:
-d | 显示 datestr 中所设定的时间 (非系统时间) |
–help | 显示辅助讯息 |
-s | 将系统时间设为 datestr 中所设定的时间 |
-u | 显示目前的格林威治时间 |
–version | 显示版本编号 |
4.4 cal (公历)
-
作用: 用户显示公历(阳历)日历
-
语法: cal [选项] [[[日] 月] 年]
参数 | 参数描述 |
---|---|
-1 | 只显示当前月份(默认) |
-3 | 显示上个月、当月和下个月 |
-s | 周日作为一周第一天 |
-m | 周一用为一周第一天 |
-j | 输出儒略日 |
-y | 输出整年 |
-V | 显示版本信息并退出 |
-h | 显示此帮助并退出 |
- 显示指定年月日期
[root@localhost ~]# cal 9 2020
- 显示2020年每个月日历,周一为第一列
[root@localhost ~]# cal -ym 2020
- 将星期一做为第一列,显示前中后三月
[root@localhost ~]# cal -3m
第五章 Linux编辑器vim
5.1 vi与vim的简介
在Linux下,绝大部分的配置文件都是以ASCII码的纯文本形式存在的,可以利用一些简单的编辑软件修改配置,比如nano,Emacs,vim等。因为有太多的Linux命令都默认使用vi作为数据编辑的接口,所以我们必须学会vi,否则很多的命令无法操作。
vim可以视为vi的高级版本,vim可以用颜色或者底线等方式显示一些特殊的信息,可以根据文件的扩展名或者是文件内的开头信息判断该文件的内容,自动调用该程序的语法判断式。vim可以看做是是一个程序开发工具而不是文字处理软件。
概括的说:vi是文字处理器,而vim是它的升级版本,是一个程序开发工具。vim加入了许多额外的功能,例如支持正则表达式的查找架构,多文件编辑器,块复制等。安装方式为:yum install vim
已加载插件:fastestmirror
vi/vim 共分为三种模式:
- 命令模式(Command mode):一般使用VI操作直接进入的模式,即默认模式。
- 在此模式下可以进行移动光标、复制、粘贴、删除等基础操作。
- 不管用户处于何种模式,只要按一下ESC键,即可使Vi进入命令模式
- 此状态下敲击键盘动作会被Vim识别为命令,而非输入字符。比如我们此时按下i,并不会输入一个字符,而是进入了输入模式。
- 输入模式(Insert mode) :
- 末行命令模式(Last line mode)
5.2 命令模式
常用的几个命令:
i 切换到输入模式,以输入字符。
x 删除当前光标所在处的字符。
shift + : 切换到末行命令模式,以在最底一行输入命令。
移动光标的方法 | |
---|---|
h 、j、k、l或 ←、↓、↑、→ | 光标向左、下上、右移动一个字符 |
“30j” 或 “30↓” | 向下移动30行 |
Ctrl+f 或Ctrl +b |
屏幕『向下』、『向上』移动一页,相当于 [Page Down]、 [Page Up]按键 (常用) |
数字0 或功能键[Home] | 移动到行首字符处 (常用) |
$ 或功能键[End] | 移动到行尾字符处 (常用) |
G | 移动到这个档案的最后一行(常用) |
nG | 移动到这个档案的第 n 行(可配合 :set nu) |
gg | 移动到这个档案的第一行,相当于 1G 啊! (常用) |
Ctrl+d 或Ctrl +u |
屏幕『向下』、『向上』移动半页 |
+ 、- |
光标移动到非空格符的下一行 、上一行 |
H 、M、L | 光标移动到屏幕的最上方、最中间、最下面那一行的第一个字符 |
搜索替换 | |
---|---|
/word | 寻找光标之下名称为 word 的字符串。按n继续向下搜索 |
?word | 寻找光标之上名称为 word 的字符串。按n继续向上搜索 |
n | 见上面命令说明 |
N | 与 n 刚好相反,『反向』搜寻。 例如 /vbird 后,按下 N 则表示『向上』搜寻 vbird 。 |
删除、复制 与贴上 | |
---|---|
x, X | x 为向后删除一个字符 (相当于 [del] 按键), X 为向前删除一个字符(相当于 [backspace] 亦即是退格键) (常用) |
nx | n 为数字,连续向后删除 n 个字符。举例来说,我要连续删除 10 个字符, 『10x』。 |
dd、yy | 删除、复制整行 |
ndd、nyy | 删除、复制向下 n 行,例如 20dd 则是删除 20 行 (常用) |
d1G 、 y1G | 删除、复制光标所在到第一行的所有数据 |
dG 、yG | 删除、复制光标所在到最后一行的所有数据 |
d$(home)、y$(home) | 删除、复制游标所在处到行尾 |
d0(end)、y0(end) | 删除、复制游标所在处到行首 |
ndw | 删除光标后n个单词 |
p, P | p 为光标处向下粘贴,P 则为向上粘贴! 不会覆盖原数据 (常用) |
J | 将光标所在行与下一行的数据结合成同一行 |
c | 重复删除多个数据,例如向下删除 10 行,[ 10cj ] |
u | 撤销前一个动作。(常用) |
[Ctrl]+r | 取消刚刚的撤销。(常用) |
. |
不要怀疑!这就是小数点!意思是重复前一个动作的意思。 如果你想要重复删除、重复贴上等等动作,按下小数点『.』就好了! (常用) |
5.3 输入模式
在命令模式下输入插入命令i、附加命令a 、打开命令o、修改命令c、取代命令r或替换命令s都可以进入文本输入模式。在该模式下,用户输入的任何字符都被Vi当做文件内容保存起来,并将其显示在屏幕上。
进入输入或取代的编辑模式 | 进入输入模式(Insert mode) |
---|---|
i,a | 『光标前、光标后输入』 |
I, A | 『光标行首(非空格)、行尾输入』 |
o, O | 『光标下一行、上一行输入新的一行』 |
r, R | 进入取代模式(Replace mode): r 只会取代光标所在的那一个字符一次;R会一直取代光标所在的文字,直到按下 ESC 为止;(常用) |
上面这些按键中,在 vi 画面的左下角处会出现『–INSERT–』或『–REPLACE–』的字样。 | |
[Esc] | 退出编辑模式,回到一般模式中(常用) |
5.4 末行模式
末行模式也称ex转义模式。在命令模式下,用户按“:
”键即可进入末行模式下,此时Vi会在显示窗口的最后一行(通常也是屏幕的最后一行)显示一个“:”作为末行模式的提示符,等待用户输入命令。多数文件管理命令都是在此模式下执行的(如把编辑缓冲区的内容写到文件中等)。末行命令执行完后,Vi自动回到命令模式。例如:
:sp newfile 双开编辑文件。bn是下一个文件,bp是上一个文件,可用于两个文件复制粘贴
则分出一个窗口编辑newfile文件。如果要从命令模式转换到编辑模式,可以键入命令a或者i;如果需要从文本模式返回,则按Esc键即可。在命令模式下输入“:”即可切换到末行模式,然后输入命令。
指令行的储存、离开等指令 | |
---|---|
:w | 将编辑的数据写入硬盘档案中(常用) |
:w! | 若文件属性为『只读』时,强制写入该档案。不过,到底能不能写入, 还是跟你对该档案的档案权限有关啊! |
:q | 离开 vi (常用) |
:q! | 强制修改不保存。 ,惊叹号 (!) 在 vi 当中,常常具有『强制』的意思~ |
:wq | 储存后离开,若为 :wq! 则为强制储存后离开 (常用) |
命令模式下敲ZZ | 这是大写的 Z 喔,保存退出 |
命令模式下敲ZQ | 不保存,强制退出。效果等同于 :q!。 |
:w [filename] | 将编辑的数据储存成另一个档案(类似另存新档) |
:r [filename] | 在编辑的数据中,读入另一个档案的数据。亦即将 『filename』 这个档案内容加到游标所在行后面 |
:n1,n2 w [filename] | 将 n1 到 n2 的内容储存成 filename 这个档案。 |
:! 命令 | 命令模式下执行 !后的命令 显示结果!(此时会暂时退出vim文件编辑界面) |
:n1,n2s/word1/word2/gi</ | n1 与 n2 为数字。在第 n1 与 n2 行之间寻找 word1 这个字符串,并将该字符串取代为 word2 !举例来说,在 100 到 200 行之间搜寻 vbird 并取代为 VBIRD 则: 『:100,200s/vbird/VB/gi』。(常用)i为忽略大小写 |
:1,$s/word1/word2/g 或 :%s/word1/word2/gc | 全文件替换 word1 字符串为 word2 !c为确认(常用) |
vim 环境的变更 | |
---|---|
:set nu | 显示行号。要永久生效时可在/etc/vimrc中空白行写入set nu |
:set nonu | 与 set nu 相反,为取消行号! |
普通用户:默认自动使用vim替换了vi |
5.5 vim 中批量添加注释
-
方法一 :块选择模式
-
批量注释:
Ctrl + v 进入块选择模式,然后移动光标选中要注释的行,再按大写的 I 进入行首插入模式,输入注释符号如 // 或 #,按两下 ESC,Vim 会自动将你选中的所有行首都加上注释,保存退出完成注释。 -
取消注释:
Ctrl + v 进入块选择模式,选中你要删除的行首的注释符号,注意 // 要选中两个,选好之后按 d 即可删除注释,ESC 保存退出。
-
-
方法二: 替换命令
- 行首批量添加注释: :起始行号,结束行号s/^/注释符/g(注意冒号)。
- 批量取消注释: :起始行号,结束行号s/^注释符//g(注意冒号)。
- 在 10 - 20 行添加 // 注释
:10,20s#^#//#g
- 在 10 - 20 行删除 // 注释
:10,20s#^//##g
- 在 10 - 20 行添加 # 注释
:10,20s/^/#/g
- 在 10 - 20 行删除 # 注释
:10,20s/#//g
第六章 进阶知识
6.1 Linux 下用户和组的管理
6.1.1 linux系统下用户角色及用户相关文件介绍
在 linux 系统下用户的角色不同,权限和所能完成的任务也不同,用户角色是通过UID来识别的(在 linux 下要注意 root 用户的 UID的唯一性)。
- Root:系统管理员超级用户,系统唯一,可以登陆系统,可以操作任何文件和命令,拥有最高权限,UID值
为 0 - 虚拟用户:与真实的用户分开来,这类用户不能登陆系统,但是在使用某些服务的时候使用,这类用户是系统默
认添加的。 - 普通真实用户:这类用户可以登陆系统,但是只能操作自己家目录的内容,受限账户,这类用户都是管理员自行添加
的。
在 windows 当中可以使用计算机管理工具中的用户和组的管理工具来对用户进行管理,在linux下是
通过对用户配置文件(区别与windows 中的用户配置文件)的管理来实现对用户和组的管理。
/etc/passwd
用户账号文件,记录所有用户记录。每行表示一个用户信息,7个字段都有各自的含义为:
root : x : 0 : 0 : root : /root : /bin/bash
用户名 密码 UserID GroupID 用户相关说明 用户家目录路径 用户的登陆shell
/etc/shadow
:用户账户的影子文件,包含用户的加密密码和其他信息,两个文件互补来记录用户信息,这个文件只有root 可以读取和操作,每行包含 8 个字段,各项说明如下:
root:*:18375:0:99999:7:::
用户名 加密口令 上次口令改变时间(从 1970 年 1月 1日算起的天数) 多少天内不能改变口令
多少天内必须改变口令 口令到期前多少天会出现警告 如果口令到期后几天不使用账号,则无法登陆 如果到这个日期不用账号则无法登陆,可以以YYYY-MM-DD格式,也可以用 1970年 1月1 日起的天数
/etc/login.defs
:
MAIL_DIR :邮件存放目录
PASS_MAX_DAYS: 密码有效期最长时间
PASS_MIN_DAYS :密码有效期最短时间
PASS_MIN_LEN :密码最小长度
PASS_WARN_AGE: 密码到期提示时间
UID_MIN 、UID_MAX:UID最小值、UID最大值
GID_MIN、GID_MAX :GID最小值、GID最大值
CREATE_HOME :是否创建家目录
UMASK :UMASK值
USERGROUPS_ENAB :当删除用户后,同名组中不在存在用户的时候,是否删除该组
/etc/skel
:存放用户启动文件的目录- 类似与windows 的用户配置文件目录,为用户提供用户环境,该目录下的文件全部为隐藏文件。在添加用户时会从该目录下复制文件到用户的家目录下,相当与统一的登陆模板。
pwconv/pwunconv
:开启/关闭投影密码
该选项是一个安全选项。开启用户的投影密码,可以把用户名和密码分别存放在两个文件当中,影子文件就是密码文件。这样使得密码得到更好的保护,不容易被别的用户得到。
root@DESKTOP-OHLNREI:/etc/skel# ls -a
. .. .bash_logout .bashrc .profile
6.1.2 用户管理
useradd
:创建用户- -d :指定用户的家目录
- -g :指定用户组
- -G :指定用户的附加组
- -u :指定用户的UID 值
- -p: 创建密码
useradd -d /rose -g group -G root -u 505 rose
:创建rose 用户,指定家目录在/rose下,加入到group 组,同时附加到 root 组,并设置 UID 号为505- users 查看所有登陆的用户(who)
usermod
: 修改用户,例如:usermod -l newname oldname- -d -g -G -u 等参数与useradd 命令参数使用方法一样
usermod -d /home/rose -g group0 -G group1 -u 600 rose
:将 rose用户的家目录,主组和附加组以及 UID值进行更改- usermod -L rose :锁定rose 用户
- usermod -U rose :解除rose 用户的锁定
passwd
:设置密码- -d :删除密码
- -f :强制执行下次登陆时更改密码
- -l:停止账号使用
- -u :启用已经停止的账号
- -S :显示密码信息
passwd rose
:给用户rose 设置密码
userdel
:删除账号命令userdel rose
: 删除rose 账号userdel -r rose
:删除用户登陆目录及目录下的文件(类似于windows 的删除用户选择是否删除用户的文
档)
gpasswd
:用户添加到其他组的命令,只有root 和组管理员能够改变组成员- gpasswd -a u1 g1 将u1 加入到 g1 组
- gpasswd -d u1 g1 将u1 退出 g1 组
- gpasswd -A u1 g1 将g1 组的管理员指派给u1
id
: 查看 ID 信息命令
root@DESKTOP-OHLNREI:/etc/skel# id root
uid=0(root) gid=0(root) groups=0(root)
- root单用户
如果希望计算机除了root 账号外其他账号不能登陆,在/etc目录中执行touch nologin,创建 1个名称为 nologin 的文件。如果系统只有一个人使用,可以考虑修改/etc/inittab文件,将默认启动值改为2。
6.1.3 组的管理(后续再补)
6.1.4 普通用户权限提升
su
:切换用户su
:默认切换到root 用户su - root
:更改环境变量为root 用户的su -m root
:保留环境变量不变su -c “/usr/sbin/useradd u1” root
:以root 的身份执行useradd命令,-c 代表执行一个命令后就结
束。其中命令需要输入命令文件的绝对路径。
- sudo 命令:受限制的su
su 转换到 root 后,权限是无限制性,所以su 并不能担任多个管理员所管理的系统;而且切换到 root 后,也不能明确哪些工作是由哪个管理员进行的操作。
多人管理服务器时,最好是针对每个管理员的技术特长和管理范围,并且有针对性的下放给权限,并且约定其使用哪些工具来完成和其相关的工作,这时我们就有必要用到 sudo。
通过 sudo,我们能把某些 root 有针对性的下放,并且无需普通用户知道root 密码,所以sudo 相对
于权限无限制性的su 来说,还是比较安全的,所以sudo 也能被称为受限制的su ;另外 sudo 是需要授
权许可的,所以也被称为授权许可的su
sudo 执行命令的流程是当前用户转换到root(或其他指定转换到的用户),然后以 root(或其他指
定的转换到的用户)身份执行命令,执行完成后,直接退回到当前用户;而这些的前提是要通过sudo 的
配置文档/etc/sudoers
来进行授权,例如:
u1 ALL=(root) NOPASSWD:/bin/cat # u1用户可以转换到 root下不需要输入密码执行/bin/cat命令
u1 ALL=(root)/bin/cat,/user/bin/passwd,!/user/bin/passwd root
# u1 用户可以转换到root 下需要输入密码执行/bin/cat,/user/bin/passwd,但不能执行/user/bin/passwd root来修改用户密码
sudo -l
:列出用户在主机上可用的和被禁止的命令- sudo 命令(命令为绝对路径):执行命令,例如
sudo /bin/cat /etc/shadow