第一部分 VIM
文本编辑器只针对ASCII码,字处理器
1、种类:
简单编辑器 nano:是全屏模式
vi:visual interface 全屏文本编辑器,模式化的编辑器
VIM是vi的增强版本有高量、语法着色显示等功能
2、VI工作模式
编辑模式:VI默认工作模式(也称为命令模式)
输入模式:输入字符内容
末行模式:在屏幕最后一行,可以编辑文件和其它额外操作。内嵌命令行接口 以
冒号" : "可输入命令
工作模式切换
编辑模式----> 输入模式用以下快捷键
小写i insert光标前插入
大写I 当前光标所在行首插入
小写a append 当前光标后
大写A 当前光标所在行尾插入
小写o 新行,当前光标所在行下一行新建一行
大写O 当前光标上一行接入新行
大写L 最后一行行首
输入模式---->返回编辑模式 esc键
编辑模式--->末行模式 ,冒号 : 可输入相关命令
末行模式----》编辑模式 一次esc 2-3秒延时 二次esc快速
无法直接从编辑进行末行模式 ,需要先使用esc退出
3、编辑操作
A:打开文件定位光标类
#VIM /path/to/somefile 要求文件前的目录存在,如果文件不存在将新建文件
vim [options] [file ..]
vim [options] -
vim [options] -t tag
vim [options] -q [errorfile]
+# :#号为行号 vi +10 bash1.txt 表示编辑bash1的第10行
+/PATTENR : 定位到第一次匹配的行首 vim +/UUID /etc/fstab
+ 表示最后一行行首
B:退出、关闭文件类
一般在编辑和模式下进行
末行模式 w为保存 q为退出(不保存模式)
:q 退出
:q! 强行不保存退出
:wq 保存退出
:w! 管理员强行保存
:x 保存退出
编辑模式:
ctrl+ZZ 保存并退出
C:光标跳转类
字符间跳转
h 左一个字符 l 右一个字符
j 向下一行(与上行字符所在光标位置对齐)
K向上一行 (与上行字符所在光标位置对齐)
#jklh 移动#个字符可加数据3k,6j等 ,一次跳转n个字符或几行
单词跳转
备注:(不包括特殊字符,字母与数字),连续的字符示为一个单词
w 后单词词首 e 当前或后一个单词词尾 b 前一个单词词首
以上支持与数据结合3#
示例:#W 3W往后跳几个单词
行内跳转
^ 跳转至行首的每一行非空白字符
0 跳行首,绝对行道,包括空白字符
$ 跳行尾
行间移动
#G 跳转到#行 1G行道 例如直接3G为第三行
只有G为最后一行,行首
在末行模式直接输入行号回车即可 :# :5 跳转至第5行
句间移动
)跳转至后一句句首
(跳转前一句句首
段落间移动
{ 段首
} 段尾
D:编辑类指令
字符编辑
x 表示删除光标所在处字符 #X 删除光标指定后#的字符如4x
xp: 与后一个字符光标对调
字符替换
只能够替换单个字符
r+替换后的字符 替换光标所在处的字符
大写R替换模式,可直接替换多个字符
例如rz 将当前光标字符替换为z
4rz 将当前光标后4字符替换z
删除命令:可与光标跳转配合,删除之间的字符
d后面加上指定位置删除多少 #d跳转符
d^ d$ 行尾 d0 行首
dw 一个单词单词删除 例如3dw #de ,#db
db 删除一行
#dd 删除包前光标所在行在的的#行
末行模式下:
startDD,endADDd 删除从开始至指定位置的行数
例如:.,5d 当前向下5行后 :1,8d 删除第一至第8行
. 当前行 $最后一行 +# 当前位置向下的#行
$-# 末行最后#行
注意:删除的内容会被vim编辑在缓冲区(内存)当中,可撤消可恢复。
最后一次的内容可粘贴到指定位置。
粘贴命令
p(paste,put) 大小p
如之前复制或删除的内容不是一个完整行
小写p 当前光标处所在行的前面
大写P 当前光标处所在处的后面
如之前复制或删除的内容是完整行 不止一行
小写p 当前光标处所在处的上方
大写P 当前光标处所在处的下方
复制命令 y yank
#command
y 用户与d基本相同
y$ t复制光标处所在行,目前位置至行尾的内容
y^ 当前光标至行首不 包括空白字符
y0 当前光标至行首包括空白字符
ye yw 二个基本相同针对当前光标的单词
yb复制当前光标处单词前面字符
yy 复制当前一行
#yy 可复制#行
改变命令 c change 模式转换
与y,d功能相近,先删除内容,再转换为输入内容
c$,c^,c0 cb,ce,cw
cc
#command改变命令
撤消编辑操作
u undo 默认50次,撤消此前编辑操作
#u 直接撤消#次编辑操作
ctl+r表示撤消最近的一次撤消操作,还原最近一次撤消操作
重复前一个编辑操作
.
可视化操作
v按字符选取
V按矩形选取
选取后可进行编辑操作包括删除、复制等,
注意字符时利用hjkl上下左右键选择
翻屏操作
编辑模式下
ctl+f 向后一屏 ctl+b 前一屏
ctl+d 向下半屏 ctl+u向前半屏
E:VIM末行模式操作
(1)地址 ,定界 :start_pos,end_pos
#:第#行;
#,#
#,+#
.: 当前行
$: 最后一行
%: 全文,相当于1,$
/pat1/:第一次被此模式所匹配到的行;
#,/pat1/
/pat1/,/pat2/
后可跟编辑命令:
d, y
w, r
示例 :5 光标移动到第5行
:5d 删除第5行
:#,# 3,10从3至10行 例如 :1,15d 删除第1至15行
:#,+# 当前行向下几行 :1,+6d 删除第1至后6行
:.当前行 .d删除当前行
:$最后一行
(2)查找
查找:支持正则表达式
/PATTERN 从行首至行尾
?PATTERN 从当前光标处至首部,往回找
n 下一个,向下
N 下一个,往回
示例 /echo 查找字符echo
(3) 查找和替换
在末行模式可以使用命令s(相当于set命令) s: 在末行模式下,
在地址定界的范围内完成查找替换操作;
起始地址,结束地址s@PATTERN@替换成的@修饰符gi
s/要查找的内容/替换为的内容/修饰符
要查找的内容:可使用模式
替换为的内容:不能使用模式,但可以使用后向引用符号,以引用前面模式中的分组括号所匹配到的内容;
\1, \2, ...
&:引用“要找的内容”匹配到的整个内容;
修饰符:
i: 忽略大小写
g: 全局替换/:用于分隔符,所以,要查找的内容或替换为的内容中出现此符号,
要使用\对其转义,使用格式:\ / 分隔符可替换为其它字符:例如@,#等;
addr1,addr2S@pattern@string@gi
特殊含义字符
空格:\s
行末空格:\s$
行首空格:^\s
F:多文件模式
vim FILE1 FILE2 ... 默认在第一个文件,第二个文件:next
:next
:first
:prev
:last
:wqall 保存所有文件
:q!all 多个文件不保存退出
G:窗口分隔
vim -o|-O FILE1 FILE2 ...
Ctrl+w, ARROW 小o为分水,大O为垂直分隔
单文件窗口分割:
Ctrl+w, s: split, 水平分割
Ctrl+w, v: vertical, 垂直分割
H:定制vim的某些工作特性:
(1) 行号
显示:set nu
禁用:set nonu
(2) 括号匹配
显示:set sm
禁用:set nosm
(3) 自动缩进:
set ai
set noai
(4) 高亮搜索
set hlsearch
set nohlsearch
(5) 语法着色
syntax on
syntax off
(6) 忽略字符大小写
set ic
set noic
:help 获取帮助
:help SUBJECT
特性设定的永久生效方式:
全局配置文件:/etc/vimrc
用户个人的配置文件:~/.vimrc
I:练习:
1、复制/etc/grub2.cfg配置文件至/tmp目录,用查找替换命令删除/tmp/grub2.cfg
文件中的行首的空白字符; CentOS: /etc/grub.con
备注说明:%s/^[[:SPACE :]]/ 后面为空代表删除空白
也可以使用:%s/^\s/ 的形式
2、复制/etc/rc.d/init.d/functions文件至/tmp目录,用查找替换命令为/
tmp/functions的每行开头为空白字符的行的行首加一个#; 原有空白字符保留;
:%s/^[[:space:]]/#& &表示
3、替换/tmp/functions文件中的/etc/sysconfig/init为/var/log;
这里使用转译符
:%s/\/etc\/sysconfig\/init/\/var\/log
4、删除/tmp/functions文件中所以#开头,且#后面至少跟了一个空白字符的行的行首#;
:%s/#[[:space:]]/
第二部分 Find 文件查找
grep、egrep、fgrep等命令用于文本查找,Find则用于针对文件进行查找
1、查找常用命令
locate: 非实时查找工具;依赖于事先构建的索引;索引的构建是在系统较为空闲时
自动进行(周期性任务);手动更新此数据库(利用命令updatedb);优势是查找速度快;模糊查找;
find:实时查找;查找速度略慢;精确查找;
2、find命令:实时的、精确查找,遍历指定目录中所有文件的查找、速度慢,支持
多种查找类型和标准
格式定义: find [OPTION]... [查找路径] [查找条件] [处理动作]
查找路径:默认为当前路径;
查找条件:l默认是指定下的所有文件:指定的查找标准,根据文件名、大小、
属主属组、类型等进行;默认为找出指定路径下的所有文件;
处理动作:对符合条件的文件做什么操作;默认为输出至屏幕;
查找条件
A: 根据文件名进行查找
-name "文件名称": 对文件名精确匹配支持使用通配符 glob; *,任意长度字符 ?, [ ]
示例:find /etc �Cname ‘passwd’ 示例:find /etc �Cname ‘*passwd’ 查找以passwd结束的文件
-iname "文件名称":不区分字符大小写,支持使用glob;
-regex "PATTERN":以正则表达式进行文件名。匹配整个文件路径字符串,而不
仅仅是文件名称; 后面需要指定regex类型
B: 根据属主、属组查找
-user USERNAME: 查找属主为指定用户的文件;
示例: find /tmp -user user1
-group GROUPNAME: 根据属组查找
-uid UserID: 查找文件的属主指定uid的文件;删除用户后,只显示uid,只能够通过GID进行查找
-gid GroupID: 根据GID进行查找
-nouser: 查找没有属主的文件;
-nogroup:查找没有属组的文件;
C: 根据文件类型进行查找:
-type TYPE
f: 普通文件
d: 目录
l: 符号链接
b: 块设备
c: 字符设备
p: 命名管道
s: 套接字
示例:find /etc �Ctype l
D:组合查找条件
与条件:-a 优先级中等与 ,二个都要满足
或条件:-o 优先级最低
非条件:-not, ! 优先级最高
条件之间末指定条件是默认是与条件,
摩根定律
!A -o !B = !(A -a B) AB为二个条件
!A -a !B = !(A -o B)
示例:find /tmp �Cnot �Ctype d 用于查找tmp非目录类型的文件
find ./ -not -user chris -a -not -user root 查找非chirs和root用户的文件
或
find ./ -not \( -user chris -o -user root \)
E:根据文件大小来查找
-size [+|-]#UNIT 单位:k, M, G,默认单位是字节 #k #M #G 精确
注意这里进行舍入, +代表大于
#UNIT: (#-1,#] 例如3为大于2小于3的数值
+#UNIT: (#,+oo)
-#UNIT:[0,#-1]
示例:find /etc �Csize 5k �Cls
F: 根据时间戳
以“天”为单位 +表示至少多少天 -表示多少天之内
-atime [+|-]#
#:[#,#+1)
+#: [#+1,oo]
-#: [0,#)
-mtime
-ctime
示例:find ./ �Catime �C5 表示5天之内访问过的文件
以“分钟”为单位
-amin
-mmin
-cmin
G:根据权限
-perm [/|-]MODE
MODE: 精确权限匹配
/MODE:任何一类对象(u,g,o)的任何一位权限符合条件即可;隐含或条件;
/400 属主能读即可
/444 任意读即可
-MODE:为每一类对象指定的每一位权限都必须同时存在方为符合条件;隐含与条件;
-222
-200
示例:find ./ �C perm �C200
处理动作
-print: 默认处理动作
-ls:类似于对查找到的每个文件做"ls -l"的操作;
-delete: 删除查找到的文件;
-fls /path/to/somefile:查找到的文件的详细路径信息保存至指定文件中;
-ok COMMAND {} \; {}为命令占位符,引用原文件的位置 \;结束
对每个文件执行指定的命令之前需要用户事先确认;
-exec COMMAND {} \;
无需用户确认;
例如:find ./ �Cperm 200 �Cexec chmod 777 {} \;
3、 练习:
1、查找/var目录属主为root,且属组为mail的所有文件;
find ./ -user oracle -a -group mail :注意由于目录没有满足root和mail的条件,
这里调整为user为oracle,group为mail
2、查找/usr目录下不属于root、bin或hadoop的所有文件; (hadoop替换为51cto用户)
find ./ -not \( -user root -o -user bin \) -o -user 51cto
或者
[root@centos71 usr]# find ./ -not -user root -a -not -user bin -o -user 51cto
3、查找/etc目录下最近一周内其内容修改过,且属主不为root或hadoop的所有文件;
[root@centos71 /]# find /etc -mtime -7 -not -user 51cto -7写指7日内的数据
4、查找当前系统上没有属主或属组,且最近一周内曾被访问过的所有文件;
[root@centos71 /]# find / -atime 7 -nouser -o �Cnogroup
5、查找/etc目录下大于20k且类型为普通类似的所有文件;
[root@centos71 etc]# find /etc -size +20k -type f
6、查找/etc目录下所有用户都没有写权限的文件;
[root@centos71 etc]# find /etc -not �Cperm -444
7、查找/etc目录下至少有一类用户没有执行权限的文件;
[root@centos71 etc]# find /etc -not -perm �C111
8、查找/etc/init.d目录下,所有用户都有执行权限,且其它用户拥有写权限的文件;
[root@centos71 etc]# find /etc/init.d -perm /111 -a -perm /004
第三部分:bash 环境变量
bash shell是解析器,解析用户的命令
1、配置文件
A:生效范围划分
全局配置:
/etc/profile, 文件比较大的情况下存在指正目录下/etc/profile.d/*.sh
/etc/bashrc
个人配置:文件以隐藏文件
~/.bash_profile
~/.bashrc
B:按功能划分:(二者区别在于作用范围
profile用于全局变量,bashrc用于本地变量
profile类:为交互式登录的shell提供配置
/etc/profile, /etc/profile.d/*.sh
~/.bash_profile
功用:
(1) 定义环境变量,例如PATH、PS1
(2) 运行命令或脚本
bashrc类:为非交互式登录shell提供配置
/etc/bashrc
~/.bashrc
功用:
(1) 定义命令别名;如开始拥有别名
(2) 定义本地变量;
2、变量:内存空间,变量名
A: 类型:
环境变量:作用范围当前shell进程及其子进程
本地变量:作用范围当前shell进程
局部变量:作用范围仅为当前shell进程中某代码片断(通常为函数上下文)
位置变量:$1, $2 用于脚本传递参数
特殊变量:$?
可通过pstree查看进程树, 所有从systemd进程开始,是用户空间的第一个进程。
是所有进程的父进程
二个bash,第一个是第二个bash的父进程,父进程定义的对子进程有效,
父进程定义的环境变量的值,在子进程中无效无法看到
例如在第一个bash即父进程定义的变量
name=‘51cto’
echo $name 输出为 51cto
这时运行子进程/bin/bash,再次输入echo $name时输出则为空
同上为例:如果变量定义以exort name=’51cto’定义,在父进程与子进程都可以通过
echo$name查看到
B: 变量定义与赋值方式:
(1)变量定义:
bash内置变量:可直接调用,内置了许多环境变量,例如PATH、ps1等
自定义变量:自已给名称
变量赋值:变量名=值 等于号为赋值
name='obama' 变量定义
echo $name 引用变量
bash弱类型编程语言:
变量存储数据时,默认均采用字符形式;任何变量可以不经声明,直接引用;
120:24bits 120 ASCII码,转换为2进制
120: 8bits
(2)变量赋值
定义过程中shell关闭后,变量失效
定义本地变量:
name=value
查看:set
定义环境变量:
export name=value
declare -x name=value
查看:env, printenv, export
C:撤消变量:
unset name
D:引用变量:
${name}, $name { }绝大部分可以省略
如下如果将二个字符串连接到一起的情况下需要使用{ }
E:bash中的引用符号:
' ' 强引用,变量替换不会发生
"" 弱引用,变量替换会发生
`` 命令引用,命令执行结果直接引用
进程引用
whick cat的执行结果字符串 作为ls �Cl参数引用,先执行被引用,再执行外面引用命令
强引用与弱引用的区别,animail变量已经定义,如果利用 echo “$animail”引用则进行变量
替换发生(弱引用),输出为dog,如果为echo ‘$animail’则为强引用,则输出为 $animail
3、shell登录类型:
交互式登录:
直接通过终端ssh进行的登录;
通过su -l Username命令实现的用户切换;
非交互式登录:
图形界面下打开的命令行窗口;
执行脚本; 会打开shell执行
su Username;
4、配置文件作用次序:
交互式登录:后面会复盖前面的变量 ,后面的会最终生效
/etc/profile --> /etc/profile.d/*.sh --> ~/.bash_profile --> ~/.bashrc --> /etc/bashrc
非交互式登录:
~/.bashrc --> /etc/bashrc --> /etc/profile.d/*.sh
注意生效范围:全局对所有用户、局部(当前用户下)
示例1:所有用户都生效
vim /etc/profile.d/welcome.sh /etc/profile.d为全局,以上操作针对所有用户生效
文件内容如下:$UID,$HOME为已定义
root再通过ssh登陆时
示例2:针对某个用户生效编辑相应用户下的~/.bash_profile 或者~/.bashrc文件 取决于自己需要
在root用户目录下修改bashrc文件
然后重新登陆shell,通过别名查看包括cdnet的配置,再通过命令别名cdnet,
则直接进入/etc/sysconfig/network-scripts目录下
5、编辑配置文件定义的新配置如何生效?
(1) 重新登录;
(2) 让当前shell进程去重新读取指定的配置文件;
source /PATH/TO/SOMEFILE
属主的访问权限
a:进程属主,同文件属主则应用文件属主的权限
b: 进程的属主,属于文件的属组,则应用文件属组权限
c:则应用其它权限
3、SUID :
(1)任何一个可执行程序文件能不能启动为进程,取决于发起者对程序文件是否有执行权限
(2)有s权限后,启动为进程之后,其属主不是发起者,而程序文件自己的属主》这种机制为 SUID
权限设定:
chmod u+s file
chmod u-s file
注意:当加后会出现大小写的情况
小s :属主原本 拥有x权限
大S :属主原本无x权限
rwsr中有s说明SUID权限,不管任何用户, passwd不能带参数限制只能针对root
chmod加s权限
4、SGID:与suid有很大不同,针对属组进行限定
默认每个用户创建文件时文件的属主是当前用户基本组
一但某目录被设定为SGID权限,则对此目录拥有写权限的用户在此目录中创建的文件
所属的组目录的属组,而非用户的基本组(用于全局可写,每个用户可修改别人文件
协做的情况下使用)
-G代表附加组
权限设定:chmod g+s file…
chmod g-s file ….
chmod g+w file(有写权限)
示例:
!、以root用户创建新目录,所属主和属组均为root
!!、修改/mydata/data属组
!!!、修改/mydata/data属组为可执行权限
!!!!、分别以用户root,51cto创建文件
这里创建的文件分别属于自已的属主和属组
!!!!!、为/mydata/data目录添加权限
!!!!!! 再分别以root和51cto用户创建文件
可看到后创建的文件rootbb的属组为51cto,而非root,
这里其它用户不可以写,但可以删除,要注意组权限
5、 sticky 只能删除自已的文件,不能删除另人的文件
临时文件 /tmp /var/tmp每个写都可以写该文件最后一位权限为t
sticky(粘制位)对于一个多个可写的目录,此权限用于限制每个人只能删除自己的文件,
chmod o+t file
chmod o-t file
示例:
!在上面的情况下51cto用户可删除root用户的文件
!! 修改./mydata/data目录权限
!!!再次以51cto用户删除root用户文件
6、权限整合
suid sgid sticky
000
001
010
011
100
101
110
111
后3位 r,x,x
示例:
chmod 1755 /tmp/51cto 说明目录51cto有755权限,1代表拥有sticky权限 chmod 4777 file ,拥有suid chmod 3755, 目录拥有755权限,同时拥有gid和sticky
umask 临时生效,只针对当前shell,如果永久需要修改配置文件
umask 0022 四位中第一位就是对应上面特殊权限
练习:
1、让普通用户能使用/tmp/cat去查看/etc/shadow文件
A:先利用 cp /usr/bin/cat /tmp目录
B:查看权限
C:在51cto用户运行/tmp/cat /etc/shadow 提示无权限
:在root用户运行添加s权限
E:再次以51cto用户运行/tmp/cat /etc/shadown运行正常输出。
2、创建目录/test/data,让某组内普通用户对其有写权限,且创建的所有文件的属
组为目录所属的组,此外每个用户仅能删除自己的文件
准备: 修改51cto目录属主、属组
创建用户yy1、yy2、yy3、yy4指定密码为password,同时修改附加组为3001
A:以51cto用户创建/tmp/51cto/test/data目录
B:同时创建用户yy1、yy2、yy3、yy4的附加组为51cto
C:以4个用户分别创建利用touch,vim命令创建文件,aa为touch文件,bb为vim文件。
这里经测试其它用户可删除文件,如下:yy1用户可删除yy4创建的yy4.cc文件
D:通过chmod修改权限
现有目录权限为775
针对sgid和sticky添加权限,组增加s,sticky t
E:验证
yy1.cc新创建文件的属组为51cto
删除文件:在yy4用户下,删除yy3.cc文件提示权限不足,删除yy4.cc文件正常可以删除