1、总结文本编辑工具vim的使用方法;
vim是一种可视化的编辑器
有三种模式:编辑模式、插入模式、末行模式;(使用vim打开文件时默认是处于编辑模式)
模式间的转换:
编辑模式à插入模式
i 在光标所在处插入
a 在光标所在处的后一位进入插入
I 在光标所在行的行首进入插入模式
A 在光标所在行的行尾进入插入模式
o 在光标所在行的下方,另起一新行并进入插入模式
O 在光标所在行的上方,另起一新行并进入插入模式
插入模式à编辑模式
按ESC键即可
编辑模式à末行模式
: 冒号
末行模式à编辑模式
一下或者连续两下ESC按键
退出vim的操作
编辑模式下的ZZ可以执行保存退出(不常用)
:q 在文本内容没有发生变化时可以直接使用q退出
:q! 强制退出,放弃编辑的内容
:wq 正常的保存退出
:wq! 强制保存退出(一般只有root才用的上,root可以忽视文件只读状态)
:w 保存,但不退出
:w! 强制保存,但不退出
光标移动
在编辑模式下hjkl
h 向左移动一下 等同于方向键向左箭头
l 向右移动一下 等同于方向键向右箭头
j 向下移动一下(马老说j是小日本下流) 等同于方向键向下箭头
k 向上移动一下 等同于方向键向上一下
也可以#{h|j|k|l}(#代表数字)
比如:5h就是向左移动5个字符,同理5l就是向右移动5个字符、5j向下5下、5k向上5下
单词之间的移动
编辑模式下
w 跳到下个单词的词首
e 跳到下个单词的词尾
b 调到上个单词的词首
同样支持#{w|e|b}
一次移动#个位置,如:
3w 等于按了3次w,跳到光标处向右第三个单词的词首
3e 跳到从光标所在的单词或向右三个单词的词尾
3b 跳到前三个单词的词首
行首、行尾之间的快速跳转
编辑模式下
0 数字零,跳转至绝对的行首,实际试验中是跳到相对行首而不是绝对行首??
^ 脱字符,跳转至行首,如果行首是空白字符,则跳到行首的首字母上
$ 跳转至行尾
句子间跳转(不常用)
编辑模式下
) 下一句
( 上一句
段落之间跳转(不常用)
编辑模式下
} 下一段
{ 上一段
行间移动
编辑模式下
#G 跳转到指定行,如8G,就是跳转至第八行的行首
G 跳转至文章的尾行
gg 跳转至文章的首行
末行模式下,直接指明数字即可完成跳转
:3 代表跳至第三行
编辑操作
编辑模式下
x 删除光标所在的字符
#x 一次删除#个字符(向右)
dd 删除一整行
#dd 删除连同本行以及向下一共#行
d可以结合单词跳转、行首、行尾跳转完成定位删除,如:
dw 删除光标所在处至下个单词词首之间的字符
de 删除光标所在处至下个单词尾部之间的字符,基本上算是删除下个单词
db 删除光标所在处至上个单词词首之间的字符
d^ 删除光标所在处至行首之间的字符
d$ 删除光标所在处至行尾之间的字符
d0 删除光标所在处至行首之间的字符(绝对行首)
#d{w|e|b} 一次删除多个
p 粘贴(put ,paste)可以粘贴最后一次删除的内容
p 小写,粘贴光标之后
P 大写,粘贴光标之前
行级别的粘贴,p(小写)光标所在行向下另起一新行粘贴,P(大写)光标所在行向上另起一新行粘贴
y 复制操作,使用方法和d一样
yy 复制一整行
#yy 向下连同本行一共#行进行复制
和d一样可以结合单词、行首、行尾的跳转动作进行复制
dw 复制光标所在处至下个单词词首之间的字符
de 复制光标所在处至下个单词词尾之间的字符
db 复制光标所在处至上个单词词首之间的字符
y^ 复制光标所在处至行首之间的字符
y$ 复制光标所在处至行尾之间的字符
#y{w|e|b} 一次复制多个
c change,替换操作
cc 删除整行并进入插入操作
#cc 连同本行向下一共#行删除并进入插入操作
c^ 删除光标所在处至行首之间的内容,并进入插入操作
c$ 删除光标所在处至行尾之间的内容,并进入插入操作,与C(大写)效果一样
cw 删除光标所在处至下个词的词首之间的字符并进入插入操作
ce 删除光标所在处至下个词的词尾之间的字符并进入插入操作
cb 删除光标所在处至上个单词词首之间的字符并进入插入操作
#c{w|e|b} 一次替换多个
r 替换光标所在处的单个字符,一次只做一次替换
撤销动作
u undo 撤销修改
#u 撤销#次修改(默认只保存50次修改)
Ctrl+r 还原撤销内容
. 重复上一次动作
编辑模式下的翻屏操作
Ctrl+f 下一屏
Ctrl+b 上一屏
Ctrl+d 向下半屏
Ctrl+u 向上半屏
文本搜索
/PATTERN 从头部向下搜索
?PATTERN 从尾部向上搜索
n 下一个
N 上一个
文本替换操作(末行模式)
地址定界
:startline[,endline]
:# 第#行
:. 当前行
:$ 尾行
:% 全文
:+# 指定位置向下#行
:-# 指定位置向上#行
如 :10,+8d 删除10到18行的内容; :10,-8d 删除10行到第2行的内容
文本替换命令(末行模式)
格式 s/要查找的内容/要替换的内容/修饰符
其中”/” 是分隔符,可以使用查找或替换中不包含的符号来替换,如@、#等
“要查找的内容” 支持正则表达式
“要替换的内容” 不支持正则表达式,但可以使用后向引用\1 \2 ……
修饰符 i表示忽略大小写,g表示全局global
PS:“要替换的内容”使用&引用“要查找的内容”的全部内容
多文件模式
vim [option ] file ……
+# 打开文件并跳转至第#行,vim +3 file,打开file并定位至第3行
:next 下一个文件
:prev 上一个文件
:first 第一个文件
:last 最后一个文件
:wall 全部保存
:qall 全部退出
:wqall 全部保存退出
多窗口模式
vim -o file1 fiel2 …… 水平分割打开多个文件
vim -O file1 fiel2 …… 垂直分割打开多个文件
窗口之间跳转ctrl+w,arrow(方向键)
单个文件也可以进行窗口分割
Ctrl+w,s 水平分割
Ctrl+w,v 垂直分割
显示属性定义(末行模式)
:set nu 显示行号 :set nonu关闭显示行号
:set hlsearch 搜索高亮显示 :set nohlsearch 关闭搜索高亮
:set autoindent (:set ai) 开启自动缩进 :set noautoindent (:set noai)
:set ignorecase (:set ic) 忽略大小写 :set noignorecase (:set noic)
:set showmatch (:set sm) 开启高亮显示括号配对 :set noshowmatch (:set nosm)
vim配置文件
全局配置文件 /etc/vimrc
个人配置文件 ~/.vimrc 默认不存在,新建保存即可
2、总结文件查找命令find的使用方法;
文件查找功能可以使用locate和find
locate 根据数据库查找文件,所有查找的结果不会很全,必要时执行updatedb更新数据库
find 用法
find [option] [PATH] [条件] [处理动作]
查找条件:
根据名称来查找
-name “文件名” 文件名写法支持globbing(通配符)
-iname “文件名” 忽略文件名大小写
根据属主、属组来查找
-user unsername
-group groupname
-uid # 根据uid查找
-gid # 根据gid查找
-nouser 查找没有属主的文件
-nogroup 查找没有属组的文件
条件组合,与、或、非
-a 查找条1 -a 查找条件2 �Ca…… -a可省略
-o 查找条件1 �Co 查找条件2 �Co ……
-not 使用!也行
按照文件类型查找
-type
f 普通文件
d 目录文件
l 链接文件
b 块文件
c 字符文件
p 管道文件
s 套接字
按照文件大小查找
-size +|- 常用单位有K M G
-size #k 查找大于#-1 小于等于#k的文件
-size +#k 查找大于#k的文件
-size -#k 查找小于等于#-1k的文件
根据时间戳查找
以天为单位
-atime [ +|-] #
-ctime [ +|-] #
-mtime [ +|-] #
举个例子:
-4 表示小于等于4
4 表示大于4但小于5天
+4 表示大于等于5天
以分钟为单位
-mmin
-cmin
-amin
根据权限查找
-perm [+|-] MODE
指明MODE不是+、- 表示精确匹配
+ 任何一类的权限,只要对应用户位能够包含其中一类即可
- 每一类用户权限都要包含对应位的权限
处理动作
-print 结果输出值屏幕,默认及时如此
-ls 显示详情
-exec COMMAND {} \; 直接执行没有交互提醒操作,{}代表find搜索到的值,\;是固定语法格式结尾
-ok COMMAND {} \; 效果等同于-exec ,但是每一步操作需要用户确认,有交互提醒
注意:
find 能够一次性找到所有符合条件的文件,并一同传递给后面的命令,但有些命令不支持过长的参数,可以使用:
find XXXX | xargs COMMAND
3、总结bash环境变量的相关内容;
bash配置文件生效范围,存在两类:
全局类
/etc/profile /etc/profile.d/*.sh
/etc/bashrc
个人类
~/.bash_profile
~/.bashrc
按照功能划分(profile类、bashrc类)
profile类,为交互式登录shell提供配置
/etc/profile /etc/profile.d/*.sh
~/.bash_profile
功用:1、定义环境变量如PATH PS1等;2、运行的命令脚本
bashrc类,为非交互式登录shell提供配置
/etc/bashrc
~/.bashrc
功用:1、定义命令别名;2、定义本地变量
变量类型
环境变量 作用于当前shell进程及子进程
本地变量 作用于当前shell进程,子进程不生效
局部变量 作用与仅当前shell进程中某代码片段
位置变量 $0 $1 $2 ……
特殊变量 $?
变量定义方式:
bash内嵌变量,可以直接调用,其中内嵌了如PATH PS1等
用户自定义变量
变量名=值 变量存储格式默认均采用字符形式,可以不经声明之间使用
查看:set
pstree 命令,查看进程树
定义环境变量
export 变量名=值 本地变量声明为环境变量
declare -x 变量名=值 等同于export
查看:env printenv export
撤销变量
unset 变量名
引用变量
${变量名}
bash中引号的作用
“” 双引号,弱引用
‘’ 单引号,强引用
`` 反引号,引用其命令执行的结果
交互式、非交互式登录shell的区别:
交互式:需要输入用户名和密码 ,如终端登录; su - username用户切换
非交互式:不需要输入用户名和密码,如图形界面下右击打开终端 ; su username切换(不加-)
配置文件的作用次序
交互式:
/etc/profile à /etc/profile.d/*.sh à /etc/bashrc à ~/.bash_profile à ~/.bashrc
非交互式
~/.bashrc à /etc/bashrc à /etc/profile.d/*.sh
编辑配置文件后生效方法:
可以重新登录shell; source file 或者./PATH/FILE 执行(注意重复执行,结果可能或重复添加)
4、总结Linux文件系统上的特殊权限(SUID、SGID、Sticky)的知识点;
进程的安全上下文
前提是进程有属主,文件有属主和属组
1、用户能否将某个可执行文件启动为进程,取决于用户对文件有没有执行权限
2、程序启动后,程序的属组就是用户,即程序的发起者,进程的属组是发起者的基本组
3、进程拥有的访问权限,取决于其属组的访问权限
进程的属主同文件的属主,则应用属主权限
进程的属主同文件的属组,则应用属主权限
否则应用文件的其他权限
特殊权限
SUID
如果属主有执行权限,显示为s ,否则显示为S
功用:对于一个可执行的文件来敬,任何用户运行此程序为进程时,进程的属主不在是发起者本人,而是可执行程序文件自己的属组
chmod u+s 添加UID权限
SGID
功用:当目录的属组有写权限,且拥有SGID权限时,那么所有属于此目录的属组,且以属组身份在此目录新建文件或目录是,新文件或目录的属组不是创建者所属的基本组,而是目录的属组
chmod g+s DIRECTORY
特殊权限位sticky
chmod o+t
除了root和文件的属主用户有删除文件,其他人都不可以删除
5、总结Linux磁盘管理、文件系统相关知识点及其相关命令的使用方法;
硬盘分类
机械式硬盘
SSD固态硬盘
机械式
track 磁道
sector 扇区 512bytes
cylinder 柱面,分区的基本单位
MBR master boot record
512bytes
其中前446字节:bootloader
64 filesystem allocation table (FAT)
每16个字节表示一个分区
硬盘接口类型
IDE
SCSI
SATA
SAS
USB
设别硬盘设备:/dev/sd[a-z],标记同一设备上的不通过分区/dev/sd[a-z][1-]
1-4 主分区或扩展分区标识
5+ 逻辑分区标识
设备文件也称为特殊文件
[root@localhost ~]# ll /dev/sda* brw-rw---- 1 root disk 8, 0 Aug 24 16:33 /dev/sda brw-rw---- 1 root disk 8, 1 Aug 24 16:33 /dev/sda1 brw-rw---- 1 root disk 8, 2 Aug 24 16:33 /dev/sda2 brw-rw---- 1 root disk 8, 3 Aug 24 16:33 /dev/sda3 brw-rw---- 1 root disk 8, 4 Aug 24 16:33 /dev/sda4 brw-rw---- 1 root disk 8, 5 Aug 24 16:33 /dev/sda5
设备号:
主设备号major (8) 次设备号minor (0-5)
major 设备类型
minor 同一类型下不同设备
分区原因:分割存储空间,为多个小的空间,每个空间可以独立使用文件系统
分区工具
常见:fdisk parted sfdisk
fdisk 命令 (据说:同一块硬盘上最多支持管理15个分区)
-l DEV 列出磁盘信息
fdisk DEV 分区管理自命令
p 显示
n 创建
d 删除
t 修改磁盘id
l 列出支持的ID
w 保存退出
q 放弃修改并退出
创建完成之后,查看内核是否已经识别新的分区
cat /proc/partions
重读磁盘分区
centos5: partprobe 【DEVICE】
centos6、7: partx kpartx
partx
-a add
-n number
partx -a -n /dev/sda6 添加sda6到内核
partx -a -n 4:6 /dev/sda 一次添加4-6分区
partx -a DEVICE,全部添加,不过已添加的会报错
kpartx -af DEVICE 强制添加硬盘分区
Linux 文件系统管理
Linux 文件系统: ext2 ext3 ext4 xfs btrfs swap
光盘文件系统: iso9660
windows: fat32 ntfs
网络文件系统: nfs cifs
日志型文件系统: (ext3 ext4xfs btrfs)
swap 交换分区(把硬盘空间当作内存来使用) 内存不足时,把暂时不用的放到swap中存放,类似于windows中的虚拟内存
创建文件系统
在分区上执行格式化(高级格式化)
创建工具mkfs
检测工具fsck(fsck.ext4用来检测ext4系列)
mkfs -t TYPE DEVICE
blkid DEVICE 查看分区LABEL UUID,文件系统类型等信息
mkfs -t ext4 = mkfs.ext4
ext 系列文件系统的专用管理工具
mke2fs -t {ext2|ext3|ext4}
-b BLOCK 1024 2048 4096 字节
-L LABEL 设定卷标
6、复制/etc/grub.cfg配置文件至/tmp目录,用查找替换命令删除/tmp/grub.cfg文件中的行首的空白字符;
Centos6中没有grub.cfg,使用/etc/grub.conf来演示
:%s/^[[:space:]]//
7、复制/etc/rc.d/init.d/functions文件至/tmp目录,用查找替换命令为/tmp/functions的每行开头为空白字符的行的行首加一个#; 原有空白字符保留;
:%s@^\([[:space:]]\)@#\1@
为什么不用/进行分割?因为后面用到了\(\),所以看上去不够一目了然,所以使用@来进行分割
8、替换/tmp/functions文件中的/etc/sysconfig/init为/var/log;
:%s#/etc/sysconfig/init#/var/log#
还可以使用#进行分割,如果查找或者替换的内容中不含这个字符
9、删除/tmp/functions文件中所有以#开头,且#后面至少跟了一个空白字符的行的行首#;
:%s@^#\([[:space:]]\)@\1@
要查找的内容中可以有正则表达式,而替换中的内容不可以有,但可以使用后项引用(\1)
10、查找/var目录属主为root,且属组为mail的所有文件;
[root@localhost ~]# find /var/ -user root -group mail -ls 525473 4 drwxrwxr-x 2 root mail 4096 Sep 2 10:12 /var/spool/mail
11、查找/usr目录下不属于root、bin或hadoop的所有文件;
[root@localhost ~]# find /usr/ -not \( -user root -o -user bin -o -user hadoop \) -ls 402139 12 -rwsr-xr-x 1 abrt abrt 10296 Jul 25 00:08 /usr/libexec/abrt-action-install-debuginfo-to-abrt-cache
注意事项:-not后面的\(\) 前后需要空格隔开
12、查找/etc目录下最近一周内其内容修改过,且属主不为root或hadoop的所有文件;
[root@localhost ~]# find /etc/ -mtime -7 -not \( -user root -o -user hadoop \) -ls 1179660 4 drwxr-xr-x 2 779 hadoop 4096 Sep 2 13:38 /etc/mytest
13、查找当前系统上没有属主或属组,且最近一周内曾被访问过的所有文件;
[root@localhost ~]# find / \( -nouser -o -nogroup \) -mtime -7 -ls 1179660 4 drwxr-xr-x 2 779 hadoop 4096 Sep 2 13:38 /etc/mytest 526066 0 -rw-rw---- 1 779 mail 0 Aug 31 18:26 /var/spool/mail/bash 917513 0 --w--w--w- 1 779 root 0 Aug 31 18:10 /tmp/b 918351 4 drwx------ 4 1001 1001 4096 Sep 2 13:43 /home/database 917516 4 drwx------ 4 779 779 4096 Sep 2 13:43 /home/bash find: `/proc/1090/task/1090/fd/5': No such file or directory find: `/proc/1090/task/1090/fdinfo/5': No such file or directory find: `/proc/1090/fd/5': No such file or directory find: `/proc/1090/fdinfo/5': No such file or directory
14、查找/etc目录下大于20k且类型为普通文件的所有文件;
[root@localhost ~]# find /etc/ -size +20k -type f -exec ls -ldh {} \;
查找出来的太多,就不贴上来了
15、查找/etc目录下所有用户都没有写权限的文件;
[root@localhost ~]# find /etc/ -not -perm +222 -ls 1179988 352 -r--r--r-- 1 root root 359773 Aug 19 23:51 /etc/pki/ca-trust/extracted/openssl/ca-bundle.trust.crt 1179991 208 -r--r--r-- 1 root root 211626 Aug 19 23:51 /etc/pki/ca-trust/extracted/pem/objsign-ca-bundle.pem
所有用户都没有写权限 = 不是任何个一个用户包含写权限
16、查找/etc目录下至少有一类用户没有执行权限的文件;
[root@localhost ~]# find /etc/ -not -perm -111
至少有一类用户没有执行权限 = 不是 每一类用户都有执行权限
17、查找/etc/init.d目录下,所有用户都有执行权限,且其它用户拥有写权限的文件;
[root@localhost ~]# find /etc/init.d/ -perm -113
-111 是每位用户都包含执行权限,其他用户还要有写权限,就在其他用户位上+2即可 = -113
18、让普通用户能使用/tmp/cat去查看/etc/shadow文件;
[root@localhost ~]# ll /etc/shadow ---------- 1 root root 1206 Sep 2 13:42 /etc/shadow [root@localhost ~]# chmod u+s /tmp/cat [root@localhost ~]# ll /tmp/cat -rwsr-xr-x 1 root root 48568 Sep 6 11:14 /tmp/cat
分析:普通用户执行cat,那么此cat的进程属主为执行者本人,而此执行者本人不属于passwd中的属主、属组,所以按照shadow的的o权限位,是不能读的,给/tpm/cat添加上SUID权限,那么普通用户执行cat的进程属主就为root,虽然shadow的属主为没有权限,但root具有至高无上的权限,依然能够读取
[root@localhost ~]# su - hadoop [hadoop@localhost ~]$ /tmp/cat /etc/shadow root:$6$qHghFv2SnmPJgsKM$JbGecAAkkhJQsRO4eLGMScdCe3HCzZF2QXoHskXDMEM7FT3NxwiLzurqyYFiXrG5gQfv1rutpAeMuTcyUKwQm/:16666:0:99999:7::: bin:*:15980:0:99999:7::: daemon:*:15980:0:99999:7::: ……
19、创建目录/test/data,让某组内普通用户对其有写权限,且创建的所有文件的属组为目录所属的组;此外,每个用户仅能删除自己的文件;
先分析下:
让某组内普通用户对其有写权限,chmod g=rwx /test/data
且创建的所有文件的属组为目录所属的组 chmod g+s /test/data
每个用户仅能删除自己的文件 chmod s+t /test/data
验证:
[root@localhost data]# ll -d /test/data/ drwxrwsr-t 2 root hadoop 4096 Sep 6 12:00 /test/data/ [user1@localhost data]$ touch aa [user1@localhost data]$ ll total 0 -rw-r--r-- 1 user1 hadoop 0 Sep 6 12:01 aa -rw-rw-r-- 1 hadoop hadoop 0 Sep 6 12:02 bb
查看/test/data的权限,SUID,sticky
[user1@localhost data]$ whoami user1 [user1@localhost data]$ ll total 0 -rw-r--r-- 1 user1 hadoop 0 Sep 6 12:01 aa -rw-rw-r-- 1 hadoop hadoop 0 Sep 6 12:02 bb [user1@localhost data]$ rm -rf bb rm: cannot remove `bb': Operation not permitted
删除另外一个用户的文件被拒绝