Linux基础篇
说明:本文章内容是笔记性的
安装Linux
CentOS 映像文件下载地址
软件安装、原始码
- file /bin/bash:看看是否是二进制文件
Tarball源码安装
- 安装gcc
- 编写hello.c
- 执行gcc hello.c
- ll hello.c a.out
- 执行gcc -c hello.c
- ll hello.c hello.o
- 执行gcc -o hello hello.c
- ll hello*
gcc简易用法
- gcc -c hello.c:会自动产生hello.o这个目标文件,但是不会产生二进制执行档
- gcc -O hello.c -c:产生hello.o这个文件,并且进行优化
- gcc hello.c -lm(指libm.so或者libm.a) -L/lib(函式库文件) -I/usr/include(原始码内的include文件)
- gcc -o hello hello.c:-o后面接的是要输出的二进制档名
- gcc -o hello hello.c -Wall:编译会变得较为严谨一点
make
- vi makefile:制作出执行档
main:main.o haha.o sin.o cos.o
[tab] gcc -o main main.o haha.o sin.o cos.o -lm
- make
- ###### makefile
- 目标1:目标文件1 目标文件2
- [tab]指令如:echo “hello”
- 目标2:目标文件1 目标文件2
- [tab]指令如: echo “work”
- make 目标1 或者 make 目标2
Tarball
- 将下载的tarball在/usr/local/src目录下解压缩
-./configure:建立Makefile文件,执行前需要查看README或者INSTALL
- make clean:去除目标文件*.o
- make:将原始码编译成可执行的二进制文件
- make install:安装
- ###### 安装需注意
- 最好将每个软件安装在/usr/local/底下
- 如:/usr/local/tomcat
- 加入man path:
MANPATH_MAP/usr/local/tomcat/bin/usr/local/tomcat/man
paatch编译修改过的内容
- 下载xxx.patch文件
- 执行patch -p1 < ../xxxx.patch:-p[number]表示拿掉几个/
- patch -R < ../xxx.patch:还原
- 编译
- 安装
- 注意:2.4不能更新2.5,只能更新2.4.x,而却要按顺序
函式库
静态
- 扩展名:.a
- 编译行为:直接整合到可执行文件
- 执行状态:可独立
- 升级:整个执行档必须重新编译
动态
- 扩展名:.so
- 编译行为:可执行文件并没有函式库内容,只有指向动态函式库所在的指标而已
- 独立执行状态:不能独立执行
- 升级:不需要重新编译
放置目录
加快读取动态函式库
- 在/etc/ld.so.conf.d/目录下新建xxx.conf
- 将动态函式库所在目录名称写入
- 最后执行ldconfig
查看程序的函式库
- ldd 程序路径如:/usr/bin/passwd
- ldd -v /usr/bin/passwd
指纹校验
- 下载某文件的md5/shal
- 解压得到指纹码
- md5sum/shalsum/sha256sum [-bct] filename
- md5sum xxxx.tar.gz:看看编码是否与下载的md5相同
软件安装和升级
RPM
RPM软件升级更新
rpm -Uvh xxx.rpm:不存在会下载
rpm -Fvh xxx.rpm:不存在不会下载
RPM查询
rpm
-q:仅查询后面的软件名称是否有安装
-qa:列出所有的,已经安装的
-qi:列出该软件的详细信息
-ql:列出该软件的所有文件与目录所在的完整文件名
-qc:列出该软件所有的配置文件
-qd:列出该软件所有说明文件man
-qR:列出与该软件有关的相依软件所含的文件
-qf:找出该软件属于哪一个已安装的软件
-q --scripts
-qp[icdlR]
RPM验证与数字签名
rpm -V 软件名称
rpm -Va:列出系统上面所有可能被更动过的文件
rpm -Vp filename
rpm -Vf
数字签名
- /etc/pki/rpm-gpg/RPM-GRG-KEY-CentOS-7
- find /etc -name ‘*GPG-KEY*’
- rpm –import/etc/pki/rpm-gpg/RPM-GRG-KEY-CentOS-7:安装
- rpm -qa | grep pubkey:查找安装的所有密钥软件
- rpm -qi gpg-pubkey-xxxxxxx:查看密钥软件详细信息
反安装与重建数据库
rpm -e xxx
重建rpm数据库
rpm --rebuilddb
yum查询
yum
-y:(当yum要等待用户输入时,这个选项可以自动提供yes的响应)
--installroot=/some/path:将软件安装在/some/path中,而不是默认的路径
search:搜寻某个软件名称或者是描述的重要关键字
yum search raid
list:列出目前yu所管理的所有的软件名称与版本;类似rpm -qa
yum list
info:同上
yum info mdadm
provides:从文件去搜寻软件。类似-qf的功能
yum provides passwd:列出提供passwd这个文件的软件有哪些
yum list updates:列出目前服务器上可供本机进行升级的软件有哪些
yum安装
yum install 要安装的软件
yum update 要升级的软件,如果不接任何软件,则整个系统升级
yum升级
yum list updates:列出目前服务器上可供本机进行升级的软件有哪些
yum移除
yum remove 软件名称
修改yum配置文件
vi /etc/yum.repos.d/CentOS-Base.repo
[base][updates]之类的代表软件库的名称,不能有两个相同的软件库名称
name:说明这个软件库的意义
mirrorlist:列出这个软件库可以使用的映射站台
baseurl:软件库的实际网址
enable:让这个软件库被启动
gpgcheck:RPM数字签名,这里指代是否需要查阅RPM文件内的数字签名
gpgkey:数字签名的公钥文件
yum repolist all:列出目前yum server 所用的软件库有哪些
yum clean all:将所有的软件库都删除
yum软件群组功能
yum grouplist:列出所有可使用的软件群组
yum groupinfo groupname:了解某个组内包含的所有的软件名
yum groupinstall:可以安装一整组的软件群组
yum groupremove groupname:移除某个软群组
修改配置文件让groupinstall预设安装所有的optional软件
vi /etc/yum.conf
找到:distroverpkg=centos-release
底下新增一行:
group_package_types=default, mandatory, optional
EPEL/ELRepo
vi /etc/yum.repos.d/epel.repo
[epel]
name=epel packages
baseurl=https:/dl.fedoraproject.org/pub/epel/7/x86_64
gpgcheck=0
enabled=0
yum --enablerepo=epel install netcdf R
定时全系统自动升级
echo '10 1 * * * root /usr/bin/yum -y --enablerepo=epel update' > /etc/cron.d/yumupdate
实战安装httpd php mysql
rpm -q httpd php mariadb-server php-mysql
yum install httpd php mariadb-server php-mysql
systemctl daemon-reload
systemctl start httpd
systemctl enable httpd
systemctl status
firewall-cmd --add-service="http"
firewall-cmd --permanent --add-service="http"
firewall-cmd --list-all
SRPM
与RPM不同的是SRPM包含原始码,文件以xxxx.src.rpm格式
也就是说SRPM文件是需要编译的
假设我目前下载了aaa.src.rpm
打包编译:
rpmbuild --rebuild aaa.src.rpm
打包编译安装:
rpmbuild --recompile aaa.src.rpm
实战SRPM
下载SRPM文件:
wget http://vault.centos.org/7.3.1611/updates/Source/SPackages/ntp-4.2.6p5-25.el7.centos.1.src.rpm
编译:
rpmbuild --rebuild ntp-4.2.6p5-25.el7.centos.1.src.rpm
编译失败提示需要安装相依软件
yum install xxx xxx xxx xxx xx
rpmbuild --rebuild ntp-4.2.6p5-25.el7.centos.1.src.rpm
编译如果成功,最终的软件就会被放置到:
家目录/rpmbuild/RPMS/x86_64/ntp-4.2.6p5-25.el7.centos.1.rpm
修改SRPM配置
家目录/rpmbuild/SPECS:放置该软件的配置文件
SOURCES:放置的是该软件的原始文件*.tar.gz以及config
BUILD:编译过程的暂存数据
RPMS:打包好的文件放置处
编译完成后,除了RPMS目录外其他目录将会全部被移除
家目录/rpmbuild/SPESC*.spec:编译步骤配置文件
rpmbuild -ba xxx.spec:编译并同时产生RPM与SRPM
rpmbuild -bb xxx.spec:仅编译成RPM文件
登录档
- /var/log目录为登录档记录地
- 登录档由rsyslog这支服务在负责
- ps aux | grep rsyslog:查看该服务是否启动
- systemctl status rsyslogd.service:查看该服务的状态
- rsyslogd.service这支服务的配置文件是:/etc/rsyslog.conf,这个文件记载了什么服务的什么等级需要被记录在哪里
- syslog:核心所提供的登录档设计指引,所有的要求大概写入到syslog.h的头文件案中
- rsyslogd:为了要达成实际上进行讯息的分类所开发的一套软件
- rsyslog.service:为了加入systemd的控制,因此rsyslogd的开发者设计的启动脚本设定
- man 3 syslog:可查询服务类型
- 讯息等级:
- .:代表比后面还要严重的等级都被记录下来
- .=:代表所需要的等级就是后面的等级,其它不要
- .!:代表不等于
- ###### rsyslogd语法实战
- 将mail相关的数据写入/var/log/maillog
- 在/etc/rsyslog.conf的语法为:
- mail.info /var/log/maillog
- 语法例子:
- news.*; cron.* /var/log/newscron
- .;news,cron,mail.none /var/log/message:记录所有但是不记录cron、news、mail、
- ###### 实战自行增加登录文件
- 将所有的信息额外写入到/var/log/admin.log
- vi /etc/rsyslog.conf
- *.info /var/log/admin.log
- systemctl restart rsyslog.service
- ll /var/log/admin.log
- ####### 注意:
- systemd只要被编辑过就无法再记录
- 使日志文件只能添加不能删除:
- chattr +a /var/log/admin.log
- lsattr /var/log/admin.log
- chattr -a /var/log/admin.log
- ###### 登录档服务器
- 1、Server端:修改/etc/rsyslog.conf
- vim /etc/rsyslog.conf
- 取消注释:$ModLoad imtcp
- $InputTCPServerRun 514
- 2、重新启动与观察rsyslog喔
- systemctl restart rsyslog.service
- netstat -ltnp | grep syslog
- 至此,服务设置妥当
- Client设定:
- vim /etc/rsyslog.conf
- . @@服务器ip :这是tcp的设置
- . @服务器ip :这是UDP设定
- Client设定完毕
- ###### 登录档的轮替logrotate
- 主要的配置文件,记载多久什么状态下才将登录档进行轮替等等
- /etc/logrotate.conf
- /etc/logrotate.d/
- 对于设定chattr +a filename的日志文件可以修改某个服务的配置文件的prerotate、postrotate。
实战自定义登录档轮询
- 设定好服务的日志文件后将设定日志轮询
- 如/var/log/cron.log{
具体设定届时可百度
}
systemd-journald.service登录档信息
- 说明:作用是记录启动服务于服务若启动失败的情况
- 记录在内存(/run/log),不会保存到下一次开机
- 配置文件:/etc/systemd/journald.conf
- 详细man 5 journald.conf
- journalctl:观察登录信息
- journalctl -n 2:只观察几行
- journalctl -r 2:反向输出
- journalctl -p:排序
- journalctl -f :持续输出
- journalctl –since –until:设定开始于结束时间_PID=pid:只输出pid号码的信息
- SYSLOG_FACILITY=[0-23]:使用syslog.h规范的服务相对序号呼出正确的数据
- 命令例子:
- journalctl –since “2015-08-15 00:00:00” –until “2015-08-16 00:00:00”
- journalctl –since today
- journalctl –since yesterday –until today
- 只找出crond.service最新的10行数据
- journalctl _SYSTEMD_UNIT=crond.service -n 10
- journalctl -p err:按error错误的讯息
- //找出跟登录服务有关的文件讯息
- journalctl SYSLOG_FACILITY=4 SYSLOG_FACILITY=10
- ###### logger命令(将信息传送到登录档)
- logger -p 服务名称.等级 “讯息”
- logger -p syslog.info “test logger command”
- ###### 保存登录信息到磁盘
- mkdir /var/log/journal
开机流程、模块管理、Loader
开机流程:
核心模块的加载和移除
- insmod midulename:自行手动加载模块,如果加载的模块有相依性,则加载失败
- rmmod fat:移除模块
- modprobe modulename:加载模块
- modprobe -r modulename:移除模块
- modprobe -c :列出所有的模块
- modprobe -f modules:强制加载
- /etc/modprobe.d/*.conf:给模块加上某些参数
Boot Loader:Grub2
- 由于boot sector或者MBR只有446bytes,只安装boot loader的最小主程序。其它相关配置放置在/boot/grub2/下面
- ls -l /boot/grub2
- /boot/grub2/grub.cfg:grub2的配置文件
- 介绍磁盘代号:
- 第一颗(MBR)hd0:指代磁盘,xxx1:指代分区:(hd0)(hd0,msdos1)(hd0,msdos2)(hd0,msdos3)
- 第二颗(GPT):(hd1,gpt1)(hd2,gpt2)
- 第三颗2:(hd2)(hd2,1)(hd2,2)
- 官方建议不要直接修改/boot/grub2/grub.cfg.确实需要修改可以到/etc/default/grub文件修改,修改后必须使用grub2-mkconfig -o /boot/grub2/grub.cfg来重建grub.cfg才行
- ###### chainloader移交loader控制权
- vi /etc/grub.d/40_custom
- menuentry ‘Go to Windows 7’ –id ‘win7’ {
insmod chain
insmod ntfs
set root=(hd0,msdos2):第一颗磁盘第二个分区
chainloader +1:去boot sector将Loader软件读出来的意思
}
- menuentry ‘Go to MBR’ –id ‘mbr’{
insmod chain
set root=(hd0)
chainloader +1
}
- grub2-mkconfig -o /boot/grub2/grub.cfg
- 设定默认开机:
- vi /etc/default/grub
- GRUB_DEFAULT=win7
- ###### initramfs
- 解决Linux核心没有SATA磁盘驱动时,无法识别磁盘从而无法挂载根目录问题,一般系统自带这个文件,如果需要自行重制initramfs文件的话,使用dracut/mkinitrd来处理
- ###### 测试与安装grub2(loader)
- grub2-install /dev/sda
- grub2-install –force –recheck –skip-fs-probe /dev/sda4
- ###### 进入救援模式
- 登入系统:systemctl rescue
- 没有登入系统时:
- 按e,添加systemd.unit=rescue.target,然后按下^+x
- ###### 开机选单权限控制
- useradd test:添加用户test
- useradd manager:
- passwd test:设置密码如:123
- passwd manager
vi /etc/grub.d/01_users添加如下内容:
set superusers=”manager” //设定管理员
password manager 123 //设定管理员密码
password test 123 //一般账号
忘记root密码
1、开机进入选单
2、按e编辑该选单参数
3、找到Linux16 /Vmlinuz-添加rd.break参数
4、mount
5、mount -o remount,rw /sysroot
6、chroot /sysroot:代表根目录,暂时切换到根目录/sysroot
7、echo "new_passwd" | passwd -stdin root
8、touch /.autorelabel:让系统开机时自动恢复SELinux的安全本文
9、exit
10、reboot
基础系统设定与备份策略
- DHCP:设定上网的方式
- netmask:子网掩码
- DNS:168.95.1.1
- 以太网协议所开发出来的以太网卡eth0
- ifconfig -a:查看有多少网卡
- nmcli connection show:查出网卡代号
- nmcli connection show ens33:查阅该网卡号的详细信息
设定网卡参数:
nmcli connection modify ens33 \
connection.autoconnect yes \
ipv4.method manual \
ipv4.addresses 172.16.1.1/16 \
ipv4.gateway 172.16.200.254 \
ipv4.dns 172.16.200.254
nmcli connection up ens33
nmcli connection show ens33
自动取得IP
- ifocnfig -a:取得网卡代号
- nmcli connection modify 网卡代号 connection.autoconnect yes ipv4.method auto
- nmcli conneciton up 网卡代号
修改主机名
- hostnamectl:查看主机名信息
- hostnamectl set-hostname 主机名
- cat /etc/hostname:查看主机名
日期与时间的设定
- timedatectl:查看当前时间设定信息
- timedatectl list-timezones:查看支持的所有的时区
- timedatectl set-timezone 时区名:设定时区
- timedatectl set-time “yyyy-mm-dd HH:MM”
- /etc/locale.conf:语系配置文件
- localectl:系统的语系
- locale:当前bash的语系
- localectl set-locale LANG=en_US.utf8
查询硬件
备份目录
- /etc
- /home
- /root
- /var/spool/mail,/var/spool/cron/,/var/spool/at/
- /var/lib/
不需要备份
- /dev
- /proc /sys /run
- /mnt /media
- /tmp
完整备份常用工具
dd :可以直接读取磁盘的扇区,而不理会文件系统;
dd if=/dev/sda of=/dev/sdb
cpio:能够备份所有的档名,得要配合find;
find / -print | cpio -convB > /dev/st0 磁带机的意思;还原:cpio -iduv < /dev/st0
- xsdump:累积备份;
第一次完整将/home备份起来
xfsdump -l 0 -L 'this is full backup' -M 'this is full backup' -f /backupdata/home.dump /home
第二次累积备份
xfsdump -l 0 L 'full-1' M 'full-1' -f /backupdata/home.dump1 /home
-tar
/backupdata是个独立的文件系统,备份整个系统。排除不必要的/proc /mnt /tmp
tar --exclude /proc --exclude /mnt --exclude /tmp --exclude /backupdata -jcvp -f /backupdata/system.tar.bz2 /
完整备份之差异备份
比2017-05-09还要新的文件,目录还是会记录下来,只是目录内的旧文件不会备份
tar -N '2017-05-09' -jcvp -f /backupdata/home.tar.gz2 /home
镜像备份
将/home镜像到/backupdata/home去
rsync -av /home /backupdata/
再次执行快很多
rsync -av /home /backupdata/
远程备份
rsync -av -e ssh 本地需要备份目录 远程用户名@远程IP:远程目录
系统服务
- CentOS7以前使用的是:init.d
- CentOS7使用的是:systemd
- ###### systemd配置文件目录:
- /usr/lib/systemd/system:每个服务主要启动脚本
- /run/systemd/system:系统执行过程中所产生的服务脚本
- /etc/systemd/system:管理员所建立的执行脚本
- 以上目录下的文件的执行优先级一层比一层高
- ###### systemd的分类看扩展名:
- .service:一般服务类型
- .socket:内部程序数据交换的插槽服务
- .target:一群unit的集合
- .mount/.automount:文件系统挂载相关的服务
- .path:侦测特定文件或目录
- .timer:循环执行的服务
- ###### systemctl管理服务
- 管理单一服务:
- systemctl [command] [unit]
- command主要有:start、stop、restart、reload(不关闭unit情况下重载配置文件)、enable(设定下次开机时启动)、disable(设定下次开机时不会被启动)、status(目前后面接的状态)、is-active(目前有没有在运作中)、is-enable(开机时有么有预设要启动这个unit)
- systemctl status crond.service
- 显示信息说明:Loaded:开机是否启动
- Active:是否正在执行
- PID
- 登录文件信息
- ###### systemctl观察系统所有的服务
- systemctl [command] [–type=TYPE] [–all]
- command:
- list-units:列出目前启动的unit;加上–all连没有启动的一并列出
- list-unit-files:列出/usr/lib/systemd/system内的文件启动状态
- –type:service,socket,target等
- systemctl list-units –type=service –all | grep cpu:查看type 为service的服务,不管是否启动
- ###### systemctl管理不同的操作环境
- systemctl get-default:获得当前的模式
- 常用模式有:
- multi-user.target:纯文本模式
- graphical.target:文字加上图形界面
- rescue.target:问度娘
- emergency.target:度娘
- shutdown.target:关机流程
- getty.target:设定需要几个tty
- systemctl set-default unit.target
- systemctl isolate:切换
- systemctl poweroff:系统关机
- systemctl reboot:重启
- systemctl suspend:暂停
- systemctl hibernate:休眠模式
- systemctl rescue:救援模式
- systemctl emergency:紧急救援模式
- systemctl list-dependencies unit:查看某个服务的依赖
- systemctl list-dependencies:查看当前系统模式的依赖
- systemctl list-dependencies –reverse:查看有哪些target依赖当前系统模式
- systemctl list-dependencies –reverse unit:查看谁会用到unit这个服务
- systemctl list-sockets:查看本机所有的sockets服务
- ###### 网络服务
- netstat -tlunp:查看本机监听的网络服务端口
- 通过systemctl list-units | grep 服务名称查看到这个服务
- systemctl stop units:关闭某个unit
- systemctl disable units:设定某个units开机不启动
- ###### systemctl配置文件
- /usr/lib/systemd/system/xxx.service:官方释出预设配置文件
- /etc/systemd/system/xxx.d/xxx.conf:累加其它设定
- /etc/systemd/system/xxx.service.wants/*:连接档,启动xxx服务之后启动这个目录底下的服务
- /etc/systemd/system/xxx.service.requires/*:启动xxx服务之前启动这些服务
- ###### 创建服务步骤
- 进入/etc/systemd/system/目录下新建backup.service
- 建立完成后:systemctl daemon-reload
- systemctl enable backup.service
- systemctl restart backup.timer
- systemctl list-unit-files | grep backup
- man systemd.unit
- man systemd.service
- man systemd.timer
- 上面三条语句作用是查询/etc/systemd/system目录底下的语法
进程
- ps -l:列出所有的进程(PPID=父进程)
- Alt + F[1-7]:切换窗口
- & :表示将任务放到背景执行
- Ctrl + z:将工作放到背景并暂停
- jobs -l:查看背景工作
- jobs -r:运行
- jobs -s:停止
- fg:将带有+号的最后那个工作放到前景执行
- fg -:将带有-符号的那个放到前景处理
- fg %number:指定拿出哪个放到前景处理
- bg %number:指定后台某个任务运行
- kill -9 %number:立即删除一个工作
- kill -2 %number:等同ctrl -c
- kill -15 %number:以正常的进程方式终止工作
- kill -1 %number:重新读取一次参数配置文件
- 注意:这里的背景是bash背景,不是系统背景,与那几个(tty[1-7])终端机有关。at和cron是与系统有关
- nohup 指令 &: 注销后继续工作
- nohup :前景工作
- ps -l:列出属于自己bash的所有进程
- ps aux:列出系统的所有进程
- ps -lA:
- ps axjf:进程树
- 说明:ps是摄取某个时间点的进程状态
- top:则可以持续侦测进程运作的状态
- top -d 2:2秒更新一次,默认是5秒
- top -p number:指定某个pid
- top后可按P(CPU) M(MEMORY) N(PID) T(CUP TIME+)q(quit)?查看可输入的指令
- top -b(批次) -n(次数) 2 > /tmp/top.txt
- echo $$:bash pid
- pstree -A:列出进程的相关性,ASCII码
- pstee -u -p(PID):
- killall -i -9 bash:
- ##### 进程优先级:
- PRI = PRI-NI
- nice -n [-20-19] [0-19] command:执行命令时就设置优先级
- renice -[-20-19] [0-19] PID:调整已经存在的进程优先级
- ##### 内存
- free -h:系统自动选择使用什么单位
- free -s 2:2s观察一次
- free -s 2 -c 3:观察3次
- free -t:计算swap 和物理内存
- uname -a:
- uptime:
- netstat:
- vmstat:
- vmstat-d:磁盘相关
- vmstat 1 3
- dmesg:
- fuser -uvm dirname:找出某个文件/装置有哪些进程在访问
- fuser -mki dirname:删除某文件/装置的进程访问
- lsof:列出目前系统所有开启的文件
- lsof -u root -a -U:root的socket文件
- lsof +d /dev:所有被启动的周边装置
- lsof -u root | grep bash:列出root的bash这支程序所开启的文件
- pidof -s -x program_name:列出某支程序的一个PID,PPID
- ###### SELinux
- ls -Z:列出某个目录的SELinux相关信息
- ps -eZ | grep -E ‘cron|bash’:获取某个进程的SELinux政策本文,关键是第三个字段type
- getenforce:查看当前的SELinux的状态是否开启,宽容,关闭
- /etc/selinux/config:修改状态
- setenforce 0:宽容模式
- setenforce 1:强制模式
- setenforce:不能再关闭模式下切换
- getsebool -a:列出目前系统上面所有的SELinux规则的布尔值为开启或关闭值
- sestatus -b:同上
- seinfo
- seinfo -A -u -r -t -b:
- sesearch -A -s crond_t | grep spool
- sesearch -A -b(规则)
- setsebool -P 规则名称 0|1:修改规则
- getsebool 规则:查看某个规则的状态
- setsebool -P 规则名称 1:启动某个规则
- 流程:第一考虑SELinux的三种类型;第二考虑SELinux的政策规则是否放行;第三比对type;可通过sesearch找到主体进程与文件的SELinux type关系
- ll -Z filename:查看某个文件的SELinux信息
- chcon -v(显示改变信息) -t(type) -u(system_u|udified_u身份) -r(角色system_r|object_r文件或目录) -R(连同子目录一并修改) filename:
- chcon -v –reference=sourcefile targetfile:以某个文件作为参考文件设定
- restorecon -Rv dirname:恢复某个目录的预设的SELinux
- semanage:查询、修改、删除预设的SELinux type
- semanage fcontext -l | grep -E ‘^/srv’
- semanage fcontext -a -t system_cron_spool_t “/srv/mycron(/.*)?”:将目录默认值改为
- semanage fcontext -m(修改) -d(删除)
例行性工作
- #### 执行一次任务at
- 重启:systemctl restart atd
- 开机启动:systemctl enable atd
- 查阅atd状态:systemctl status atd
- at工作行程表/var/spool/at/
- 限制用户使用白名单:at:/etc/at.allow和黑名单:/etc/at.deny;缺省情况下只有root可以执行at
- 查看:atq
- 删除:atrm
- 创建:at
- #### 周期性任务 crontab
- 限制用户使用:白名单/etc/cron.allow黑名单:/etc/cron.deny(一般使用这个,列入这个文件的用户将不能使用cron)
- crontab这个指令建立工作都放置到/var/spool/cron里面去,一个账号一个文件夹
- crontab执行的日志都在/var/log/cron这个登录档
- 创建一个任务:
- crontab -e (进入vi编辑任务如0(分) 12(时) (日) (月) *(周) echo “hello”)
- 查看任务列表:crontab -l
- 删除所有的任务:crontab -r
- 系统自动读取文件:/etc/crontab
- 加入任务:分 时 日 月 周 身份 命令
- /etc/cron.d目录下文件是/etc/crontab配置文件脚本
- 错过的任务由anacron这个指令去补偿
- /etc/cron.hourly/0anacron每小时会去判断执行
- anacron执行流程:
- anacron是一支程序,已经进入crontab排程,每小时被主动执行一次。就是文件/etc/cron.hourly/0anacron。这个文件就是执行anacron -s。执行时会读取配置文件/etc/anacrontab
- 由/etc/anacrontab分析到某个任务差异天数
- 由/var/spool/anacron/某个任务名称获得最近一次执行的时间戳
- 由上个步骤与当前时间对比,若等于或大于差异天数,就准备进行指令
- 根据/etc/anacrontab的设定,将延迟(第二个字段)+ START_HOURS_RANGE的设定
- 延迟过后,开始执行
- anacron结束
- 总结:
- 建立自己个人的任务使用cron -e
- 建立系统的任务使用vi /etc/crontab
- 新建立的任务都会记录在/etc/spool/cron目录下,以用户名区分
软件磁盘阵列
- mdadm –detail /dev/md0:观察详情
- mdadm –create /dev/md[0-9] –auto=yes –level=[015] –chunk=?K –raid-devices=? –spare-devices=N /dev/sda{0,1,2}
- 说明:
- –create :建立RAID
- –auto=yes:决定建立
- –chunk=Nk:决定这个装置chunk的大小,stripe大小,一般是64K,或512k
- –raid-devices=N:使用几个磁盘作为备份
- –level=[015]:RAID0 RAID1 RAID5意思
- –detail:后面所接那个磁盘阵列详细信息
- mkfs.xfs -f -d su=256k,sw=3 -r extsize=768k /dev/md0
- mkdir /srv/raid;mount /dev/md0 /srv/raid;df -hT /srv/raid;
- RAID错误救援:
- mdadm –manage /dev/md[0-9] [–add 装置] [–remove 装置] [–fail 装置]
- –add:加入装置
- –remove:移除
- –fail:设定为出错
- 将/dev/sd7设定为出错:mdadm –manage /dev/md0 –fial /dev/sda7
- mdadm –manage /dev/md0 –remove /dev/sd7:移除,如果是实体磁盘的话就拔掉磁盘
- 开机自动挂载:
- mdadm –detail /dev/md0 | grep -i uuid
- vi /etc/mdadm.conf:ARRAY /dev/md0 UUID=xxxxxxxxxxxxxx
- blkid /dev/md0
- vi /etc/fstab
- umount /dev/md0;mount -a
- reboot
- 关闭软件RAID:
- umount /srv/raid
- vi /etc/fstab:批注自动挂载
- dd if=/dev/zero of=/dev/md0 bs=1M count=50 :清除覆盖
- mdadm –stop /dev/md0:停止
- dd if=/dev/zero of=/dev/sda6 bs=1M count=50
- dd if=/dev/zero of=/dev/sda7 bs=1M count=50
- cat /proc/mdstat:确认没有任何数组装置
- vi /etc/mdadm.conf:批注
备份文件系统
- 备份:xfsdump -l(级别) 0 -f 备份文件 文件系统挂载点
- 还原:xfsrestore -f 备份文件 文件系统挂载点
LVM
- 概念:
- 从磁盘分区出几个,设定为PV格式,建立VG组(看作为一个磁盘),将这些PV添加VG组中并设置PE(block)大小,最后再VG中分区出多个LV挂载到目录即可使用,作用是大小可伸缩(滚动条模式);通常过程需要经历如下:分区-PV-VG-LV-mkfs.xfs LVname(格式化)-mount dirname(挂载)-使用
- #### 实战PV:
- 第一步:分区
- lsblk
- fdisk/gdisk /dev/sda
- partprobe
- 第二步:设置SystemId=8e
- fdisk /dev/sda;t;10;8e;w;
- 第三步:查看当前的系统任何具有PV的磁盘
- pvscan
- 第四步:将分区好的建立成PV格式(一个分区对应一个PV)
- pvcreate /dev/sda{6,7,8,9,10}
- 再查看:pvscan
- 单个查看:pvdisplay /dev/sd6
- 恢复为正常分区:pvremove /dev/sda6
- #### 实战VG:
- 第一步:创建VG
- vgcreate -s 16M[G|T](PE大小) lzyvg(VGname) /dev/sda{6,7,8}(PVname)
- 查看:vgscan;pvscan;
- 单独查看:vgdisplay lzyvg
- 从VG删除一个PV:vgreduce lzyvg(VGname) /dev/sda10(PVname)
- 添加一个PV到VG:vgextend lzyvg(VGname) /dev/sda10(PVname)
- #### 实战LV
- 第一步:从某个VG中创建LV
- lvcreate -L 2G(LV大小) -n lzylv(LVname) lzyvg(VGname) 或者:
- lvcreate -l 50(PE个数)
- 查看:lvscan;lvdisplay /dev/lzyvg(VGname)/lzylv
- #### 实战格式化、挂载、使用
- mkfs.xfs /dev/lzyvg/lzylv
- mkdir /srv/lvm
- mount /dev/lzyvg/lzylv /srv/lvm
- df -hT /srv/lvm
- cp -ap /etc /var/log /srv/lvm
- df -hT /dev/lzyvg/lzylv
- #### 实战LV放大100M(XFS文件系统放大后不可缩小,EXT可以)
- 第一步查看VG容量是否充足(PE size)
- vgdisplay lzyvg(VGname)
- 第二步:放大LV
- lvresize -L[-l](当-l时后面接的是PE数量) +100M[-100M] /dev/lzyvg/lzylv
- 查看:lvscan
- df -hT /dev/lzyvg/lzylv
- 第三步:创建blick组(agcount)到文件系统
- 查看:xfs_info /srv/lvm(文件系统挂载目录)
- 重点命令:xfs_growfs /srv/lvm
- 查看:xfs_info /srv/lvm
- df -Th /srv/lvm
- ls -l /srv/lvm
- #### 完毕!
- #### thin pool(磁盘容量存储池,实际用多少,支付多少)
- 第一步:查看VG的剩余可用磁盘空间(Free PE)vgdisplay lzyvg(VGname)
- 第二步:从VG中取出(如果足够的话)1G来做出一个名为lzypool的thin poolLV装置
- lvcreate -L 1G -T lzyvg/lzypool
- 查看池信息:lvs lzyvg
- 第三步:创建10G的装置
- lvcreate -V 10G -T lzyvg/lzypool(thin name) -n lzythin(LVname)
- 再查看池相关信息:lvs lzyvg
- 第四步:格式化文件系统
- mkfs.xfs /dev/lzyvg/lzythin
- 创建挂载目录:mkdir /srv/thin
- 第五步:挂载
- mount /dev/lzyvg/lzythin /srv/thin
- 查看:df -Th /srv/thin
- 测试:dd if=/dev/zero of=/srv/thin/123.img bs=1M count=500
- 注意:分区LV有10G,但是实体的池只有1G可用。如果LV挂载的目录下使用超过池的话,可能会导致数据毁坏!
- #### 实战快照
- 查看VG这个磁盘还剩多少容量:vgdisplay lzyvg
- 第一步:创建LV快照
- lvcreate -s -l 26 -n lzysnap(快照LVname) /dev/lzyvg/lzylv(要被快照的区LVname)
- 查看详细:
- lvdisplay /dev/lzyvg/lzysnap
- 第二步:挂载
- mkdir /srv/snap
- mount -o nouuid(XFS不允许相同的UUID文件系统挂载) /dev/lzyvg/lzysnap /srv/snap
- df -Th /srv/lvm /srv/snap:可以观察是一模一样的
- 第三步:改动被快照文件
- 第四步:备份快照文件系统
- xfsdump -l 0 -L testsnap -f /home/lvm.dump /srv/snap
- 第五步:卸载快照和目标的挂载
- umount /srv/snap
- umount /srv/lvm
- 第六步:删除快照LV
- lvremove /dev/lzyvg/snap
- 第七步:格式化目标文件分区为XFS文件系统
- mkfs.xfs -f /dev/lzyvg/lzylv
- 第八步:重启挂载目标文件系统
- mount /dev/lzyvg/lzylv /srv/lvm
- 第九步:还原快照备份
- xfsrestore -f 备份文件 文件系统挂载目录
- 完毕
- #### 删除LVM
- 第一步:卸载所有的LV(逻辑文件系统)挂载
- umount /srv/lvm /srv/thin /srv/snap
- 查看:lvs VGname
- 第二步:删除所有LV
- lvremove /dev/lzyvg/lzylv /dev/lzyvg/lzypool
- 第三步:让VGname这个VG不具有Active的标志
- vgchange -a n VGname
- 第四步:删除VG(逻辑磁盘)
- vgremove lzyvg(VGname)
- 第五步:删除PV(逻辑分区)
- pvremove /dev/sda{5,6,7,8,9,10}
- 第六步:利用fdisk将SystemId 8e改回83
- 完毕
磁盘配额quota和文件系统进阶
Linux账号管理
计算从1970-01-01至今的毫秒数
$((`date –date=”2015/05/04” +%s`/86400+1))
/etc/passwd文件记录Linux系统的所有账号,UID,GID,用户名,家目录,使用bash信息
- /etc/shadow文件记录Linux系统的所有账号的用户名、密码、密码改动日期、密码在多少天之后才能改动、密码过期日期、距离密码过期时间多少天前提示、过期后的宽限天数、彻底过期时间、保留字段
- 修改一般用户密码:root用户用passwd命令
- /etc/group:系统所有组文件
- /etc/gshadow:系统所有组密码文件
- groups/id:当前登录用户支持的群组,第一个为建立文件有效群组
- newgrp:切换有效群组
- usermod -a -G groupname username:root执行将某个用户添加到某个组
- useradd -u 指定UID -g 初始群组 -G 次要群组 -m 强制要建立家用户目录 -M 强制不建立家目录 -d 家目录绝对路径 -r 告诉系统建立系统账号(UID&GID<1000) -c 说明 -s shell 账号名称
- useradd -D :列出当前添加用户的默认值
- /etc/default/useradd:设定添加用户默认值
- /etc/skel :新建用户的家目录数据都是从该目录下复制过去的
- /etc/login.defs:新建用户密码默认值参考文件
- passwd -l 给/etc/shadow 第二栏加!-u 取消使密码失效功能 -n 设定/etc/shadow第四个字段指多久内不能改密码 -x 多久必须改密码 -w 密码过期前的警告天数 -i 第七字段密码失效后宽限天数 –stdin 接受管道标准输入 用户账号名(注意:如果不加用户账号名则修改自己也就是当前登录用户的密码)
- passwd -S 账号名:显示所有的密码设置项
- chage -l列出该账号详细参数 -d 修改(3)最近一次更改密码日期YYYY-MM-DD -E 修改(8)彻底失效日期YYYY-MM-DD -I修改(7)密码失效天数 -m修改(4)密码最短保留天数 -M修改(5)密码多久需要变更 -W 修改(6)过期前警告天数
- 使用户首次登陆需要修改密码:
- useradd test
- echo “test” | passwd –stdin test
- chage -d 0 test :关键命令!
- chage -l test | head -n 3 :看一下
- usermod -c(passwd-5) -d(passwd-6) -e(passwd-8 format:YYYY-MM-DD) -f(shadow-7 天数) -g(passwd-4) -G(group 次要组) -a(添加次要组,而非设定,和-G配合使用) -l(passwd-1) -s(passwd-shell) -u(passwd-3) -L(冻结用户) -U(解除冻结) username
- userdel -r username:删除用户
- find / -user username:找出属于该用户的文件
- demasg | grep -i acl
- setfacl -m u:lzy:rwx filename/dirname:设定某个用户的权限
- setfacl -m u::rwx filename/dirname:设定该文件拥有者权限
- setfacl -m g:lzy:rx filename/dirname:设定某个组拥有该文件的权限
- getfacl filename/dirname:获取该文件的权限设置详细
- setfacl -m m:r filename/dirname:设定mask值(有效权限)
- setfacl -m d:u[g]:[usernames]:rwx file/dir:目录使具备继承能力
- setfacl -b 档名:删除所有的ACL设定
- setfacl -x u:[usernames]: file/dir:删除某些用户的ACL设定
- setfacl -m u:[usernames]:- file/dir :使某些用户的权限为—
- su - username / su -l username :切换用户包括环境
- su username:不包括环境
- su - -c “cat /etc/passwd”
- sudo -u username “指令”:使用某个账号
- sudo -u username sh -c “一串指令”
- /etc/sudoers文件指定谁能用sudo指令。默认只有root能用
- 修改/etc/sudoers (visudo)%wheel 设置该组用户可执行sudo命令
- User_Alias ADMPW= useranme1,username2
- Cmnd_Alias ADMPWCOM = !/user/bin/passwd,/usr/bin/passwd [a-zA-Z]*,!/usr/bin/passwd root
- Host_Alias = (主机)
- AMDPW ALL=(root) ADMPWCOM:设定某些用户只能执行某些指令
- write username
- ^c 结束输入
- mesg n:关闭接收消息
- mesg y:开启接受消息
- wall username:给所有用户发广播
- mail -s “邮件标题” username@localhost :注意消息输入后以.号结束
- mail -s “邮件标题” username@ip < filename
- pwck :检查密码
- grpck:检查群组
- pwconv:手动建账号时有用 /etc/passwd -> /etc/shadow
- pwunconv:这个命令与pwconv相反禁用
- 添加用户时默认设置和限制在文件/etc/login.defs /etc/default/useradd
- usermod -a -G [groups] username:append 次要群组
if else
if [ “1” -lt “2” ];then
echo “ok”
elif [ “1” -eq “1” ];then
echo “no”
else
echo “contine”
fi
or
s=”test”
case ${s} in
“test”)
echo “this is test”
“ceshi”)
echo “this is ceshi”
esac
循环
read -p “Please input a number ,I will count it:” nu
s=0
while [ “ nu”>0]dos= (( s+ {nu})
nu= (( {nu}-1))
done
or
for (( i=0; i<= nu;i++))dos= (( s+ {i}))
done
or
for i in (seq 1 nu)dos= (( s+ {i})
done
or
#for i in (echo {a..g}) do echo ${i} done
for i in (1.. nu)dos= (( s+ {i}))
done
echo “The result is :${nu}”
正规表示法
- dmesg | grep -A2 -B3 -n ‘XFS’
- grep ‘the’ filename
- grep -n ‘the’ filename 行号
- grep -nv ‘the’ filename 取反
- grep -ni ‘the’ filename 忽略大小写
- grep -n ‘th[ie]’ filename 可选
- grep -n ‘[^o]th[ie]’ filename 排除
- grep -n ‘[^a-z]th[ie]’ filename
- grep -n ‘[\^[:lower:]]thi’ filename 排除小写,不受编码影响([:alnum:]=0-9,a-z,A-Z [:alpha:]=a-z,A-Z [:blank:]=空格,TAB [:cntrl:]=控制键 [:digit:]=0-9 [:graph:]=除空格和TAB键外其他所有 [:lower:]=a-z [:print:]=可以被打印的 [:punct:]=标点符号’,”,?,!,;,:,#,$…[ [:upper:]=A-Z [:space:]=任何可产生 空白的键 [:xdigit:]=16进制)
- grep -n ‘^[^a-zA-Z]’ filename
- grep -n ‘^$’ filename
- grep -n ‘\.$’ filename
- grep -v ‘^$’ filename | grep -v ‘^#’ 去掉批注和空白行
- nl /etc/passwd | sed ‘2a jiazaixiamian’
- nl /etc/passwd | sed ‘2i shangmian’ 第二行上面增加
- nl /etc/passwd | sed ‘3a jiazai\
- disanhang\
- duohangshuju’
- nl /etc/passwd | sed ‘2,5d’
- nl /etc/passwd | sed ‘2,6a nihao’ 2-6行下面新增nihao
- nl /etc/passwd | sed ‘2,5c tidai’ 将2-5行替代为tidai
- head -n 20 | tail -n 10 获得11-20
- nl /etc/passwd | sed -n ‘5,9p’ 显示56789行数据
- grep -n ‘^root’ /etc/passwd | sed ‘s/^1.*x//g’ | sed ‘s/:root.*//g’
- grep ‘MAN’ /etc/passwd | sed ‘s/#.*//g' | sed '/^/d’
- sed -i ‘$a #test insert to file’ filename 在文件末尾加入
- egrep -n ‘go+d’ filename 一个或一个以上
- egrep -n ‘go?d’ filename 0个或1个
- egrep -n ‘go*d’ filename 0个或多个前面的字符
- egrep ‘gd|hao|ni’ filename 或
- egrep ‘(sd|bd)a’ filename 找sda或bda
- last -n 5 | grep -v ‘^' | awk '{print1 “\t” NR “\t” NF “\t” FS} 打印出第一个字段默认空格分割,目前行数,总行数,分割符’
连接档
- ln /etc/passwd /tmp/passwd-ln 只能连接文件(档名指向相同的i-node)
- ln -s /etc /tm/etc-ls 软连接可连接文件和目录(blok记载另一个档名)
变量
- env = export 查看环境变量
- export var 将变量设为全局
- set 观察bash环境下所有变量
- $? 查看上次指令执行正确否0=success
- locale 看语系
- read var
- ulimit 限制用户使用资源情况
- && || 处理连续命令下达,三目
查看列表
- ls -l /
- ls -al /
- ls -ld /
- ls -ald /
- ls -il /
- ls -ila /
- ls -ild /
- ls -ld /abc
- ls -alSF /
- ls -alSF –full-time /
- ls -iSF /
- ls -hl
- ls -k
- ls -ld /bin/???? 四个字符
- ls -ld /bin/[^a-b]*
复制
- cp -a /etc/passwd /tmp/passwd
- cp -p -R / /tmp/root_back
打包压缩
- tar -zcv -f /tmp/back.tar.gz /etc/
- tar -Jcv -f /tmp/back.tar.xz /etc/
- tar -jcv -f /tmp/back.tar.bz2 /etc/
- tar -zxv -v
- tar -Jxv -f
- tar -jxv -f
- tar -ztv -f /tmp/back.tar.gz
- tar -Jtv -f /tmp/back.tar.xz
- tar -jtv -f /tmp/back.tar.bz2
- tar -zcv -f /tmp/back.tar.gz -exclude=filename –exclude=dirname /etc
- tar -zcvf - /home | tar -zxvf - -C /tmp
创建目录
- mkdir -m 7775 /tmp/test; rm -rf /tmp/test
- mkdir -m 4770 /tmp/test
- mkdir -m 2555 /tmp/test
- mkdir -m 1755 /tmp/test
- mkdir -p /data/test
新建删除用户/组
- groupdel project
- groupadd project
- userdel test
- useradd -g project test
- passwd test
切换退出root
- su -
- exit
- /etc/issue 修改登录提示
- /etc/motd 修改登录后提示
分区,格式化,挂载
- lsblk
- parted /dev/sda print
- fdisk /dev/sda –>MBP
- gdisk /dev/sda –>GPT
- fdisk m p n enter +1G p w q …
- blkid /dev/sda3
- lsblk
- partprobe
- lsblk
- mkfs.xfs /dev/sda3
- mount /dev/sda3 /data/sda3
- partprobe
- df -h /dev/sda3
- umount /dev/sda3 或 umount /home
- partprobe
- df -h /dev/sda3
- vi /etc/fstab
- /dev/sda3 | UUID=? xfs|swap| /data/sda3 0 0
- :wq | ZZ
- mount -a
- mkswap /dev/sda5
- mount /dev/sda5 /data/sda5
- swapon /dev/sda5
- swapon -s
- swapoff /dev/sda5
- partprobe
- lsblk
- dd if=/dev/zero of=/data/sd6 bs=1M count=500
- mount -o remount dirname:重新挂载
- /etc/fstab :启动立即挂载文件
- mount -a :测试/etc/fstab 开机挂载文件
- mount 列出挂载详细
less more nl cat
- cat filename
- cat -n filename
- tac filename
- tac -n filename
- less -n filename
- more -n filename
- nl -b a -n rz -w 3 filename
- head -n 3 /etc/passwd
查找命令
- find / -name test
- find / -type s|f
- find / -perm 2000 属于SUID即可
- find / -size +50G
- find / -size -50G
- find / -size +50G | find -size -100G -exec ls -l {} \ ;
- whereis filename
- type comman
- file filename
- type ls; type man
- which ls;
管道命令
- echo ${PATH}|cut -d “:” -f 3,5
- export | cut -c 12- 从12个字符开始
- find / -name test | cut -c 12-20
- last | tr ‘[a-z]’ ‘[A-Z]’
- cat /etc/passwd | tr -d ‘:’
- cat -A /etc/man_db.conf
- cat /etc/man_db.conf | col -x | cat -A | more
- join -t ‘:’ /etc/passwd /etc/shadow | head -n 3
- join -t ‘:’ -1 4 /etc/passwd -2 3 /etc/group | head -n 3
- find / tr -d ‘/’
- cat /etc/passwd | tr -d ‘\r’ > ~/passwd.linux.format
- cat /etc/group | paste /etc/passwd /etc/shadom - | head -n 3
- grep ‘^MANPATH’ | /etc/man_db.conf | head -n 3 | expand -t 6 - | cat -A
- split -b 200k /etc/services service
- ls -lhS service* 分为小文件
- cat services* >> serviceback 合并
- ls -al / | split -l 10 - list-root 10行分一个文件
- id root 查UID/GID
- cut -d ‘:’ -f 1 /etc/passwd | head -n 3 | xargs -n 1 id 处理id只接受一个参数
- cut -d ‘:’ -f 1 /etc/passwd | xargs -n 1 -p id
- cut -d ‘:’ -f 1 /etc/passwd | xargs -n 1 -e’sync’ -p id
- vi ~/.bash_logout
- date >> ~/.myhistory
- history 50 >> ~/.myhistory
- clear
- unset var
- unalias alias
变量宣告
- declare -i sum=1+3
- echo $sum output: 4
- declare -a arr
- arr[1]=1
- arr[2]=2
- echo ${arr[2]}
- declare -x USERNAME = export USERNAME 宣告为环境变量=全局
重定向流
- echo “message” > filename
- echo “message” 1> filename
- echo “message” 2> filename 错误信息
- echo “error message” 1>&2 转换为错误信息格式
- find / -name test > filename 2>&1 filename 将正确和错误一起累加同一文件
- echo “add” >> filename
- cat > filename << “end”
- last | cut -d ’ ’ -f 1
- last | grep ‘root’
- last | grep -v ‘root’
- grep –color=auto ‘MANPATH’ /etc/man_db.conf
- last | tee last.list | cut -d ’ ’ -f1
- ls -l /home | tee home.list | more
- ls -l / | tee -a home.list | more 累加
排序
- cat /etc/passwd | sort
- cat /etc/passwd | sort -t ‘:’ -k 3 -n
- last | cut -d ’ ’ -f1 | srot | uniq -c -i 忽略大小写并计数
- cat /etc/man_db.conf | wc 列出行、字数、字符数
- cat /etc/passed | wc -l
- last | grep [a-zA-Z] | grep -v ‘reboot’ | wc -l
登录、关机、重启
- last
- sync;sync;reboot
- sync;sync;shotdown -h 5 5秒后关机
- sync;shtdown -h now 现在关机
vi vim
- hl jk
- gg = G
- G
- yy
- 10yy
- p
- dd
- 10dd
- ^
- $
- 10x
- d1G
- dG
- ^v
- V
- v
- yy
- p
- sp
- sp filename
- ^j
- ^k
- :q
- :wq
- :q!
- :wq!
- ZZ
- :1,10s/man/MAN/g 替换
- :1,$/man/MAN/gc
- :set nu
- :set nonu
- esc
- i
- I
- o
- a
- O
- A
- vi filename
- ^z
- vi filename
- D|O|
- /findstr 向下 n N
- ?findstr 向上 n N
- dos2unix filename unix2dos 处理断行符号