一、作业(练习)内容:
1、总结文本编辑工具vim的使用方法;
Vim
(1).命令解释:模式化的编辑器
(2). 有多种不同的模式:
编辑模式:命令模式
输入模式:插入模式
末行模式:vim有许多内置命令,此模式作为命令的接口
编辑模式=====输入模式:
i:在当前光标所在处,转换为输入模式
I:在当前光标行行首,转换为输入模式
a:在当前光标所在处的后方,转换为输入模式
A:在当前光标所在行的行尾转换为输入模式
o:在当前光标所在行的下方新建一个空白行,并转换为输入模式
O:在当前光标所在行的上方新建一个空白行,并转换为输入模式
输入模式=====>编辑模式:ESC
编辑模式====>末行模式:“:”
末行模式====>编辑模式:ESC
(3).退出vim
末行模式:
q! 强制退出,不保存编辑的内容退出
wq 保存退出
x 保存退出
xq! x! 强制保存退出
编辑模式:
ZZ 保存退出
(4).编辑命令
光标移动:
字符间移动:
h:光标向左移动
l:光标向右移动
k:光标向上移动
j:光标向下移动
单词间移动:
w:移动到下一个单词的词首
e:移动到下一个单词的词尾
b:当前或者前一个单词的词首
#:一次跳n个单词
行首行尾间跳转:
0:跳转至非tab字符上绝对行首
^: 跳转至第一个非空白字符
$: 跳转至绝对行尾
句子间跳转:
):跳转到下一个句子的句首
(:跳转到前一个句子的句首
段落间移动:
}: 跳转到下一个段落
{: 跳转到上一个段落
行间快速移动:
#G #表示想要跳转的行数
G:文章尾部
1G:文章首部
末行模式:n 跳转至n行
编辑操作:
x:删除光标所在处的字符
#x:删除光标所在处以及向后的#个字符
r: 替换光标所在处的字符
d:删除命令:
dd:删除光标所在行 #dd:删除光标所在行以及下行的共#行:
与跳转命令一同使用
d$:删除光标所在处至行尾的内容; D:相同
d^:删除光标所在处至行行首的内容
dw,de,db:这3个命令支持前面使用#来指明涵盖的单词个数
p:粘贴:
行级别:
p:粘贴在光标所在行下方
P:粘贴在光标所在行上方
y:复制
yy:复制光标所在行 Y:复制一整行
#yy:复制光标所在行以及下行共#行
d$:复制光标所在处至行尾的内容
d^:复制光标所在处至行行首的内容
yw,ye,yb:这3个命令支持前面使用#来指明涵盖的单词个数
c:修改
cc:删除光标所在行整行内容,并立即转为输入模式
#cc:
c$,C,c^,c0,cw,cb,ce
撤销操作:
u:撤销
#u:撤销#次操作
取消上一次操作:
Ctrl+r
重复前一次命令
(5).可视化模式:
v:选择光标所在行光标左侧的内容
V:选择光标所在行向有右侧的内容
(6).编辑模式下的翻屏命令
Ctrl+f:向文件尾部翻一屏
Ctrl+b:向文件首部翻一屏
Ctrl+d:向文件尾部翻半屏
Ctrl+u:向文件首部翻半屏
(7).文本查找
/PATTERN
?PATTERN
n:向文本尾部查找
N:向文本首部查找
(8).文本替换
末行模式:内置命令接口,有命令历史记录功能
有部分内置命令用于编辑操作,此时可使用地址定界法进行
地址定界:
Startline[,endline]
#:第#行
.:当前行
$:最后一行
%:全文
相对定界:
+#:从指定位置向下#个行
-#:从指定位置向上#个行
文本替换命令:s
s/要查找的内容/替换为的内容/修饰符
/:分隔符,用于分割“查找的内容”和“替换为的内容”:此分隔符可使用 其他字符,如@,#等:
要查找的内容:可使用正则表达式:此部分可以后面“替换为的内容”部分 中使用“&”全部引用:
替换为的内容:不可使用正则表达式,一般为正常文本,但可以使用正则表
修饰符:
i:查找时不区分字符大小写
g:global,全局替换;
(9).多文件模式:
打开文件:
vim [OPTION]...[FILE]...
+#:快速定位至#行
+/PATTERN 快速定位至被模式第一次匹配至行
多文件:
vim FILE1 FILE2 FILE3...
末行模式:
:next 下一个
:prev 上一个
:last 最后一个
:first 第一个
退出所有文件:
wqall 保存所有并退出
wall 保存所有
qall 退出所有
多窗口:
-o 水平分割窗口 ctrl+s 水平分割文档
-O 垂直分割窗口 ctrl+v 垂直分割文档
(10).界面特性
开启关闭行显示:
Set nu
Set nonu
开启语法高亮功能:
synatx (on|off)
开启搜索高亮功能:
set hlsearch
set nohlsearch
开启自动缩进功能:
set autoindent:set ai
set noautoindent: set noai
字符大小写是否区分功能:
set ignorecase: set ic
Set noignorecase: set noic
(11).配置文件
全局:/etc/vimrc
个人:~/.vimrc
2、总结文件查找命令find的使用方法;
find
(1).命令解释:
通过遍历指定的目标目录,实施查找符合条件指定属性的文件
(2)命令语法:
find[OPTIONS] [查找路径][查找条件][处理动作]
查找路径:默认为当前路径
查找条件:默认为指定路径下的所有文件
处理动作:默认为打印至屏幕
查找条件:
-name: “文件名”:文件名支持使用globbing
-iname: “文件名”不区分大小写
-user:根据属主查找
-group:根据属组查找
-uid:根据uid号来查找
-gid:根据gid号来查找
-nouser:查找没有属主的文件
-nogroup:查找没有属组的文件
组合查找:
与 -a (找出/tmp目录下属主有写权限,并且是root的文件:
或 -o (找出/tmp目录下名字包含123的文件,或者uid是600的文件
非 -not (找出/tmp目录下既不属于root用户,并且也不属于hzm用户的文件
非A或非B = 非(A且B)
非A 且非B = 非(A或B)
查找条件:
根据类型查找:
-type:
f:普通文件
d:目录文件
l:符号连接
b:块设备
c:字符设备文件
p:命名管道文件
s:套接字文件
根据文件大小查找:
-size:+|-
常用单位有:k,M,G
#:#-1< x <= # 实例:2k: 结果:1.8k ,1.9k ,1.1k都符合
+: x > # 实例:+2k:结果:2.1k,3.1k都符合 2k不符合
-: x <= #-1 实例:-2k:结果:1k,0.9k都符合
根据时间查找:
以“天”为单位:
-atime:[+|-] :访问时间:
#:#- < x < #+1 表示#+1天的时间段被访问过的文件
-#:x < # 表示#天之内的被访问过的文件
+#: x >= #+1 表示#+1天之外被访问过的文件
-mtime: [+|-] :修改时间
-ctime: [+|-] :改变时间
以“分钟”为单位:
-amin:[+|-]
-mmin: [+|-]
-cmin: [+|-]
实例:查找/tmp下5分钟以内被访问过的文件:
以“权限”为单位:
-perm:[+|-]mode
mode::精确匹配
+mode:满足任何一类用户的任何以为权限即可 +或关系
-mode:每类用户的任何一位都需匹配 -且关系
所有都没有 相反:至少有一个有
所有都有 相反:至少有一个没有
实例:查找/tmp下包含666权限的文件,或者是精确匹配666的文件
3、总结bash环境变量的相关内容;
总结Bash变量的类型:
本地变量:只对当前shell进程有效的变量,对其他shell进程无效,包括当前shell进程的子进程。 VAR_NAME=VALUE
变量赋值:向变量的存储空间保存数据
变量引用:${VAR_NAME}
“”:弱引用,里面的变量会被替换
‘’:强引用,里面的所有祖父都是字面量,直接输出
环境变量:对当前shell进程及其子shell有效,对其他shell进程无效。
定义环境变量: export VAR_NAME=VALUE
导出: export VAR_NAME
撤销变量:unset VAR_NAME
局部变量:对shell脚本中某代码片段有效,通常用于函数本地:
Loacl export VAR_NAME=VALUE
位置变量:$1,$2,....${10}
特殊变量:$?
查看当前shell进程中的所有变量:set
查看当前shell进程中的所有环境变量:export,printenv,env
变量命名规则:
1.不能使用程序中的关键字(保留字) if,case,for
2.只能使用数字,字母和下划线,且不能以数字开头
3.要见名之意
变量类型:
数值型:
精确数值:整数
近似数值:浮点型
单精度浮点
双精度浮点
字符型:
char
string
布尔型:
ture,false
类型转换:
显式转换
隐式转换
bash是弱类型的语言,一切皆字符
配置文件,生效范围划分,存在两类:
Profile类:为交互式登陆的用户提供配置:
全局配置: /etc/profile, /etc/profile.d/*.sh
个人配置: ~/.bash_profile
功用:1.设定环境变量
2.运行命令或脚本
bashrc类:为非交互式登陆的用户提供配置:
全局配置: /etc/bashrc
个人配置: ~/.bashrc
功用:1.设定本地变量
2.定义本地别名
登录类型:
交互式:直接通过终端输入账号和密码登陆
使用su -l username 或 su - username
非交互式:su username
图形界面下打开的终端
交互登录用户:
/etc /profile --> /etc/profile.d/*.sh --> ~/.bash_profile --> ~/.bashrc --> /etc/bashrc
非交互式登陆用户:
~/.bashrc --> /etc/bashrc --> /etc/profile.d/*.sh
4、总结Linux文件系统上的特殊权限(SUID、SGID、Sticky)的知识点;
特殊权限:suid
展示于文件属主的执行权限位
如果属主本来有执行权限,显示为s,否则为S;
功能:对一个可执行文件来讲,任何用户运行此程序为进程时,进程的属主不在是发起者本人,而是可执行程序文件自己的属主。
管理文件suid权限的方法:
Chmod u+|-s FILE
特殊权限:sgid
展示文件属组的执行权限为;
如果属主本来有执行权限,则展示为s,否则为S;
功能:当目录的属组有写权限,且有sgid权限时,那么所有属于次此目录的属组,且以属组身份在此目录文件或目录时,新文件或目录的属组不是创建者所属的基本组,而是目录自己的属组;
Chmod g+|-s
特殊权限:stick
展示于目录其他用户的执行权限位
如果其他用户本来有执行权限,则展示为t,否则,展示位T
功能:对于全局可写,或某组全局可写目录,所有用户都于此目录创建文件或删除自己为属主的那些文件,但不能删除非自己为属主文件或目录:
Chmod o+|-t
5、总结Linux磁盘管理、文件系统相关知识点及其相关命令的使用方法;
磁盘设备文件:
IDE接口:并行,133MB/s /dev/hda,/dev/hdb
Scsi接口:并行,320MB/s
SATA接口:串行,6Gpbs
Usb接口:串行,480MB/s
SAS接口:串行
设备文件:/dev/sd[a-z][#]
链接文件:访问同一个文件数据,不同路径
硬链接:两个文件路径指向了同一个inode。
创建方法:cp -l SRC DEST
ln SRC DEST
特性: 1)目录不支持硬链接;
2)链接不能跨文件系统;
3)硬链接文件与源文件是指向同一个inode,创建硬链接文件只会增加
inode计数;删除硬链接只会减少一次;
符号连接:链接文件是一个完全独立的新文件,但其指向了原文件的访问路径;
创建方法:ln -s SRC DEST
特性:(1)符号链接文件与原文件是两个各自独立的文件;
(2)目录可以创建符号链接;
(3)可以跨文件系统;
(4)删除链接不影响原文件,但删除原文件,符号链接指向的路径不存在,因此,此时链接文件变成错误链接;其大小不是真正原文件大小,而是指向的原文件的文件路径字符串所包含的字节数;
磁盘设备:
MBR:用来存放当前分区表 。(主引导扇区)
446bytes:bootloader
64bytes:分区表
16bytes:标记一个分区:4个主分区:3主分区,1个扩展分区
2bytes:55AA,当前MBR信息是否有效的标记
VFS:virtual file system
Linux文件系统:ext2,ext3,ext4,xfs,btrfs
日志文件系统:加速文件检测并修复过程
光盘文件系统:iso9660
网络文件系统:nfs,cifs
集群文件系统:gfs2,ocfs2
分布式文件系统:ceph
Windows文件系统:ntfs,vfat
伪文件系统:tmpfs
Swap:虚拟文件系统
创建文件系统:
文件系统:
元数据:每个索引项称一个inode
根在内核中,其需要被关联制根文件系统,即rootfs
创建分区:
fdisk命令:查看已经识别的磁盘设备
P:显示当前分区表
N:创建一个分区
W:保存退出
L:查看支持的分区ID:
D:删除现有分区
T:修改分区ID
Q:不保存退出
M:显示帮助信息
分区流程:fdisk /dev/sd* ---> n新建 ---> (e扩展)|(p主分区) --->柱面或者分区大小 --->P 查看是否成功 ---> cat /proc/partitions 查看内核是否识别 --->如果未识别让内核强制读取分区表(partx -a /dev/sd*)
文件系统管理工具:
创建文件系统:
mkfs.ext2 mkfs.ext3 mkfs.ext4,mkfs.xfs
检测文件系统:
fsck.ext2,fsck.ext3,fsck.ext4,fsck.xfs
查看其属性:
dumpe2fs,tune2fs
创建文件系统:
mkfs.FSTYPE /dev/DEVICE
blkid /dev/DEVICE
ext系列:
mke2fs
mke2fs:mke2fs[OPTION].../dev/DEVICE
-t :[ext2|ext3|ext4]:要创建的文件系统类型;
-b :[1024|2048|4096]:上限由page fram决定;
-L: label:卷标;
-j: 相当于 -t ext3 将文件系统格式化为日志文件系统;
mkfs.ext3 = mkfs -t ext3 = mke2fs -t ext3
-i#:指定inode与字节的比率;没多少个字节给创建一个inode;
-N#:直接知名给此文件系统创建多少个inode;
-m#:指定预留空间的百分比,默认为5;
-O :指明额外选项
UUID:全局唯一标识符
e2label /dev/DEVICE:修改卷标
tune2fs:查看或者修改ext系列文件系统某些属性
tune2fs -l /dev/DEVICE
修改指定文件属性:
-L:修改卷标
-m#:调整预留空间百分比
-O[^]FEATURE:开启或关闭某种特性
-o[^]mount_options:开启或关闭某种属性
-o acl
-o ^acl
dumpefs:显示ext系列文件系统属性信息
dumpe2fs [-h] /dev/DEVICE
文件系统检测:
因进程意外终止或系统崩溃等原因导致写入操作非正常终止时,可能会导致文件损坏,此时应该修复系统。
fsck:
-t:fsck -t ext4 /dev/sdb1
-a:自动修复所有错误
-r:交互式修复错误
ext系列文件系统的专用工具
e2fsck:
-y:对所有问题自动修复yes;
-f:强制检测
Windows无法识别linux上专用的文件系统,因此,有存储设备需要两种系统之间交叉使用,应该使用Windows文件系统。
swap文件系统:
Linux上 创建交换分区必须使用独立的磁盘分区
fdisk /dev/DEVICE
t命令调整id:82
创建交换分区系统:mkswap
mkswap[-L] /dev/DEVICE
文件系统挂载:
Linux系统上,所有文件系统必须通过根文件系统的某个分区来访问;
其余所有的其他文件系统如果想要被访问,都只能通过关联至根文件系统上的某个目录来实现;
mount:mount DEVICE MOUNT_POINT
mount[option]...[-t fstype][-o option] device mount_point
-r:只读挂载
-w:读写挂载
-t:fstype 被挂载的设备上的文件系统类型:可省略 此时mount会自动使用blkid来判断
-L:以卷标的方式指定要挂载的设备,因此,DEVICE可省
-U:以UUID的方式指定要挂载的设备,因此,DEVICE可省
-n:默认情况下,设备挂载与否的改变结果会被保存于/etc/mtab中,-n选项用于变动时不更新此文件。
-o:option 挂载选项
async:异步写入
sync:同步写入
atmin/noatime:文件或目录在被访问时是更新访问时间戳
diratime/nodiratime:文件或目录在被访问时是更新访问时间戳
auto/noauto:设备是否支持mount-a选相时是否自动挂载
dev/nodev:此设备上是否创建设备文件
exec/noexec:是否允许执行此文件系统上的程序文件
suid/nosuid:是否支持此设备上的文件使用suid权限
remount:重新挂载
acl:mount -o or tune2fs -o acl /dev/device
ro:只读
rw:读写
user/nouser:是否允许普通挂载此文件系统
defaults
mount -a 自动读取fstab中每一个支持自动挂载的文件系统并把其挂载至每一个挂载目录下。
另外一个技巧:
将某目录绑定到指定目录下,作为临时访问入口
mount --bind 源目录 目标目录
查看所有已经挂载设备的方法:
#mount
#cat /etc/mtab
#cat /proc/mounts
挂载点
1.事先存在
2.使用别的进程未使用的目录
umont MOUNT_POINT
某进程访问的设备不能卸载,查看方法:
lsof 挂载目录
fuser -v:挂载目录
-k: fuser -km 挂载目录:强制杀掉访问挂载目录的进程
df:用来检查linux服务器的文件系统的磁盘空间占用情况
[OPTINE]...[FILE]
-l:仅显示本地文件系统的相关系统
-h:单位换算
-i:显示indoe的使用情况
du:用于评估文件大小
-s:统计整个目录以及内部所有文件总体大小
-h:单位换算
du -sh/*
free:查看内存使用状况
-m
-g
交换分区:创建交换分区:mkswap
swapon -a 启用/etc/fstab文件中定义的所有交换分区
启用:swapon /dev/sd*
禁用:swapoff /dev/sd*
文件系统相关配置文件:/etc/fstab
定义开机自动挂载的文件系统;
第一列:挂载设备:设备文件,卷标,uuid,伪文件系统
第二列:挂载点:swap挂载点仍为swap
第三列:文件系统类型
第四列:挂在选项:defaults表示默认挂载选项,多个挂载选项用,分割。比如defaults,acl,noatime
第五列:转储频率:0:从不备份,1:每天备份,2:每隔一天备份
第六列:自检次序:0:不自检,1:首先自检,只有根文件系统可首先自检,2:次级自检。
6、复制/etc/grub.cfg配置文件至/tmp目录,用查找替换命令删除/tmp/grub.cfg文件中的行首的空白字符;
%s/^[[:space:]]\+//g
7、复制/etc/rc.d/init.d/functions文件至/tmp目录,用查找替换命令为/tmp/functions的每行开头为空白字符的行的行首加一个#; 原有空白字符保留;
%s/^[[:space:]]/#&/g
8、替换/tmp/functions文件中的/etc/sysconfig/init为/var/log;
%[email protected]/etc/sysconfig/[email protected]/var/log/g
%s/\/etc\/sysconfig\/init/\/var\/log/g
9、删除/tmp/functions文件中所以#开头,且#后面至少跟了一个空白字符的行的行首#;
%s/^#[[:space:]]\+//g
10、查找/var目录属主为root,且属组为mail的所有文件;
find /var -user root -a -group mail -ls
11、查找/usr目录下不属于root、bin或hadoop的所有文件;
find /usr -not -user root -a -not -user bin -a -not -user hadoop
Find /usr -not \( -user root -o -user bin -o -user hadoop \)
12、查找/etc目录下最近一周内其内容修改过,且属主不为root或hadoop的所有文件;
find /etc -not \( -user root -o -user hadoop \) -a -mtime -7
13、查找当前系统上没有属主或属组,且最近一周内曾被访问过的所有文件;
find / -not \( -nouser -a -nogroup \) -a -atime -7
14、查找/etc目录下大于20k且类型为普通谁的的所有文件;
find /etc -size +20k -a type f
15、查找/etc目录下所有用户都没有写权限的文件;
find /etc -not -perm +222
16、查找/etc目录下至少有一类用户没有执行权限的文件;
find /etc -not -perm -111
17、查找/etc/init.d目录下,所有用户都有执行权限,且其它用户拥有写权限的文件;
find /etc/init.d -perm -113
18、让普通用户能使用/tmp/cat去查看/etc/shadow文件;
(1)当前用户为hzm查看/etc/shadow文件没有权限,无法访问。
(2)切换到root账户下将cat程序给予s权限;
chmod u+s /bin/cat
(3)在切换回hzm账户来访问/etc/shadow文件就不受限制了;
19、创建目录/test/data,让某组内普通用户对其有写权限,且创建的所有文件的属组为目录所属的组;此外,每个用户仅能删除自己的文件;
(1)新建hzm和gley两个用户,附加组都为testgroup,并且创建/test/data目录也加入到testgroup组中;
useradd -a -G testgroup hzm
useradd -a -G testgroup gley
mkdir /test/data
chown :testgroup /test/data
(2)登陆hzm用户,在/test/data目录下创建一个hzm.txt文件,登陆gley用户,在/test/data目录下创建一个gley.test文件
hzm:touch hzm.txt /test/data
gley:touch gley.txt /test/data
(3)然后给于该目录gid权限后,在切换两个用户各自创建.word文件,这样就能看到.word创建的文件所属组都是testgroup组。
chmod g+s /test/data
hzm:touch hzm.word /test/data
gley:touch gley.word /test/data
(4)然后在给与改目录sticky权限,这样用户只能删除自己创建的所属文件;
chmod o+t /test/data