Linux基础

Unix是最早的多用户多任务操作系统,按操作系统分类属于分时操作系统,Unix大多被用在服务器工作站,现在也有用在个人计算机上。它在创建互联网、计算机网络或客户端/服务器模型方面发挥着非常重要的作用。

Linux是1991芬兰的业余计算机爱好者Linus Torvalds编写了一款类似Minix的系统即基于微内核架构Unix操作系统,被ftp管理员命名为Linux加入到自由软件基金的GNU计划中。

Linux是一套免费使用和自由传播的类Unix操作系统,Linux存在着许多不同的Linux版本,但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中,如手机平板电脑路由器视频游戏控制台台式计算机大型机超级计算机。严格来讲Linux这个词本身只表示Linux内核,但实际上人们已经习惯了用Linux来形容整个基于Linux内核,并且使用GNU工程各种工具和数据库的操作系统。

根据原生程度将Linux分为:内核版发行版

  • 内核版:Linux不是一个操作系统,严格来讲Linux只是一个操作系统中的内核,建立了计算机软件与硬件之间通讯的平台,内核提供系统服务,如文件管理、虚拟内存、设备I/O等
  • 发行版:一些组织或公司在内核版基础上进行二次开发重新发行的版本,Linux发行版本有很多种

Linux发行版

在Linux操作系统中,所有被操作系统管理的资源,如网络接口卡、磁盘驱动器、打印机、输入输出设备、普通文件或是目录都被看作是一个文件

Linux系统一切都是文件,其实这是Unix哲学的一个体现,而Linux是重写Unix而来,所以这个概念也就传承了下来。在UNIX系统中,把一切资源都看作是文件包括硬件设备。UNIX系统把每个硬件都看成是一个文件,通常称为设备文件,这样用户就可以用读写文件的方式实现对硬件的访问

HFS

利用Linux来开发产品或distributions的社群、公司与个人实在太多,若每个人都用自己的想法来配置文件放置的目录,将造成很多管理上的困扰,故就有所谓的Filesystem Hierarchy Standard (FHS)标准的出炉了;FHS的重点在于规范每个特定的目录下应该要放置什么样子的数据

  • 可分享的可分享给其他系统挂载使用的目录,所以包括执行文件用户的邮件等数据
  • 不可分享的:自己机器上运行的设备文件与程序有关的socket文件
  • 不变的:有些数据是不会经常变动的,跟随着distribution而不变动,如函式库文件说明文件系统管理员所管理的主机服务配置文件等;
  • 可变动的:经常改变的数据,如登录文件、一般用户可自行收受的新闻组

FHS针对目录树架构仅定义出三层目录底下应该放置什么数据而已

  • (root,根目录)/:与开机系统有关
  • /usr与软件安装/执行有关
  • /var :与系统运行过程有关

根目录是整个系统最重要的一个目录,不但所有的目录都是由根目录衍生出来的,同时根目录也与开机、还原、系统修复等动作有关,由于系统开机时需要特定的开机软件、核心文件、开机所需程序、函式库等文件数据,若系统出现错误时,根目录也必须要包含有能够修复文件系统的程序才行;FHS 标准建议根目录所在分区槽应该越小越好,且应用程序所安装的软件最好不要与根目录放在同一个分区槽内;

Linux文件系统的结构层次鲜明,就像一棵倒立的树,最顶层是其根目录:

Linux文件系统目录结构

  • /bin存放二进制可执行文件,在/bin目录下的指令可以被root与一般账号所使用,如lscatmkdir
  • /etc:存放系统管理配置文件,系统主要的配置文件几乎都放置在该目录内
    • /etc/opt:放置第三方协力软件/opt的相关配置文件
    • /etc/X11:与X Window有关的各种配置文件
    • /etc/sgml:与SGML格式有关的各项配置文件
    • /etc/xml:与XML格式有关的各项配置文件
  • /home:存放所有用户文件的根目录,是用户主目录的基点,如用户user的主目录/home/user,可用~user表示
  • /usr:用于存放系统应用程序
  • /opt:额外安装的可选应用程序包第三方软件所放置的位置,一般情况下可把tomcat等都安装到这里
  • /proc虚拟文件系统目录是系统内存的映射可直接访问该目录来获取系统信息
  • /root:超级用户即系统管理员的主目录
  • /sbin:存放二进制可执行文件,只有root才能访问,这里存放的是系统管理员使用的系统级别管理命令程序,为开机过程中所需要的开机、修复、还原系统所需要的指令,如ifconfig等;某些服务器软件程序,一般则放置到/usr/sbin/当中,本机自行安装的软件所产生的系统执行文件放置在/usr/local/sbin/
  • /dev:用于存放设备文件,任何装置与接口设备都是以文件的型态存在于该目录中
  • /mnt系统管理员安装临时文件系统安装点,系统提供这个目录是让用户临时挂载其他的文件系统
  • /boot:存放用于系统引导时使用的各种文件
  • /lib:存放着和系统运行相关的库文件,在开机时会用到的函式库,在/bin/sbin目录中的指令会调用的函式库
    • /lib/modules/:放置内核相关的模块,如驱动程序
  • /tmp:用于存放各种临时文件,是公用临时文件存储点
  • /var:用于存放运行时需要改变数据的文件,也是某些大文件的溢出区,如各种服务的日志文件
  • /lost+found:该目录平时是空的,系统非正常关机而留下无家可归的文件
  • /media:放置可删除的设备,如软盘、光盘、DVD等装置
  • /run:放置系统开机后所产生的各项信息
  • /srv:一些网络服务启动之后,所需要取用的数据目录

