Vim编辑器:
全屏幕的编辑器:VIM
vi: visual interface
sed:行编辑器
vi, vi iMproved
vim:
模式化:
编辑模式:命令模式
输入模式:
末行模式:
编辑模式 --> 输入模式:
i: insert,
a:append,
o:new line,
I: 行首
A:行尾
O:上方新建行
输入模式 --> 编辑模式:
ESC
编辑模式 --> 末行模式:
:
末行模式 --> 编辑模式
ESC
1、总结文本编辑工具vim的使用方法;
打开vim:
# vim
# vim /PATH/TO/SOMEFILE
+#:#为行号;
+/PATTERN
关闭vim:
:q
:q!
:wq
:x
ZZ:保存退出
光标跳转:
字符间跳转:
h:
l:
j:
k:
#COMMAND:
单词间跳转:
w:后单词的词首
e:当前或后一个单词的词尾;
b:当前或前一单词的词首;
#COMMAND:
行内跳转:
^: 跳转至行首的第一个非空白字符;
0:跳转至行首;
$: 跳转至行尾;
行间移动:
#G:
1G, gg
G
句间移动:
)
(
段落间移动:
}
{
编辑命令:
字符编辑:
x: 删除光标所在处的字符
#x:
xp:
r: 替换光标所在处的字符;
删除命令:
d:
d^
d$
d0
dw, de, db
dd:
#COMMAND
注意:删除的内容会被vim编辑器保存至缓冲区当中;
粘贴:p (paste, put)
如果此复制或删除的内容不是一个完整行
p:粘贴至当前光标所在处后面;
P:粘贴至当前光标所在处前面;
如果复制的内容是完整行(可不止一行)
p: 粘贴至当前光标所在行下方;
P:行上方;
复制命令:y, yank
y
y$, y^, y0
ye, yw, yb
yy: 复制行
#COMMAND
改变命令:c, change
c$, c^, c0
cb, ce, cw
cc:
#COMMAND
撤消此前的编辑操作:
u: undo
撤消此前编辑操作;
#u
Ctrl+r:
恢复此前的撤消操作
.: 重复前一个编辑操作
翻屏操作:
Ctrl+f: 向后一屏;
Ctrl+b:向前一屏;
Ctrl+d: 向后半屏
Ctrl+u: 向前半屏
vim内建教程:
vimtutor
vim的末行模式
(1) 地址,定界
:start_pos,end_pos
#:第#行;
#,#
#,+#
.: 当前行
$: 最后一行
%: 全文,相当于1,$
/pat1/:第一次被此模式所匹配到的行;
#,/pat1/
/pat1/,/pat2/
后可跟编辑命令:
d, y
w, r
(2) 查找
/PATTERN:向尾部进行
?PATTERN:向首部进行
n: 与命令同方向
N:与命令反方向
(3) 查找替换
s: 在末行模式下,在地址定界的范围内完成查找替换操作;
s/要查找的内容/替换为的内容/修饰符
要查找的内容:可使用模式
替换为的内容:不能使用模式,但可以使用后向引用符号,以引用前面模式中的分组括号所匹配到的内容;
\1, \2, ...
&:引用“要找的内容”匹配到的整个内容;
修饰符:
i: 忽略大小写
g: 全局替换
/:用于分隔符,所以,要查找的内容或替换为的内容中出现此符号,要使用\对其转义,使用格式:\/
分隔符可替换为其它字符:例如@,#等;
多文件模式:
vim FILE1 FILE2 ...
:next
:first
:prev
:last
:wqall
:q!all
多文件窗口分割:
vim -o|-O FILE1 FILE2 ...
Ctrl+w, ARROW
单文件窗口分割:
Ctrl+w, s: split, 水平分割
Ctrl+w, v: vertical, 垂直分割
定制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
2、总结文件查找命令find的使用方法;
Linux文件查找:
locate: 非实时查找,根据数据库(速度快);模糊查找;
find:实时查找,精确匹配;速度慢;
find [查找位置] [查找标准] [处理动作]
查找位置:默认为当前目录;
查找标准:默认为查找指定目录下的所有文件;
处理动作:显示到标准输出;
查找标准:
-name "文件名称": 根据文件名查找,精确查找文件。
支持glob, *, [], ?
-iname "文件名称":根据文件名查找,不区分字符大小写;name ignore case
-user USERNAME: 根据属主查找;
-group GRPNAME: 根据属组查找;
-uid UID; #按照Uid 来查找
-gid GID; #按照gid来查找
-nouser:查找没属主的文件;
-nogroup: 查找没有属组的文件;
组合查找条件:
-a: 与
-o:或
-not, !: 非
3、总结bash环境变量的相关内容;
bash环境配置:
配置文件,生效范围划分,存在两类:
全局配置:
/etc/profile, /etc/profile.d/*.sh
/etc/bashrc
个人配置:
~/.bash_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进程中某代码片断(通常为函数上下文)
位置变量:$1, $2
特殊变量:$?
变量定义方式:
bash内置变量:可直接调用,内置了许多环境变量,例如PATH等
自定义变量:
变量赋值:变量名=值
bash弱类型:
变量存储数据时,默认均采用字符形式;任何变量可以不经声明,直接引用;
120:24bits
120: 8bits
定义本地变量:
name=value
查看:set
定义环境变量:
export name=value
declare -x name=value
查看:env, printenv, export
撤消变量:
unset name
引用变量:
${name}, $name
bash中的引用符号:
'': 强引用,变量替换不会发生
"":弱引用
``: 命令引用
shell登录类型:
交互式登录:
直接通过终端进行的登录;
通过su -l Username命令实现的用户切换;
非交互式登录:
图形界面下打开的命令行窗口;
执行脚本;
su Username;
配置文件作用次序:
交互式登录:
/etc/profile --> /etc/profile.d/*.sh --> ~/.bash_profile --> ~/.bashrc --> /etc/bashrc
非交互式登录:
~/.bashrc --> /etc/bashrc --> /etc/profile.d/*.sh
编辑配置文件定义的新配置如何生效?
(1) 重新登录;
(2) 让当前shell进程去重新读取指定的配置文件;
source /PATH/TO/SOMEFILE
. /PATH/TO/SOMEFILE
注意:副作用
4、总结Linux文件系统上的特殊权限(SUID、SGID、Sticky)的知识点;
Linux文件系统上的特殊权限
权限模型:
u, g, o
r, w, x
进程的安全上下文:
前提:进程有属主(进程以哪个用户的身份运行);文件有属主和属组;
(1) 用户是否能够把某个可执行程序文件启动为进程,取决于用户对程序文件是否拥有执行权限;
(2) 程序启动为进程后,此进程的属主为当前用户,也即进程的发起者;进程所属的组,为发起者的基本组;
(3) 进程拥的访问权限,取决其属主的访问权限:
(a) 进程的属主,同文件属主,则应用文件属主权限;
(b) 进程的属主,属于文件的属组,则应用文件属组权限;
(c) 则应用其它权限;
SUID:
(1) 任何一个可执行程序文件能不能启动为进程:取决于发起者对程序文件是否有执行权限;
(2) 启动为进程之后,其属主不是发起者,而程序文件自己的属主;这种机制即为SUID;
权限设定:
chmod u+s FILE...
chmod u-s FILE...
注意:
s: 属主原本拥有x权限;
S: 属主原本无x权限;
SGID:
默认情况下,用户创建文件时,其属级为此用户所属的基本组;
一旦某目录被设定了SGID权限,则对此目录拥有写权限的用户在此目录中创建的文件所属的组为目录的属组,而非用户的基本组;
权限设定:
chmod g+s FILE...
chmod g-s FILE...
Sticky:
对于一个多人可写的目录,此权限用于限制每个仅能删除自己的文件;
权限设定
chmod o+t FILE...
chmod o-t FILE...
SUID, SGID, STICKY
000
001
010
011
100
101
110
111
chmod 4777 FILE
chmod 3755 DIR
5、总结Linux磁盘管理、文件系统相关知识点及其相关命令的使用方法;
Linux系统管理
磁盘和文件系统管理;
RAID, LVM; btrfs;
程序包管理:rpm, yum(dnf)
Linux的网络管理;
进程和作业管理:htop, glances, tsar;
sed和awk;
Linux系统的开机启动流程;
内核基础知识,内核定制编译;
系统安装:kickstart, pxe
Linux磁盘管理
硬盘:
机械式硬盘
SSD
机械式:
track
sector: 512bytes
cylinder: 分区的基本单位;
MBR:Master Boot Record
512bytes
446: bootloader
64: filesystem allocation table
16: 标识一个分区
2:55AA
磁盘接口类型:
IDE (ATA):133MB/s,/dev/hd
SCSI: 640MB/s
SATA:6Gbps
SAS:6Gbps
USB:480MB/s
识别硬盘设备:/dev/sd
标记不同的硬盘设备:/dev/sd[a-z]
标记同一设备上的不同分区:/dev/sd[a-z][1-]
1-4: 主或扩展分区标识
5+:逻辑分区标识
设备文件:特殊文件
设备号:
major, minor
major: 设备类型
minor: 同一类型下的不同设备
“块”:block,随机设备
“字符”:character,线性设备
GPT
分区:分隔存储空间为多个小的空间,每个空间可独立使用文件系统;
分区工具:
fdisk, parted, sfdisk
fdisk工具的使用:
最多支持在一块硬盘上的15个分区;
分区管理子命令:
p: 显示
n: 创建
d: 删除
t: 修改分区ID
l: 列出所有支持ID类型
w: 保存退出
q: 放弃修改并退出
m: 获取帮助
创建完成之后,查看内核是否已经识别新的分区:
# cat /proc/partitions
有三个命令可以让内核重读磁盘分区表:
CentOS 5: partprobe [DEVICE]
CentOS 6,7:
partx
kpartx
partx命令:
partx DEVICE
partx -a DEVICE
partx -a -n M:N DEVICE
M
M:
:N
kpartx命令:
kpartx -af DEVICE
Linux文件系统管理
文件系统:
VFS:Virtual File System
Linux:ext2, ext3, ext4, reiserfs, xfs, btrfs, swap
光盘:iso9660
Windows: fat32(vfat), ntfs
Unix: ffs, ufs, jfs, jfs2
网络文件系统:nfs, cifs
集群文件系统:ocfs2, gfs2
分布式文件系统:ceph,
moosefs, mogilefs, hdfs, gfs, glusterfs
(1) 日志型文件系统
非日志型文件系统:ext2
日志型文件系统:ext3
(2) swap:交换分区
创建文件系统:
在分区上执行格式化(高级格式化)
要使用某种文件系统,满足两个条件:
内核中:支持此种文件系统
用户空间:有文件系统管理工具
创建工具:mkfs (make filesystem)
mkfs -t type DEVICE
mkfs.type DEVICE
ext系列文件系统的专用管理工具:
mke2fs -t {ext2|ext3|ext4} DEVICE
-b BLOCK: 1024, 2048, 4096
-L 'LABEL': 设定卷标
blkid命令:
blkid DEVICE
LABEL, UUID, TYPE
Linux文件系统管理:
mkfs, mkfs -t type = mkfs.type
ext:mke2fs
创建文件系统:
mke2fs [OPTION]... DEVICE
-t {ext2|ext3|ext4}
-b {1024|2048|4096}
-L 'LABEL'
-j: mke2fs -t ext3
-i #:
-N #:
-m #: 预留磁盘空间占据多大百分比的空间为后期管理使用;
-O FEATURE[,...]
-O ^FEATURE:关闭此特性
has_journal
文件系统属性查看及调整工具:
e2label
e2lable DEVICE [LABEL]
tune2fs
显示ext系列文件系统的属性,或调整其属性;
-l:显示超级块中的信息;显示整个文件的属性及布局等相关信息;
-L 'LABEL':修改卷标;
-m #: 调整预留给管理员的管理空间百分比;
-j: ext2 --> ext3
-O:文件系统属性的启动或关闭
-o:文件系统默认挂载选项的启用或关闭
dumpe2fs:
-h: 仅显示超级块信息;
文件系统检测:
fsck: Filesystem check
fsck -t type
fsck.type
-a: 自动修复错误
-r: 交互式修复错误
-f: 强制检测
e2fsck:ext系列文件系统专用的检测修复工具;
-y: 自动回答为“yes”
-f:force
文件系统的挂载和使用:
kernel --> rootfs(分区)
rootfs分区:
bin, sbin, etc, lib, lib64, dev, tmp, proc, sys
/sbin/init
将额外文件系统与根文件系统某现存的目录建立起关联关系,进而使得此目录做为其它文件系统访问入口的行为,称之为挂载;
解除此关联关系的过程:卸载;
挂载点:mount point, 设备挂载至目录;
注意:挂载点在挂载在之后,其内部原有的文件会被暂时隐藏;建立使用空目录做为挂载点;
挂载方法:
mount:通过读取/etc/mtab文件来显示当前系统所有已经挂载的设备;
mount -a:挂载/etc/fstab文件中的所有支持自动挂载的文件系统;
mount [options] [-o options] DEVICE MOUNT_POINT
[options]:命令选项
[-o options]:挂载选项
DEVICE: 要挂载的设备
(1) 设备文件:/dev/sda5
(2) 卷标:-L 'LABEL'
(3) UUID:-U 'UUID'
(4) 伪文件系统名称
MOUNT_POINT: 挂载点
常用选项:
-t type:文件系统类型
-r: 以“只读”方式挂载此文件系统
-w: 以“读写”方式挂载此文件系统
-n:每个文件系统在挂载时都会自动更新/etc/mtab文件,-n用于禁止此功能;
此时,如果想查看挂载的所有文件系统:cat /proc/mounts
-a: 自动挂载所有支持自动挂载的设备;
-B:绑定目录至另一个目录上;
-o 挂载选项:
async:异步模式
sync: 同步模式
atime/noatime:是否更新访问时间戳;
diratime/nodiratime:是否更新目录的访问时间戳;
auto/noauto: 是否允许此设备被自动挂载;
exec/noexec:是否允许执行此文件系统上应用程序;
dev/nodev:是否支持在此设备上使用设备文件;
suid/nosuid:
remount:重新挂载
ro
rw
user/nouser: 是否允许普通挂载此设备;
acl:是否支持此设备上使用facl;
defaults:rw, suid, dev, exec, auto, nouser, and async
umount:卸载命令
# umount DEVICE
# umount MOUNT_POINT
查看正在访问指定挂载点的进程:
# fuser -v MOUNT_POINT
终止所有正在访问指定的挂载点的进程:
# fuser -km MOUNT_POINT
交换分区:
free命令:
查看memory和swap的使用状态
-m: 以MB为单位
-g: 以GB为单位
mkswap:创建交换分区
mkswap [option] DEVICE
-L 'LABEL'
swapon:启用交换分区
swapon [option] [DEVICE]
-a: 激活所有交换分区
-p PRIORITY: 设定其优先级;
swapoff:禁用交换分区
swapoff [option] [DEVICE]
文件系统等空间占用信息的查看工个:
df: disk free
-h: human-readable
-i: inode数量
-P: 以Posix兼容的格式输出
du: disk usage
-h: human-readable
-s: summary
文件系统相关挂载配置文件:/etc/fstab
每行定义一个文件系统;
要挂载的设备或伪文件系统 挂载点 文件系统类型 挂载选项 转储频率 自检次序
要挂载的设备:
设备文件、LABEL=、UUID=、伪文件系统名称
挂载选项:
defaults
转储频率:
0: 不转储
1: 每天转储
2: 每隔一天转储
自检次序:
0:不自检
1:首先自检,通常只有/才为1
2:
...
文件系统上的链接文件:
硬链接:
两个路径指向同一个inode
不能对目录进行;
不能跨分区进行
指向同一个inode的多个不同路径; 创建文件的硬链接会增加inode的引用计数;删除硬链接仅是删除其一个访问路径,只到最后一个路径被删除;
符号链接:
链接文件的数据指向另一个文件路径;
可以对目录进行;
可以跨分区;
指向的是另一个文件路径;而非inode;
对文件创建符号链接不会增加其引用计数;删除原文件,符号链接文件也将无法;
ln [-s] SRC DEST
-s:symbolic link
-v:verbose
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;
%s/\etc\sysconfig\init//var/log/g
9、删除/tmp/functions文件中所以#开头,且#后面至少跟了一个空白字符的行的行首#;
%s/^#[[:space:]]\{1,\}+//g
10、查找/var目录属主为root,且属组为mail的所有文件;
find /var �Cuser root �Ca group mail -ls
11、查找/usr目录下不属于root、bin或hadoop的所有文件;
find /usr -not -user root -o -user bin -o -user hadoop
12、查找/etc目录下最近一周内其内容修改过,且属主不为root或hadoop的所有文件;
find /etc -mtime -7 -a -not -user root -a -not -user hadoop
13、查找当前系统上没有属主或属组,且最近一周内曾被访问过的所有文件;
find / -not -nouser -o -nogroup -a -atime 7
14、查找/etc目录下大于20k且类型为普通文件的所有文件;
find /etc -size +20k -a -type f -ls
15、查找/etc目录下所有用户都没有写权限的文件;
find /etc -not -perm +222
16、查找/etc目录下至少有一类用户没有执行权限的文件;
find /etc -not -perm -111
17、查找/etc/init.d目录下,所有用户都有执行权限,且其它用户拥有写权限的文件;
[root@localhost tmp]# find /etc/init.d -perm -111 -a -perm -002
/etc/init.d
18、让普通用户能使用/tmp/cat去查看/etc/shadow文件;
[root@localhost tmp]# cp /bin/cat /tmp
[root@localhost tmp]# ll /tmp/cat
-rwxr-xr-x. 1 root root 48568 9月 8 12:23 /tmp/cat
[root@localhost tmp]# chmod u+s /tmp/cat
[root@localhost tmp]# ll /tmp/cat
-rwsr-xr-x. 1 root root 48568 9月 8 12:23 /tmp/cat
[root@localhost tmp]# /tmp/cat /etc/shadow
root:$6$7eb90RabJRKKBYUR$4HCeO5Yt9xSuSTBKWvkI7YvqbR3aKvl5Pvtq8zQdTLjBjj3TwPQO0DT3oq2dRIAwcKVXZCoB7bKPid0aCHhus/:16666:0:99999:7:::
bin:*:15980:0:99999:7:::
daemon:*:15980:0:99999:7:::
adm:*:15980:0:99999:7:::
lp:*:15980:0:99999:7:::
sync:*:15980:0:99999:7:::
shutdown:*:15980:0:99999:7:::
halt:*:15980:0:99999:7:::
mail:*:15980:0:99999:7:::
uucp:*:15980:0:99999:7:::
operator:*:15980:0:99999:7:::
games:*:15980:0:99999:7:::
gopher:*:15980:0:99999:7:::
ftp:*:15980:0:99999:7:::
nobody:*:15980:0:99999:7:::
dbus:!!:16666::::::
usbmuxd:!!:16666::::::
vcsa:!!:16666::::::
rpc:!!:16666:0:99999:7:::
rtkit:!!:16666::::::
avahi-autoipd:!!:16666::::::
abrt:!!:16666::::::
rpcuser:!!:16666::::::
nfsnobody:!!:16666::::::
haldaemon:!!:16666::::::
gdm:!!:16666::::::
ntp:!!:16666::::::
apache:!!:16666::::::
saslauth:!!:16666::::::
postfix:!!:16666::::::
pulse:!!:16666::::::
sshd:!!:16666::::::
tcpdump:!!:16666::::::
wwg8708:$6$80KZEyBUnTLJh3kW$cLYSqn/gq6DEa0qvVp1eX7/pzbqd2m2yn70363sH6bFn97fFHq9RTh9tCCzBT5jLHvWAp9lOd14JmzjRm53Tv1:16666:0:99999:7:::
wufeng_gg:!!:16673:0:99999:7:::
Oracle:!!:16677:0:99999:7:::
test:!!:16679:0:90:7:::
bash:!!:16684:0:99999:7:::
testbash:!!:16684:0:99999:7:::
busher:!!:16684:0:99999:7:::
nologin:!!:16684:0:99999:7:::
centos:!!:16684:0:99999:7:::
user1:!!:16684:0:99999:7:::
hadoop:!!:16685:0:99999:7:::
19、创建目录/test/data,让某组内普通用户对其有写权限,且创建的所有文件的属组为目录所属的组;此外,每个用户仅能删除自己的文件;
[root@localhost tmp]# mkdir -pv /test/data
mkdir: 已创建目录 "/test"
mkdir: 已创建目录 "/test/data"
[root@localhost tmp]# chmod g+ws /test/data
[root@localhost tmp]# ll /test/data
总用量 0
[root@localhost tmp]# ll -d /test/data
drwxrwsr-x. 2 root root 4096 9月 8 13:33 /test/data