1.Linux的文件系统层级结构标准(FHS)
Filesystem Hierarchy Standard(文件系统层级结构标准),多数的Linux版本采用这种文件组织形式,类似于Windows操作系统中c盘的文件目录,FHS采用树状结构组织文件,FHS定义了系统中每个区域的用途,所需要的最小构成的文件和目录。
其中部分常见如下:
/bin:所有用户可以使用的基本命令程序
/sbin:供系统管理使用的工具程序
/boot:引导加载器必须用到的各种静态文件:kernel,initramfs(initrd),grub等
/dev:存储特殊文件或设备文件:
设备有两种类型:字符设备:线性设备
块设备:随机设备
/etc:系统程序的配置文件,只能为静态
/home:普通用户的家目录的集中位置,一般每个普通的家目录默认为此目录下与用户同名的子目录
/lib:为系统启动后或根文件系统上的应用程序(/bin,/sbin等)提供共享库,以及为内核提供内核模块
/lib64:64位系统特有的存放64为共享库的路径
/media:便携式设备挂载点,cdrom,floppy
/mnt:其他文件系统的临时挂载点
/opt:附加应用程序的安装位置:可选路径
/root:管理员的家目录:可选路径
/srv:当前主机为服务提供的数据
/tmp:为那些会产生临时文件的程序提供的用于存储临时王文建的目录:可供所有用户执行写入操作:有特殊权限
/usr:全局共享的只读数据路径
/include:存放C程序头文件
/share:命令手册,自带文档等架构特有文件的存储位置
/local:让系统管理员安装本地应用程序,也通常用于安装第三方程序
/XllR6:X-windows程序的安装位置
/src:程序源码的存放位置
/var:存储经常会发生变化数据的目录
/proc:为内核进程存储相关信息,它们多是内核参数,例如net.ipv4.ip_forward,可虚拟化成net/ipv4/ip_forward,存储在/proc/sys中,因此完整路径为/proc/sys//net/ipv4/ip_forward
/sys:sysfs虚拟文件系统提供了一种比proc更为理想的访问内核数据的途径:其主要作用在于管理Linux设备提供可一种统一模型的接口
2.Linux系统上文件的类型
Linux系统上的文件类型:
-:常规文件,及f
d:directory,目录文件
b:block device,块设备文件,以'block'为单位,进行随机访问
c:character device,字符设备文件,支持以‘c’为单位,进行线性访问
major number:主设备号,用于标识设备类型,进而确定要加载的驱动程序
minor number:次设备号:用于标识统一类型中的不同的设备
l:sysmbolic link,符号链接文件
p: pipe,命令管道
s: socker,套接字文件
3.bash特性:命令补齐、查看用户,查看命令路径等
命令补齐:
shell程序在接收到用户执行命令的请求,分析完成之后,最左侧的字符会被当做命令。
命令处理机制:
查找内部命令:
根据PATH环境变量中设定的目录,自左向右逐个搜索目录下的文件名:
给定的打头字符串如果能唯一标识某命令程序文件,则直接补全
如果不能唯一标识某命令程序文件,再击一次tab键,会给出列表
路径补全:
根据给定的起始路径下:以对应路径下的打头字串来逐一匹配起始路径下的每个文件
tab:如果能唯一标识,直接补全
如果不能唯一标识,再次tab一次,给出列表
查看用户:who命令,w命令
who -show who is log on
who用法:
who [OPTIONS] ...
-b:系统此次启动时间
-d:print dead process
-u:显示登陆用户
-r:显示当前运行等级
w命令:
w -show who is logged on and what they are doing
查看命令路径:which命令
which -shows the full path of commands
which用法:
which [OPTION] programname [...]
--skip -alias:忽略别名
4.bash特性:别名alias、命令历史history
别名:alias
获取所有可用的别名定义:
~]#alias
定义别名:
~]#alias NAME='COMMAND' =>仅对当前shell进程有效
撤销别名:
~]#unalias NAME
命令历史:history,shell进程会保存此前用户提交执行的命令
~]#history
定制history的功能,可通过环境变量实现
HISTSIZE:命令历史的条数(默认1000)
HISTFILE:持久保持命令历史的文件:.bash_history
HISTFILESIZE:持久保持命令历史文件的条数
命令用法:
history [-c] [-d offset] [n]
history -anrw [filename]
history -psarg [arg...]
-c:清空命令历史
-d offset:清除指定行的命令历史
-r:从文件读取命令历史到命令列表中
-w:把历史列表中的命令追加到历史文件中
#:显示最近的#条命令
调用命令历史列表中的命令
!#:再一次执行历史列表中的第#条命令
!!:再一次执行上次命令
!STRING:再次执行命令历史列表中最近一个以STRING开头的命令
调用上一条命令的最后一个参数
快捷键:ESC .或者字符串: !$
控制命令历史的方式:
环境变量:HISTORY
ignoredups:忽略重复的命令
ignorespace:忽略空白符开头的命令
ignoreboth:以上两者同时生效
修改变量的值:
NAME='VALUE'
5.目录管理类命令讲解,mkdir,rmdir,tree
mkdir:创建目录
用法:mkdir [OPTION]... DIRECTORY...
注意:路径基名是命令的作用对象,基名前的目录名必须存在
-p:自动按需创建父目录
-v:显示详细过程
-m:直接给定权限
rmdir:用于删除空目录
用法:rmdir [OPTION].... DIRECTORY
-p:删除某目录后,如果其父目录为空,则一并删除
-v:显示过程
tree命令:树状结构来显示层级结构
tree [OPTIONS] [DIRECTORY]
-L level:显示层级
6.bash的基础特性:命令行展开,以及常用快捷键
命令行展开:
~:自动展开为用户的家目录,或指定用户的家目录
{ }:可承载一个以逗号分割的路径列表,并能够将其展开成多个路径
例如:/tmp/{a,b}相当于/tmp/a /tmp/b
常用快捷键:
ctrl + a:跳转至命令行首
ctrl + e: 跳转至命令行尾
ctrl + v:删除行首至光标所在之间的所有字符
ctrl +k:删除行尾至光标所在之间的所有字符
ctrl +l:清屏,相当于clear
7.bash特性:强引用,弱引用,命令引用,命令执行状态结果
强引用:' '
弱引用:" "
命令引用:` `
命令执行结果:
bash通过状态返回值来输出此结果
成功:0
失败:1-255
命令执行完成后,其返回值保存于bash的特殊变量$?中
命令正常执行时,有的还会有命令返回值
根据命令及其功能不同,结果各不相同
引用命令及其功能不同,结果各不相同:$(COMMAND)、`COMMAND`
8.文件常用命令cat、tac、more、less、head、tail、stat、touch
cat:concatenate,文本和文件的查看工具,将文件内容在屏幕上顺序显示
cat [OPTION]... [FILE]...
-n:给显示的文本行编号
-E:显示行结束符
tac:文本和文件的查看工具,将文件内容反序显示在屏幕上
tac [OPTION]... [FILE]...
-n:给显示的文本行编号
-E:显示行结束符
more:
more FILE
特点:翻屏至文件尾部自动退出
less:
less FILE
head:查看文件的前n行,默认为10行
-n #:查看文件的#行
-#:查看文件#行
-f:查看文件尾部内容,结束后不退出,跟随显示新追加内容
tail:查看文件的最后n行,默认为10行
-n #:查看文件的#行
-#:查看文件#行
-f:查看文件尾部内容,结束后不退出,跟随显示新追加内容
stat:
stat -display file or file system status
stat FILE...
时间戳:
最近访问:access time
最近更改:modify time
最近改动:change time
touch: -change file time stamps
touch [OPTIONS].. FILENAME
-c:指定文件路径不存在时,不创建
-a:仅修改最近访问时间
-m:仅修改最近更改时间
-t stamp:同时修改文件的访问和更改时间,但是改动时间与系统时钟同步
9.文件时间戳atime、ctime、mtime
atime:最近访问时间
ctime:最近改动时间(文件属性上的修改)
mtime:最近修改时间(内容上的修改)
10.文件管理工具:cp、mv、rm
cp:copy
cp用法:
单源复制:
cp [OPTION]...[-T] source DEST
多源复制:
cp [OPTION]... source... DIRECTORY
cp [OPTION]... -T DIRECTORY source...
单源复制:
如果DEST不存在:错误
如果DEST存在:
如果DEST是非目录文件:则会复制源文件覆盖目标文件
如果DEST是目录文件;则先在DEST目录下创建一个与源文件同名的文件,并复制其数据流
多源复制:
如果DEST不存在:错误
如果DEST存在:
如果DEST是非目录文件:错误
如果DEST是目录文件,分别复制每个文件至目录中,并保持原名
常用选项:
-i:交互式复制,即覆盖前提醒用户确认
-f:强制覆盖目标文件
-r:递归复制目标文件
-d:复制符号链接本身,而非其指向的源文件
-a: --DR --preserve =all
--preserv
mode:权限
ownership:属主属组
timestamps:时间戳
context:安全标签
xattr:扩展属性
links:符号链接
all:上述所有
mv:move
用法:
mv [OPTION]... [-T] source DEST
mv [OPTION]... source... DIRECTORY
mv [OPTION]... -t DIRECTORY SOURCE...
常用选项:
-i:交互式
-f:强制
rm:remove
rm [OPTION]... FILE...
常用选项:
-i:交互式
-f:强制
-r:recursive(递归)
注意:rm -rf /*是危险操作,建议所有用不到的文件不要直接删除,而是移动到某个专用的目录(充当回收站)
11.bash特性:本地变量、环境变量。局部变量、位置参数变量
变量类型:根据作用的范围划分
本地变量:作用域仅仅是当前shell
环境变量:当前shell及其子shell
局部变量:当前shell的某一代码片段
位置参数变量:当执行脚本的shell进程传递的参数
特殊变量:shell内置的有特殊功用的变量
12.Globbing文件匹配
bash的特性之一:文件名通配(整体文件名匹配)
匹配模式:元字符
*:匹配任意长度的任意字符;例:pa*、*pa*、*pa、*p*a*
?:匹配任意单个字符;例:pa?、p?a、?pa、p?a?、??pa
[]:匹配指定范围内的任意单个字符:不区分大小写
有几种特殊格式:
[a-z],[A-Z].[0,9],[a-z 0-9]
[[:upper:]]:所有大写字母
[[:lower:]]:所有小写字母
[[:alpha:]]:所有字母
[[:digit:]]:所有数字
[[:alnum:]]:所有字母和数字
[[:space:]]:所有空白符
[[:punct:]]:所有标点符号
[^]:匹配指定范围之外的任意单个字符:
例:[^[:upper:]]:除大写字母之外的任意字符
13.I/O重定向、输出重定向、错误输出重定向
I/O重定向:
程序:指令+数据化
可用的输入的设备:文件
键盘设备、文件系统的常规文件,网卡等
可用的输出设备:文件
显示器、文件系统上的常规文件,网卡等
程序的数据流有三种:
输出的数据流: <--标准输入(stdin),键盘
输出的数据流:-->标准输出(stdout),显示器
错误输出流:-->错误输出(stderr),显示器
fd:file descripter 文件描述件
标准输入:0
标准输出:1
错误输出:2
输出重定向:> 特性:覆盖输出
>> 特性:追加输出
其中#set -C 禁止做覆盖输出重定向已存在的文件 (仅对当前shell有效)、
可以使用强制重定向覆盖输出: >|
#set +C 关闭上述特性
错误输出重定向: 2> 2>>
合并正常输出流和错误输出流
1)&>,&>>
2) COMMAND > /PATH/TO/SOMEFILE 2>&1
3) COMMAND >> /PATH/TO/SOMEFILE 2>&1
输入重定向:<
tr命令:
语法:tr [ OPTION]... SET1[SET2]
把输出的数据当中的字符,凡是在SET1第一范围内出现的统统转换为SET2出现的字符
用法1:
tr SET1 SET2 < /path/to/somefie
用法2:
tr -d SET1 < /path/to/somefile
注意:不修改原文件
14.多命令执行管道
管道:连接程序实现将前一个命令的输出直接定向后一个程序当做输入数据流
tee命令:输出到屏幕并且保存
COMMAND | tee /PATH/TO/SOMEFILE
15.linux的用户、组、权限基础概念
multi-tasks,multi-user
每个使用者:
用户标识,密码
3A :
认证/Authentication
授权/Authorization
审计/Audition
组:用户组,用户容器
用户类别
用户标识:UserID,UID,16bits二进制数字,有效范围0-65535
管理员:0
普通用户:1-65535,CentOS来讲,一般只到6万
系统用户:1-499(CentOS6),1-999(CentOS7)
普通用户:500-60000(CentOS6),1000-60000(CentOS7)
用户解析:名称转换;
UserName<-->UID 根据名称解析库进行:/etc/passwd
组 :
组类别1:
管理员组:0
普通用户组:1-65535
系统用户组 :1-499(centos6)1-999(centos7)
登陆用户组:500-60000(centos6) 1000-60000(centos7)
组标识:GroupID,GID,16bits二进制数字,有效范围0-65535
名称解析 GroupName<-->GID 根据名称解析库进行:/etc/group
组类别2:
用户的主组/基本组
用户的附加组
组类别3
私有组:组名同用户名,且只包含一个用户
公共组:组内包含多个用户
Linux的文件权限主要针对三类对象:属主(u),属组(g),其他(o)
每个文件针对每类访问者都定义了三类权限:读r,写w,执行x,空-
16.用户认证、组认证机制以及常见加密算法详解
认证信息:
通过比对事先存储的,与登陆时提供的信息是否一致
密码存放文件:
用户密码:/etc/shadow
组密码:/etc/gshadow
密码的使用策略:
使用随机密码
最短长度不要低于8位
使用大写字母,小写字母,数据,标点四类字符中的最少三种
定期更换
加密算法:
对称加密:加密和解密使用同一个密钥
非对称加密:加密和解密使用一对儿密钥:共钥/pubic key,私钥/private key
单向加密:只能加密,不能解密;提取数据特征码
定长输出,无论源明文有多长
有雪崩效应,初始条件的微小变化将会导致结果的巨大改变
加密算法:
md5:消息摘要/Message Digest,5是版本号,定长输出128位
sha:安全哈希算法/secure hash algorithm,定长输出160位
sha224,sha256,sha384,sha512
echo "How are you?" | md5sum
echo "How are you?" | sha512sum
在计算之时,加salt,添加随机数,所以在shadow文件中,即使两个用户的密码一样,显示的字串也不一样,从而方式密码泄漏
因为加密不可逆,所以每次用户登陆时,系统都会对用户的输入进行加密,然后比较加密后的结果
17.用户信息库/etc/passwd,用户密码/etc/shadow,用户组/etc/group等
用户信息库文件的存储格式
/etc/passwd
name:password:UID:GID:GECOS:directory:shell
name:用户名
password:可以是加密后的密码,也可以是占位符x,(命令pwconv)
UID:用户id
GID:用户所属的主组的ID号
GECOS:注释信息等
directory:用户的家目录
shell:用户登陆时默认打开的shell
/etc/shadow
用户名:加密的密码:最后一次修改密码的时间:最短使用期限:最长使用期限:警告期限:过期期限:账号失效时间:保留字段
用户名
加密的密码:第一个$符号后面的数字表示加密算法,1表示md5,然后依次类推,第二个$符号后面表示添加的随机数,第三个$符号后面是真正的加密后的密码
最后一次更改密码的日期:相对时间计时法,从1970年1月1日到更改密码那一天所经历的天数;0表示用户在下次登陆的时候必须修改密码;空表示密码的年龄功能被禁用
最短使用期限:两次修改密码的最小间隔
最长使用期限:密码必须修改的时间间隔
警告期限:提醒用户修改密码的时间间隔
过期期限:最大年龄之后的宽限期
账号失效时间:自 1970 年 1 月 1 日以来的总天数作为账户的失效时间
保留字段
18.用户组管理命令groupadd,groupmod,groupdel
groupadd:添加组
groupadd [选项] group_name
-g GID:自定义GID,默认是上一个组的GID加1
-r:创建系统组
groupmod:修改组
groupmod [选项] group_name
-g GID:修改GID
-n New_Name:修改组名
groupdel:删除组
groupdel [选项] group_name
19.用户管理命令useradd,usermod,userdel
useradd:创建用户
useradd [选项] User_Name
-u/--uid UID:自定义UID,默认使用上一个用户的UID加1
-g/--gid Group:自定义基本组,此组必须事先存在,否则会出错;
-G/--groups Group1[,Group2...[,GroupN]]:指明用户所属的附加组,多个组之间用逗号分隔
-c/--comment Comment:指明注释信息
-d/--home home_dir:自定义用户家目录,家目录的创建过程是复制/etc/skel,然后重命名,指定的家目录路径如果事先存在,则不会为用户复制环境配置文件
-s/--shell Shell:指定用户的默认shell。可用的所有shell列表存储在/etc/shells文件
-r/--system:创建系统用户,创建用户时的诸多默认设定配置文件为 /etc/login.defs
useradd -D:用于显示创建用户的默认配置
useadd -D 选项:修改默认选项的值
修改的结果保存于/etc/default/useradd文件中,也可以直接编辑此文件
usermod:修改用户属性
-u/--uid UID:修改用户的UID
-g/--group Group:修改用户的基本组,这个组事先必须存在
-G/--groups Group1[,Group2...[,GroupN]]:修改用户的附加组,原来的附加组会被覆盖
-a/--append:追加附加组,和-G一起使用
-c/--comment Comment:修改注释信息
-d/--home home_dir:修改用户家目录,用户原有的文件不会被转移至新位置
-m/--move-home:移动家目录到新位置,只有与-d结合使用才有效
-l/--login New_Name:修改用户名
-s/--shell Shell:修改用户的默认shell
-L/--lock:锁定用户密码,禁止用户登陆,即在用户原来的密码字符串之前添加一个“!”
-U/--unlock:解锁用户密码
userdel:删除用户
userdel [选项] User_Name
-r:删除用户时,一并删除其家目录,默认不删除
20.用户认证及组认证机制及passwd,gpasswd,newgrp,chage
passwd:修改密码
单独使用表示修改用户自己的密码
passwd UserName:修改指定用户的密码,默认情况下,仅root用户有此权限。root用户修改别人密码的时候,不需要知道原密码。
-l/-u:锁定和解锁用户
-d:清除用户密码
-e Date:过期期限,日期
-i Days:非活动期限,密码过期以后还能活动几天
-n Days:修改密码的最小间隔
-x Days:修改密码的最长使用期限
-w Days:警告期限
echo "PASSWORD" | passwd --stdin docker,在脚本中通常如此使用
gpasswd:修改组密码,或者添加删除用户
gpasswd [OPTION] group
-a UserName:向组中添加用户,用户将以此组为附加组
-d UserName:从组中移除用户,用户将不再以此组为附加组
给组添加密码的作用
如果组没有密码,其他人无法把主组切换为此组
如果组有密码,如果其他人的附加组包括该组,切换过来不需要密码
如果组有密码,如果其他人的附加组不包括该组,切换过来需要密码
设置密码的方法是:gpasswd GroupName,之后便会提示输入两次密码
newgrp:临时切换指定的组为基本组
-:加横行表示模拟用户重新登陆,重新初始化其工作环境
exit退出
chage:修改密码的过期信息,选项和上面一样
语法:chage [OPTION] NAME
21.id及su切换用户详解
id:显示用户的真实和有效ID信息
直接用表示显示自己的
id UserName:显示别人的
-u:仅显示有效的UID
-g:仅显示基本组id,不显示附加组的
-G:显示所有组的,基本组和附加组
-n:显示名字而非Id,可以和上面的选项结合使用
su:switch user/切换用户
登陆式切换/完全切换:仿佛重新登陆,重新初始化用户的工作环境
su - UserName或者su -l UserName
非登录式切换/半切换:不会重新初始化用户的工作环境,
su UserName
root用户切换至其它任何用户不需要密码,非root用户需要给出目标用户的密码
-c:不切换用户,仅以用户身份执行命令,
例如:su - docker -c 'whoami'
其他几个命令
chsh:修改shell
chfn:修改用户信息
finger:显示用户信息
whoami:显示自身用户名
pwck:检查用户认证文件的内容和格式的完整性
grpck:检查组文件内容和格式的完整性
22.进程安全上下文及用户和权限应用管理模型
ls -l:rwxrwxrwx
左三位:属主权限
中三位:属组权限
右三位:其它权限
进程安全上下文
进程对文件的访问权限应用模型:
检查进程的属主与文件的属主是否相同。如果相同,则应用属主权限(左三位)。
否则,检查进程的属主是否属于文件的属组。如果属于,则应用属组权限(中三位)。
否则,则应用其它权限(右三位)。
权限:
r:readable,读
w:writable,写
x:executable,执行
23.Linux文件权限rwx及文件属性
文件:
r:可获取文件的数据
w:可修改文件的数据
x:可将此文件运行为进程,文件内部需要写指令
目录:
r:可使用ls命令获取其下的所有文件列表
w:可修改此目录下的文件列表,即创建或者删除文件
x:可cd至此目录中,并且可以使用ls -l命令
注意:
目录的读权限仅允许我们读目录,获得在该目录中所有文件名的列表,但无法查看目录中文件的内容
目录的执行权限不允许我们读取目录的文件列表,但可以查看目录中文件的内容。当一个目录是我们要访问文件的路径名的一个组成部分时,对该目录的执行权限使我们可通过该目录
要修改目录中的文件内容,不仅仅需要目录的写权限,还需要目录的执行权限
cp一个目录中的文件需要对目录具有执行权限
24.Linux文件权限表示法:赋权表示、授权表示、数值表示法
赋权表示:直接操作一类用户的所有权限位
其表现形式如下:
u=
o=
g=
a=
授权表示:直接操作一类用户的一位权限位
其表现形式如下
u+,u-
g+,g-
o+,o-
a+,a-
数值表示:直接操作所有用户的所有权限位
其中权限组合
---:000 0
--x:001 1
-w-:010 2
-wx:011 3
r--:100 4
r-x:101 5
rw-:110 6
rwx:111 7
其表现形式如下:
774,660,544
25.Linux文件权限管理命令:chmod,chown,chgrp
chmod
语法:chmod [OPTION]... MODE[,MODE]... FILE
chmod [OPTION]... OCTAL-MODE FILE
chmid [OPTION]... --reference=RFILE FILE...
选项
-R/--recursive:对于目录来说,如果不加-R则只修改目录本身的权限。
注意:用户仅能修改那些属主为自己的那些文件的权限
chown:修改属主和属组
语法:chown [OPTION]../ [owner][:[Group]] FILE
chown [OPTION]... --reference=RFILE FILE...
-R:递归修改,例如:chown -R docker /tmp/skel
:号用来分隔属主和属组,例如:chown docker:mygrp /tmp/skel。也可以使用“.”
--reference,例如:chown --reference=/tmp/moosefs /tmp/skel
chgrp:修改属组,等于chown :group FileName。用法和chown一样
注意:仅管理员可以修改文件的属主和属组
26.Linux文件权限反向掩码umask
umask:文件权限的反向掩码,遮罩码。创建时:
文件:666-umask
目录:777-umask
注:之所以文件用666去减,表示文件默认不能拥有执行权限,如果减得的结果中有执行权限,则需要将其加1
umask命令:
单独使用,用来查看umask的值,默认值是022
umask MASK:用来设置umask,但是仅对当前的shell进程有效