Linux中文件是没有所谓的扩展名,文件是否能被执行是通过该文件是否具有x权限,若Linux默认是Ext2或Ext3文件系统,对单一文件或目录的最大容许文件名长度为255个字符;包含完整路径名称及目录的完整文件名为4096个字符;

Linux基本命令

Linux命令用法一般用man命令可查看其帮助信息,也可通过Linux命令大全中文帮助文档查看。

目录切换命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
.          # 代表此层目录
.. # 代表上一层目录
- # 代表前一个工作目录
~ # 代表当前用户目录所在的文件夹
~account # 代表accunt这个用户的主文件夹,account表示账号名称

cd # 切换目录
pwd # 显示当前目录
mkdir # 新建目录
rmdir # 删除目录

# 创建目录同时给文件夹配置权限,若不加-m创建的文件夹权限由umask决定
mkdir -m 777 test
# 递归创建文件夹
mkdir -p test1/test2

变量$PATH

当执行一个指令时,如ls命令,系统会根据PATH的设定去每个PATH定义的目录下搜寻文件名为ls的可执行文件,若在PATH定义的目录中含有多个文件名为 ls 的可执行文件,则先搜寻到的同名指令先被执行;为了安全起见,不建议将.加入PATH的搜寻目录中

文件或目录修改命令

创建目录或文件
1
2
3
4
# 在当前目录下创建dirname目录
mkdir dirname
# 若所要建立目录的上层目录目前尚未建立,则会一并建立上层目录
mkdir -p dirname/subdir1/subdir11
ls

ls命令默认显示非隐藏文件的文件名、 以文件名进行排序文件名代表的颜色显示,命令执行可用分号;分割,表示连续且顺序执行命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
ll --time=atime 011.txt;  ll --time=use 011.txt;ll --time=ctime 011.txt

选项与参数:
-a :全部的文件,连同隐藏档一起列出来
-A :全部的文件,连同隐藏档,但不包括.与..这两个目录
-d :仅列出目录本身,而不是列出目录内的文件数据
-f :直接列出结果,而不进行排序 (ls 预设会以档名排序!)
-F :根据文件、目录等信息,给予附加数据结构,例如:*:代表可执行文件; /:代表目录; =:代表 socket 文件; |:代表 FIFO 文件;
-h :将文件容量以人类较易读的方式(例如 GB, KB 等等)列出来;
-i :列出 inode 号码,inode 的意义下一章将会介绍;
-l :长数据串行出,包含文件的属性与权限等等数据;(常用)
-n :列出 UID 与 GID 而非使用者与群组的名称 (UID 与 GID 会在账号管理提到!)
-r :将排序结果反向输出,例如:原本档名由小到大,反向则为由大到小;
-R :连同子目录内容一起列出来,等于该目录下的所有文件都会显示出来;
-S :以文件容量大小排序,而不是用档名排序;
-t :依时间排序,而不是用档名。
--color=never :不要依据文件特性给予颜色显示;
--color=always :显示颜色
--color=auto :让系统自行依据设定来判断是否给予颜色
--full-time :以完整时间模式 (包含年、月、日、时、分) 输出
--time={atime,ctime} :输出access时间或改变权限属性时间 (ctime)而非内容变更时间 (modification time)
  • mtime:即modification time,当该文件的内容变更时则会更新该时间,而不是文件的属性或权限
  • ctime:即status time,当该文件的状态改变时则会更新该时间,如权限属性被更改则会更新该时间
  • atime:即access time,当该文件的内容被读取时则会更新该读取时间,如使用cat去读取文件内容则会更新该文件的atime
剪切或更名命令
1
2
3
4
# 将文件ex3改名为new1
mv ex3 new1
# 将目录/usr/men中的所有文件移到当前目录中
mv /usr/men/* .
拷贝

所有目标文件指定的目录必须是己经存在的,cp命令不能创建目录,可将多个路径的数据复制到同一个目录中,复制文件时即使复制了所有属性也不能复制ctime

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 将文件file复制到目录/usr/men/tmp下,并改名为file1
cp file /usr/men/tmp/file1
# 将目录/usr/men下的所有文件及其子目录复制到目录/usr/zh中
cp -r /usr/men /usr/zh
# 交互式地将目录/usr/men中的以m打头的所有.c文件复制到目录/usr/zh中
cp -i /usr/men m*.c /usr/zh

选项与参数:
-a :相当于-pdr的意思
-d :若来源文件为链接文件的属性(link file),则复制链接文件属性而非文件本身
-f :为强制(force)的意思,若目标文件已经存在且无法开启,则移除后再尝试一次
-i :若目标文件(destination)已经存在时,在覆盖时会先询问动作的进行
-l :进行硬式连结(hard link)的连结档建立,而非复制文件本身
-p :连同文件的属性(权限、用户、时间)一起复制过去,而非使用默认属性,备份常用
-r :递归持续复制,用于目录的复制行为
-s :复制成为符号链接文件(symbolic link),即快捷方式文件,即软链接
-u :destination比source旧才更新destination,或destination不存在的情况下才复制
删除
1
2
3
4
5
6
7
# 交互式删除当前目录下的文件test和example
rm -i test example
# 强制删除目录/文件/压缩包
rm -rf test
# 删除带-的文件或目录
rm ./-aa.txt
rm -- -aa.txt
获取路径文件名和目录名
1
2
basename /home/eleven/test.txt
dirname /home/eleven/test.txt
创建文件

touch命令常用于创建一个空文件,或将某个文件日期mtimeatime修改为目前的日期

1
2
3
4
5
6
7
8
9
10
11
12
# 在当前目录下创建ex2文件
touch ex2

touch -d "2 days ago" 011.txt
touch -t 201406150202 011.txt

选项与参数:
-a :仅修订access time
-c :仅修改文件的时间,若该文件不存在则不建立新文件
-d :后面可以接欲修订的日期而不用目前的日期,也可以使用 --date="日期或时间"
-m :仅修改mtime
-t :后面可以接欲修订的时间而不用目前的时间,格式为[YYYYMMDDhhmm]

文件内存查看

  • cat:由第一行开始显示文件内容
  • tac:从最后一行开始反向显示,tac是cat的倒写
  • nl显示时输出行号
  • more:一页一页的显示文件内容
  • less:与more类似,相比more可往前翻页
  • head只看头几行
  • tail:只看末尾几行
  • od:以二进制的方式读取文件内容

cat&tac

1
2
3
4
5
6
7
8
9
10
11
12
13
14
选项与参数:
-A :相当于-vET的整合选项,可列出一些特殊字符而不是空白
-b :列出行号,仅针对非空白行做行号显示,空白行不标行号
-E :将结尾的断行字符 $ 显示出来
-n :打印出行号,连同空白行也会有行号
-T :将 [tab] 按键以 ^I 显示出来
-v :列出一些看不出来的特殊字符

# 在屏幕上显示文件ml的内容
cat m1
# 同时显示文件ml和m2的内容
cat m1 m2
# 将文件ml和m2合并后放入文件m3中
cat m1 m2 > m3

nl

1
2
3
4
5
6
7
8
9
选项与参数:
-b :指定行号指定的方式,主要有两种:
-b a :表示不论是否为空行,也同样列出行号(类似 cat -n)
-b t :如果有空行,空的那一行不要列出行号(默认值)
-n :列出行号表示的方法,主要有三种:
-n ln :行号在屏幕的最左方显示
-n rn :行号在自己字段的最右方显示,且不加0
-n rz :行号在自己字段的最右方显示,且加0
-w :行号字段的占用的字符数

more

若more后面接的文件内容行数大于屏幕输出的行数时,最后一行会显示出目前显示的百分比,且可在最后一行输入一些有用的指令,在文件内重复搜索同一个字符串时可直接按n键;

  • 空格键:代表向下翻一页
  • Enter:代表向下翻一行
  • /字符串:代表在该显示的内容中,向下搜寻字符串这个关键词
  • :f:立刻显示出文件名以及目前显示的行数
  • q:代表立刻离开more,不再显示该文件内容
  • bctrl b :代表往回翻页,该动作仅对文件有用对管道无用
1
more filename

less

less的用法相比more更有弹性,使用more时无法向前翻页,但less可以,less中科拥有更多搜索功能,不仅可往下搜索还可网上搜索:

  • 空格键向下翻一页
  • PageDown键向下翻一页
  • PageUp键向上翻一页
  • /字符串向下搜寻功能
  • ?字符串向上搜寻功能
  • n重复前一个搜寻,与/?有关
  • N反向的重复前一个搜寻,与/?有关
  • g:跳转到该文件的第一行
  • G:跳转到该文件的最后一行
  • q:离开less
1
2
# -N显示行号
less -N filename

数据选取

head查看文件的NCtrl+C结束,默认显示10行

1
2
3
4
5
6
7
8
9
# 查看文件前10行
head -10 filename
head -n 10 filename

# 查询所有行不包括最后10行
head -n -10 filename

# 显示文件filename的前100个字符
head -c 100 filename

tail查看文件的后N行Ctrl+C结束,默认显示10行

1
2
3
4
5
6
7
8
# 显示文件file的最后10行
tail file
# 显示文件file的内容,从第20行至文件末尾
tail +20 file
# 显示文件file的最后10个字符
tail -c 10 file
# 显示文件file的最后100行,且显示文件最新追加的内容
tail -100f file

od

读取数据文件二进制非文本文件

1
2
3
4
5
6
7
8
9
od [-t TYPE] 文件
选项或参数:
-t :后面可以接各种类型的输出:
a :利用默认的字符来输出
c :使用 ASCII 字符来输出
d[size] :利用十进制(decimal)来输出数据,每个整数占用 size bytes
f[size] :利用浮点数(floating)来输出数据,每个数占用 size bytes
o[size] :利用八进制(octal)来输出数据,每个整数占用 size bytes
x[size] :利用十六进制(hexadecimal)来输出数据,每个整数占用 size bytes
vim文件修改

vim编辑器是Linux中的强大组件,是vi编辑器的加强版,实际开发中vim编辑器主要作用就是修改配置文件编写shell脚本,vim有命令模式编辑模式底行模式3中模式

  • 命令模式:可控制光标的移动字符删除移动复制某段区域,该模式下可进入插入模式底行模式,通过vim刚进入文件即是该模式
  • 编辑模式:可插入删除文字,通过Esc进入底行模式
  • 底行模式保存文件退出vim
移动光标
  • vim可使用小写英文字母hjkl分别控制光标移动,也可使用箭头
  • Ctrl+b:向前翻一页
  • Ctrl+f:向后翻一页
  • Ctrl+u:向前翻半页
  • Ctrl+d:向后翻半页
  • Shift+gG:移动到文章的最后
  • Shift+4$符:移动到光标所在行的末尾
  • Shift+6^符:移动到光标所在行的行首
  • w:光标跳到下个字的开头
  • e:光标跳到下个字的字尾
  • b:光标回到上个字的开头
  • #l:将光标在该行向后移动#个位置,#表示一个数字
  • gg跳转到文本开始
删除文字
  • x每按一次删除光标所在位置后面的一个字符
  • #x:如6x删除光标所在位置的后面包含自己在内6个字符
  • Shift+xX每按一次删除光标所在位置的前面一个字符
  • Shift+#x#X:如20X删除光标所在位置前面20个字符
  • dd删除光标所在行
  • #dd:如6dd从光标所在行开始删除6
复制

所有与y有关的复制命令都必须与p配合才能完成复制粘贴功

  • yw:将光标所在之处字尾的字符复制到缓冲区中
  • #yw:如6yw复制6个字到缓冲区
  • yy复制光标所在行到缓冲区
  • #yy:如6yy拷贝从光标所在的该行下数6文字
  • p将缓冲区内的字符贴到光标所在位置
替换
  • r替换光标所在处的字符
  • R替换光标所到之处的字符,直到按下Esc键为止
撤销上一次操作
  • u撤销上一次操作,按动多次u可执行多次撤销
更改
  • cw更改光标所在处的字字尾处
  • c#w:如c3w表示更改三个字
跳至指定行
  • Ctrl+g列出光标所在行的行号,百分比
  • #G:如15G表示移动光标到文章的第15行行首

压缩文件操作命令

Linux中打包文件一般是以.tar结尾,压缩文件一般是以.gz结尾,而一般情况下打包压缩是一起进行的,打包并压缩后的文件的后缀名一般.tar.gz

打包压缩
1
2
3
4
5
6
7
8
# 打包后,以gzip压缩 
tar -zcvf 打包压缩后的文件名 要打包压缩的文件
# 将多个文件压缩
tar -zcvf log.tar.gz log2022-01.log log2022-02.log
# 仅打包,不压缩
tar -cvf log.tar log2012.log
# 打包后,以bzip2压缩
tar -jcvf log.tar.bz2 log2012.log
解压缩
1
2
3
4
5
6
7
8
# 可将压缩档在任何地方解开
tar -zxvf /opt/soft/test/log.tar.gz
# 查阅tar包内的文件名称
tar -ztvf mytar.tar.gz
# 只将tar内的部分文件解压出来
tar -zxvf mytar.tar.gz log2022-01.log
# 将数据解压到特定目录
tar -zxvf mytar.tar.gz -C /data/test2

查找命令

find命令中的-a表示AND-o表示OR

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# 列出当前目录及子目录下所有文件和文件夹
find .
# 在/home目录下查找以.txt结尾的文件名
find /home -name '*.txt'
# 在/home目录下查找以.txt结尾的文件名,且忽略大小写
find /home -iname '*.txt'
# 当前目录及子目录下查找所有以.txt和.pdf结尾的文件
find . \( -name "*.txt" -o -name "*.pdf" \)
find . -name "*.txt" -o -name "*.pdf"
# 匹配文件路径或者文件
find /usr/ -path "*local*"
# 基于正则表达式匹配文件路径,-iregex忽略大小写,这里斜杠\表示转义
find . -regex ".*\(\.txt\|\.pdf\)$"
find . -iregex ".*\(\.txt\|\.pdf\)$"
# 找出/home下不是以.txt结尾的文件
find /home ! -name "*.txt"

# 根据文件类型进行搜索:f 普通文件,l 符号连接,d 目录,c 字符设备,b 块设备,s 套接字,p Fifo
find . -type f
# 基于目录深度搜索,搜索出深度距离当前目录向下最大深度限制为3的子目录的所有文件
find . -maxdepth 3 -type f
# 搜索出深度距离当前目录至少2个子目录的所有文件
find . -mindepth 2 -type f
# 删除匹配文件:删除当前目录下所有.txt文件
find . -type f -name "*.txt" -delete
# 查找当前目录或者子目录下所有.txt文件,但是跳过子目录sk
find . -path "./sk" -prune -o -name "*.txt" -print
# 要列出所有长度为零的文件
find . -empty
根据文件时间戳进行搜索

UNIX/Linux文件系统每个文件都有三种时间戳:

  • 访问时间-atime/天,-amin/分钟):用户最近一次访问时间。
  • 修改时间-mtime/天,-mmin/分钟):文件最后一次修改时间。
  • 变化时间-ctime/天,-cmin/分钟):文件数据元(例如权限等)最后一次修改时间。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
与时间有关的选项:共有-atime, -ctime 与 -mtime ,以-mtime为例
-mtime n :n为数字,意义为在n天之前的一天之内被更动过内容的文件
-mtime +n :列出在n天之前不含n天本身被更动过内容的文件档名
-mtime -n :列出在n天之内含n天本身被更动过内容的文件档名
-newer file :file为一个存在的文件,列出比file还要新的文件档名

# 24小时内有更动过内容的文件
find / -mtime 0
# 搜索最近七天内被访问过的所有文件
find . -type f -atime -7
# 搜索恰好在七天前被访问过的所有文件
find . -type f -atime 7
# 搜索超过七天内被访问过的所有文件
find . -type f -atime +7
# 搜索访问时间超过10分钟的所有文件
find . -type f -amin +10
# 找出比file.log修改时间更长的所有文件
ind . -type f -newer file.log
根据文件大小进行匹配

文件大小单元:

  • b:块(512字节)
  • c:字节
  • w:字(2字节)
  • k:千字节
  • M:兆字节
  • G:吉字节
1
2
3
4
5
6
7
8
9
选项与参数:
-size [+-]SIZE:搜寻比SIZE还要大(+)或小(-)的文件

# 搜索大于10KB的文件
find . -type f -size +10k
# 搜索小于10KB的文件
find . -type f -size -10k
# 搜索等于10KB的文件
find . -type f -size 10k
根据文件权限匹配
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
选项与参数:
-uid n :n为数字该数字是用户的账号ID,即UID记录在/etc/passwd中与账号名称对应的数字
-gid n :n为数字该数字是组名的ID,即GID记录在/etc/group中
-user name :name为使用者账号名称
-group name:name为组名
-nouser :寻找文件的拥有者不存在/etc/passwd的人
-nogroup :寻找文件的拥有群组不存在于/etc/group的文件

-perm mode :搜寻文件权限等于mode的文件,该mode为类似chmod的属性值,如-rwsr-xr-x的属性为4755
-perm -mode :搜寻文件权限必须要全部覆盖mode的权限的文件,如-rwxr--r--即0744的文件,使用-perm -0744当一个文件的权限为-rwsr-xr-x即4755时,也会被列出来因为-rwsr-xr-x的属性已经囊括了-rwxr--r--的属性了
-perm /mode :搜寻文件权限包含任一mode的权限的文件,如搜寻-rwxr-xr-x即-perm /755时,若文件属性为-rw-------也会被列出来,因为他有-rw....的属性存在


# 当前目录下搜索出权限为777的文件
find . -type f -perm 777
# 出当前目录下权限不是644的php文件
find . -type f -name "*.php" ! -perm 644
# 找出当前目录用户tom拥有的所有文件
find . -type f -user eleven
# 找出当前目录用户组sunk拥有的所有文件
find . -type f -group sunk

# 所有具有SUID权限的文件
find / -perm +4000 -print
借助-exec选项与其他命令结合使用

-exec后面的指令不支持别名

  • {}:代表由find找到的内容,find的结果会被放置到{}位置中
  • -exec-exec一直到\;关键词,代表find额外动作的开始-exec结束\;,在这中间的就是find指令内的额外动作
  • 因为分号;在bash环境下是有特殊意义的,因此利用反斜杠来规避
1
2
3
4
5
6
7
8
9
10
11
12
13
14
选项与参数:
-exec command :command为其他指令,-exec后面可再接额外的指令来处理搜寻到的结果
-print :将结果打印到屏幕上,这个动作是预设动作

# 找出当前目录下所有root的文件,并把所有权更改为用户tom,{}用于与-exec选项结合使用来匹配所有文件,然后会被替换为相应的文件名
find .-type f -user root -exec chown tom {} \;
# 找出家目录下所有的.txt文件并删除,-ok和-exec行为一样,不过它会给出提示,是否执行相应的操作
find $HOME/. -name "*.txt" -ok rm {} \;
# 查找当前目录下所有.txt文件并把他们拼接起来写入到all.txt文件中
find . -type f -name "*.txt" -exec cat {} \;> all.txt
# 将30天前的.log文件移动到old目录中
find . -type f -mtime +30 -name "*.log" -exec cp {} old \;
# 找出当前目录下所有.txt文件并以“File:文件名”的形式打印出来
find . -type f -name "*.txt" -exec printf "File: %s\n" {} \;

权限命令

操作系统中每个文件都拥有特定权限所属用户所属组,权限是操作系统用来限制资源访问的机制,在Linux中权限一般分为readablewritable执行excutable,且分为三组分别对应文件的属主owner属组group其他用户other,通过该机制来限制哪些用户哪些组可对特定的文件进行什么样的操作,通过ls -l命令可查看某个目录下文件目录的权限。

Linux中每个用户必须属于一个用户组,不能独立于用户组外,在Linux中每个文件所有者所在用户组其它组的概念:

  • 所有者文件的创建者,可以使用chown 用户名 文件名修改文件的所有者
  • 文件所在用户组:当某个用户创建了一个文件后,该文件所在组就是该用户所在的组
  • 其它组:除文件所有者所在用户组的用户外,系统的其它用户都是文件的其它组

权限名称 含义 文件可执行操作 目录可执行操作
r 可读,用数字4表示 可使用cat、tail等查看文件内容 查看目录下文件列表
w 可写,用数字2表示 修改文件内容 创建删除目录下文件
x 可执行,用数字1表示 可将其运行为二进制文件 可使用cd进入目录


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 修改aaa.txt文件的权限
chmod u=rwx,g=rw,o=r aaa.txt
chmod 764 aaa.txt
# 为属主、属组、其他组加上可执行权限,其中+x前面的a表示所有,即ugo
chmod a+x aaa.txt
# -R递归更改文件属组,在更改某个目录文件的属组时,且组名必须在/etc/group文件中存在
chgrp [-R] 属组名 文件名

# 更改文件属主,也可以同时更改文件属组
chown [–R] 属主名 文件名
chown [-R] 属主名:属组名 文件名
# 将文件所属用户改为elevenUser
chown elevenUser aaa.txt
# 将文件所属用户改为elevenUser,用户组改为root
chown elevenUser:root aaa.txt

# 修改文件所属用户组,将文件用户组改为elevenUser
chgrp elevenUser aaa.txt

第一列表示文件的类型和权限,第二列表示有多少文件名连接到此节点,第三列表示该文件或目录所属账号,第四列表示该文件所属用户组,第五列表示该文件大小单位默认为B,第六列为该文件创建日期或最近修改日期,第七列为该文件名

1
2
# 显示完整时间格式
ls -l --full-time

文件类型
  • d:代表目录
  • -:代表普通文件:纯文本文件、二进制文件、数据格式文件
  • l:代表链接,类似window中的快捷方式
  • bblock块设备文件,提供系统随机访问的接口设备,如硬盘、软盘;通常集中于/dev目录
  • c字符设备文件,串行端口设备,如键盘、鼠标等一次性读取设备;通常集中于/dev目录
  • s:套接字,被用于网络上的数据链接,通常在/var/run目录
  • p:管道FIFO,用于解决多个程序同时访问一个文件所造成的错误问题

文件与目录的权限含义

文件
  • r:可读取文件实际内容;
  • w:可编辑、新增、修改文件内容不包含删除文件);
  • x:该文件可被系统执行,Windows下文件是否具有执行能力是通过扩展名,linux下是通过是否具有x权限来决定
目录
  • r:可读取目录结构列表的权限,可查询目录下的文件名数据,可通过ls命令查询该目录下文件名列表
  • w:可修改目录结构列表的权限,新建文件与目录删除文件与目录(不论文件权限如何)、将已存在文件或目录重命名移动该目录内的文件或目录位置
  • x:可进入该目录,即可通过cd命令进入到该目录下

用户管理

Linux系统是一个多用户多任务分时操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这个账号的身份进入系统。用户的账号一方面可帮助系统管理员对使用系统的用户进行跟踪,并控制他们对系统资源的访问,另一方面也可帮助用户组织文件为用户提供安全性保护。用户的修改实际上就是对/etc/passwd文件的更新。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 添加用户账号eleven2,使用useradd指令所建立的帐号,实际上是保存在/etc/passwd文本文件中
useradd eleven2
# 删除用户账号eleven2
userdel eleven2
# 修改账号
usermod eleven3
# 修改或创建用户密码
passwd eleven3
# 显示用户账号密码
passwd -S eleven3
# 清除用户密码
passwd -d eleven3
# 切换登录用户
su - eleven3
# 查看用户信息
more /etc/passwd

每个用户都有一个用户组,系统可对一个用户组中的所有用户进行集中管理,不同Linux 系统对用户组的规定有所不同,如Linux下的用户属于与它同名的用户组,这个用户组在创建用户时同时创建。用户组的管理涉及用户组的添加删除修改增加删除修改实际上就是对/etc/group文件的更新。

1
2
3
4
5
6
# 添加用户组ele
groupadd ele
# 删除一个已有的用户组
groupdel ele
# 修改用户组属性
groupmod ele

默认权限

除了基本r, w, x权限外,在Linux传统的Ext2/Ext3/Ext4文件系统下还可设定其他的系统隐藏属性,这部份可使用chattr来设定,以lsattr来查看,最重要的属性就是可设定其不可修改的特性,让文件的拥有者都不能进行修改,该属性非常重要尤其是在安全机制中;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
chattr [+-=][ASacdistu] 文件或目录名称
选项与参数:
+ :增加某一个特殊参数,其他原本存在参数则不动
- :移除某一个特殊参数,其他原本存在参数则不动
= :设定一定,且仅有后面接的参数

A :设置了该属性,存取此文件或目录时,其访问时间atime将不会被修改,可避免I/O较慢的机器过度的存取磁盘
S :一般文件是异步写入磁盘的,若加上该属性,当进行任何文件的修改会同步写入磁盘中
a :设置该属性后文件将只能增加数据,而不能删除也不能修改数据,只有root才能设置该属性
c :设置该属性后将自动将此文件压缩,在读取时将会自动解压缩,但在储存时将会先进行压缩后再储存,对大文件有用
d :设置该属性后,当dump程序被执行时将可使该文件或目录不会被dump备份
i :可让一个文件不能被删除、改名、设置软硬链接且无法写入或新增数据,对于系统安全性有相当大的帮助,只有root能设置此属性
s :设置该属性后,若该文件被删除,将会被完全的移除出硬盘空间,若误删全无法救回来
u :与s属性相反,若该文件被删除,则数据内容其实还存在磁盘中

注意1:属性设定常见的是a与i的设定值,且很多设定值必须要身为root才能设定
注意2:xfs文件系统仅支持AadiS

lsattr [-adR] 文件或目录
选项与参数:
-a :将隐藏文件的属性也秀出来;
-d :若接的是目录,仅列出目录本身的属性而非目录内的文件名;
-R :连同子目录的数据也一并列出来

umask用于是指定当前用户创建文件或目录时的权限默认值,使用umask显示了4组数字第一组是特殊权限使用umask的分数指的是该默认值需要减掉的权限;若umask003,则创建的文件默认权限为-rw-rw-r--,创建的目录默认权限为drwxrwxr--

  • 创建文件则预设没有可执行x权限,即只有rw这两个项,即最大为666分,即-rw-rw-rw-
  • 若创建目录,则默认为所有权限均开放,即为777drwxrwxrwx
1
2
3
4
5
6
7
# 查看数字型态的权限设定值
umask
# 以符号类型的方式来显示出权限
umask -S

# 设置umask值
umask 002

特殊权限

s标志出现在文件拥有者x权限上时,就被称为Set UID简称为SUID的特殊权限,SUID的限制与功能:

  • SUID权限仅对二进制程序有效不能用在shell script,对目录无效
  • 执行者对于该程序需要具有x的可执行权限
  • 仅在执行该程序的过程中有效
  • 执行者将具有该程序拥有者owner的权限
1
2
3
4
5
6
7
ls -ld /tmp/ /usr/bin/passwd /usr/bin/cat
drwxrwxrwt. 12 root root 4096 12月 4 20:37 /tmp/
-rwxr-xr-x. 1 root root 54080 11月 17 2020 /usr/bin/cat
-rwsr-xr-x. 1 root root 27856 4月 1 2020 /usr/bin/passwd

ll -ld /etc/shadow
---------- 1 root root 1451 7月 31 2022 /etc/shadow

Linux系统中所有账号的密码都记录在/etc/shadow文件中,该文件的权限为---------- 1 root root,即该文件仅有root可读且仅有root可强制写入;一般账号使用者就是利用SUID的功能修改自己的密码的,一般用户对于/usr/bin/passwd这个程序来说是具有x权限即能执行passwd,passwd的拥有者是root这个账号,一般用户执行passwd过程中会暂时获得root的权限/etc/shadow就可以被一般用户所执行的passwd修改;若一般用户用cat读取/etc/shadow是不能读取的,因为cat不具有SUID的权限

1
2
3
ll /usr/bin/locate /var/lib/mlocate/mlocate.db
-rwx--s--x. 1 root slocate 40520 4月 11 2018 /usr/bin/locate
-rw-r----- 1 root slocate 15006568 12月 4 20:34 /var/lib/mlocate/mlocate.db

s标志文件拥有者xSUID,若s标志群组x时则称为Set GIDSGID,与SUID不同的是SGID可针对文件或目录来设定,若使用普通账号执行locate命令时,普通账号将会获得slocate组的权限,因此就能读取mlocate.db文件,针对文件:

  • SGID对二进制程序有用
  • 程序执行者对于该程序来说,需具备x的权限
  • 执行者在执行的过程中将会获得该程序群组的权限

用在目录上:

  • 用户若对于此目录具有rx的权限时,该用户能进入此目录
  • 用户在此目录下的有效群组将会变成该目录的群组
  • 若用户在此目录下具有w权限,则使用者所建立的新文件,该新文件的群组与此目录的群组相同

Sticky BitSBIT,只针对目录有效,当用户在该目录下创建文件或目录时仅自己与root有权限删除该文件,当用户于目录具有群组other身份,且拥有该目录w的权限,即该用户对该目录内任何人创建的目录或文件均可进行 删除、更名、移动等操作,若将目录加上SBIT的权限时,则用户只能够针对自己创建的文件或目录进行删除、更名、移动等操作,而无法删除他人的文件

  • 4SUID
  • 2SGID
  • 1SBIT
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
cd /tmp/
touch test

chmod 4755 test; ls -l test
-rwsr-xr-x 1 root root 0 12月 4 21:24 test

chmod 6755 test; ls -l test
-rwsr-sr-x 1 root root 0 12月 4 21:24 test

chmod 1755 test; ls -l test
-rwxr-xr-t 1 root root 0 12月 4 21:24 test
# 大写的ST表示权限为空
chmod 7666 test; ls -l test
-rwSrwSrwT 1 root root 0 12月 4 21:24 test

chmod u=rwxs,go=x test; ls -l test
-rws--x--x 1 root root 0 12月 4 21:24 test

chmod g+s,o+t test; ls -l test
-rws--s--t 1 root root 0 12月 4 21:24 test

查看文件类型

若想知道某个文件的基本数据类型,如是属于ASCII还是data文件或binary,且其中有没有使用到动态函式库share library等等的信息,可使用file指令来查询;

1
2
3
4
5
6
7
8
file ~/.bashrc 
/root/.bashrc: ASCII text

file /usr/bin/passwd
/usr/bin/passwd: setuid ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=dee1b9ab6618c6bfb84a14f85ba258c742cf4aec, stripped

file /var/lib/mlocate/mlocate.db
/var/lib/mlocate/mlocate.db: data

命令搜索

which预设是找PATH内所配置的目录

1
2
3
which [-a] command
选项或参数:
-a :将所有由PATH目录中可以找到的指令均列出,而不止第一个被找到的指令名称

通常find不很常用因为除了速度慢之外也很伤硬盘,一般都是先使用whereislocate来检查,若真的找不到才用find来搜索

1
2
3
4
5
6
7
whereis [-bmsu] 文件或目录名
选项与参数:
-l :列出 whereis 查询目录列表
-b :只找 binary 格式的文件
-m :只找在说明文件 manual 路径下的文件
-s :只找 source 来源文件
-u :搜寻不在上述三个项目当中的其他特殊文件

whereis之所以那么快,因为其值搜索特定的目录,并没有整个系统搜索,whereis主要针对/bin/sbin下的命令/usr/share/man下的man page文件;

1
2
3
4
5
6
7
locate [-ir] keyword
选项与参数:
-i :忽略大小写的差异;
-c :不输出档名,仅计算找到的文件数量
-l :仅输出几行的意思,例如输出五行则是 -l 5
-S :输出 locate 所使用的数据库文件的相关信息,包括该数据库纪录的文件/目录数量等
-r :后面可接正规表示法的显示方式

locate搜索的数据是由已建立的数据库/var/lib/mlocate中的数据所搜寻到的,不用直接去硬盘当中存取数据;数据库的建立默认是在每天执行一次;可通过updatedb命令手动更新locate数据库updatedb命令会去读取/etc/updatedb.conf配置文件的配置,然后再去硬盘中搜寻文件名,最后更新整个数据库文件,因为updatedb会去搜索硬盘当执行updatedb时,可能会等待数分钟的时间;

kill命令

1
kill -9 PID
1
2
3
4
5
6
7
HUP     1    终端断线
INT 2 中断(同 Ctrl + C)
QUIT 3 退出(同 Ctrl + \)
TERM 15 终止
KILL 9 强制终止
CONT 18 继续(与STOP相反, fg/bg命令)
STOP 19 暂停(同 Ctrl + Z)

其他命令

1
2
3
4
5
6
7
8
9
10
11
# 显示当前所在位置绝对路径
pwd
# 搜索文件aaa.txt中包含eleven的内容,且高亮显示,--color可省略
grep eleven aaa.txt --color
# 查看当前系统正在运行进程,两者的区别是展示格式不同
ps -ef
ps aux
# 立即关机
shutdown -h now
# 指定5分钟后关机,同时送出警告信息给登入用户
shutdown +5

链接命令

链接相当于快键方式修改原始文件,可通过软硬链接查看到最新内容

1
2
# 创建链接文件
ln -s [源文件] [目标文件]

硬链接软链接的区别,删除原始文件后软链接就不可用了,但硬链接依然正常,第二列表示链接数,第三列为文件所有者,第四列为文件所属组,第五列为文件大小,第六列为文件最后修改时间

网络通信命令

1
2
3
4
5
6
7
8
9
10
# 查看当前系统的网卡信息
ifconfig
# 查看与某台机器的连接情况
ping
# 查看当前系统的所有连接和端口
netstat -an
# 查看当前系统正在监听TCP(t)和UDP(u)的端口
netstat -tuln
# 查看网关
netstat -rn

设置全局变量

1
2
3
4
5
6
7
vim /etc/profile
# 通过冒号将新增环境变量拼接到原来的变量后面
PATH=$PATH:$JAVA_HOME/bin
# 通过export命令追加
export PATH JAVA_HOME CLASSPATH
# 使配置文件生效
source /etc/profile