Linux基础管理
-
Linux基础
- Linux简介
时间
事件
1965年
美国麻省理工学院(MIT),通用电气公司(GE),贝尔实验室AT&T,合力开发mnltics系统,没有成功
1969年
肯.汤普森在DEC PDP-7机器上开发出Unix系统
1971年
肯.汤普森和其同时丹尼斯里奇发明C语言
1973年
Unix绝大部分用C语言重写,提高了可移植性
1987年
谭宁邦教授开发了minix系统,并开发源代码
1991年
李纳斯开发Linux系统
Unix发行版本
操作系统
公司
硬件平台
AIX
IBM
PowerPC
HP-UX
HP
PA-RISC
Solaris
SUN
SPARC
Linux版本分类
内核版
www.bemel.org
2.6.32版本
RHEL 6
3.10.x版本
RHEL 7
发行版
Redhat系列
个人版
fedoras桌面版
企业版
RHEL(Redhat Enterprise Linux)其中包括(turbo Linux,mandriva,centos,suse,fedora,gentoo Linux)
Debian系列
Ubuntu(开发人员常用,软件多,图形界面好看)还有KNOPPIX
开源软件
软件名
作用
Apache
web服务器
Nginx
web服务器
MySQL
数据库
MongoDB
NOSQL数据库(用于提升MySQL数据库性能还有redis)
PHP
脚本语言
Python
脚本语言
Ruby
脚本语言
Samba
Linux和Windows之间内网文件服务器
Sphinx
中文分词
# GPL:使用的软件是开源的,做出的软件也必须开源
- Linux装机基本配置
分区
1."/"根分区(工作中一般分200G左右)
2."swap"交换分区(也就是虚拟分区)真实内存小于4G,swap分区分2倍大小,真实内存大于4G,swap分区分内存一样大小
3."boot"启动分区,建议200M大小
格式化
写入文件系统
设备文件名
/dev/sda等
挂载点
/mnt /media /misc访问分区的路口,使用已建立的空目录作为挂载点
IP地址配置步骤
vim /etc/sysconfig/network-scripts/ifcfg-eth0
ONBOOT=
开机启动网卡配置,默认no,需要改为yes
BOOTPROTO=
默认IP获取方式,默认dhcp,更改为none或static(静态)
IPADDR=
ip
NETMASK=
子网掩码
GATEWAY=
网关
DNS1=
DNS
Root目录默认文件
文件名
作用
install.log
安装了哪些软件包记录
install.log.syslog
增加的用户和用户组
Anaconda-ks.cfg
系统安装步骤(批量安装模板)
- Linux操作注意事项
1
Linux中严格区分大小写,没有大小命令,有大写选项
2
Linux下所以内容都是以文件形式保存
3
Linux不靠扩展名区分文件类型
4
所有存储设备必须挂着之后才能使用
5
Windows的程序不能直接在Linux下安装
6
修改配置文件,永久生效
服务器注意事项
1
远程服务不允许关机,只能重启(服务器大多在异地)
2
服务器重启时应该关闭服务(保护硬盘)
3
不要在服务器访问高峰运行高负载命令(最好在凌晨4-5点)
4
远程配置防火墙时不要把自己踢出服务器(配置时,写定时任务,定时清除防火墙配置)
5
指定合理的密码并定时更新
6
合理分配权限
7
定期备份重要数据和日志(异地多次分布保存)
链接命令注意事项
命令
ln 选项源文件连接文件名
硬链接
1.拥有相同的inode和block,可以看出相同文件
2.修改任何一个文件,另一个文件也会改变
3.删除其中一个文件,另一个文件还能使用
4.不能链接目录
5.不能跨分区链接
6.两个文件特征不明显,不推荐使用
软链接
1.有自减的iNode和block,但block中不记录实际数据,只写入源文件的文件名和inode号
2.修改任何一个文件,另一个文件也会改变
3.删除源文件,软链接无法使用
4.无论源文件多大,软链接大小不变
5.软链接拥有最大权限,但访问受源文件权限限制
6.能跨分区链接
7.能链接目录
8.特征明显,推荐使用
-
linux一级目录定义
/bin/ 存放系统命令,普通用户和超级用户都可以执行
/sbin/ 存放系统命令,只有超级用户可以执行
/usr/bin/ 存放系统命令,普通用户和超级用户可以执行
/usr/sbin 存放系统命令,只有超级用户可以执行
/boot/ 系统启动目录
/dev/ 设备文件保存位置
/etc/ 配置文件保存位置
/home/ 普通用户家目录
/lib/ 函数库保存位置
/lost+found/ 系统崩溃或意外关机,数据修复用。
/media/ 挂载目录
/mnt/ 挂载目录(习惯)
/misc/ 挂载目录
/opt/ 软件安装位置,习惯用/usr/local/目录
/proc/ 虚拟文件系统,该目录中的数据不是保存在硬盘中,而是保存在内存中
/sys/ 虚拟文件系统,该目录中的数据不是保存在硬盘中,而是保存在内存中
/root/ 超级用户保存位置
/srv/ 服务数据目录
/tmp/ 临时目录(如果安装mysql,则有两个文件在这个目录,重要)
/usr/ 系统软件资源目录
/usr/lib/ 函数库保存位置
/usr/x11R6 图形界面系统保存位置
/usr/local/ 软件安装位置(习惯)
/usr/local/src 源程序保存位置(下载的源代码包)
/usr/src/kernels 内核源码保存位置(学习或重编用的)
/usr/share/ 帮助,说明文档保存位置
/var/ 动态数据保存位置
/var/log/ 系统日志保存位置
/var/lib/mysql (rpm包安装) mysql数据库保存位置(用于数据库备份)
/var/www/html (rpm包安装) 网页保存位置
/var/spool/ 放置队列数据的目录
/var/spool/mail/ 用户名 放置用户的邮箱
/var/spool/cron/ 存放系统定时任务
/var/run/ 一些服务和程序运行后,他们的PID(进程ID)保存在这
-
基本权限管理
- - - - - - - - - - .文件权限行
第一位表示文件类型
第二位到第四位一组表示U所以者权限
第五位到第七位一组表示G所属组权限
第八位到第十位一组表示O其他人权限
第11位表示seLinux保护文件
对文件的意义
r 读取文件内容
w 编辑,新增,修改文件内容,但不包括删除(只有上级目录有w权限,才可以删除目录下文件)
x 可执行
注:目录下的文件中,文件名和inode节点号是存储在当前目录中的
对目录的意义
r 可以查询目录下文件
w 具有修改目录结构的权限
x 访问
最大权限:最大权限具有安全风险,需要小心使用
文件:x权限最大
目录:w权限最大
目录可用权限
r---4 w---2 x---1
0:最小权限
5:标准权限
7:最大权限
(其他权限没有意义)
umask:文件和目录的默认权限
umask 022 临时生效
文件最大默认权限:666 (x权限是文件最大权限,不能默认)
/etc/profile环境变量配置文件,umask权限永久生效
配置文件决定
超级管理员:0022
普通用户:0002/0022
-
查找文件命令
locate 文件名 (在文件名数据库中查找,快速)
Updatedb 强制更新数据库(使用locate时需要更新下数据库)
/var/lib/mlocate/mlocate.db文件名数据库位置
/etc/updatedb.conf 配置文件,用于定义locate命令查找位置
通配符(find)
* 任意内容
? 任意一个内容
[] 中括号内任意一个内容 [abc] [0-9] [A-Z] [A-Za-z]
正则表达式(grep)
* 前一个字符重复任意多次
? 前一个字符重复0次或1次(要用egrep命令使用)
[] 中括号内任意一个内容
^ 行首符
$ 行尾符
find命令:在系统中,搜索符合条件的文件名,如果需要匹配,则完全匹配
格式:find 目录路径 -name 文件名
grep命令:在系统中,搜索符合 条件的字符串,如果需要匹配,则使用包含匹配
格式:grep "字符串" 文件名
-
登入终端
tty1-tty6:本地登入终端,共6个,alt+F1-F6(切换)
tty7:本地图形终端ctrl+atl+F7
pts/0:0-255,远程终端连接,支持256个
-
vim纯文本编辑器
~/.vimrc配置文件
注:~/.vimrc配置文件不存在,需手工建立,用于配置vim
双文件打开方式
vim -o 文件名 文件名 同时打开上下窗口,ctrl+w 上下键切换
vim -O 文件名 文件名 同时打开左右窗口,ctrl+w 左右键切换
进入插入模式
a 追加 A 行尾
i 插入 I 行首
o 下行打开 O 上行打开
退出与保存
:q在没有修改时,退出
:q!强制不保存退出,所有用户都可以用,用于放弃修改
:wq!用于强制保存退出,只有root可以使用,强行写入数据
删除
x:删除光标所在字符
nX:删除n个字符
dd:删除整行(具有粘贴功能)
:n,nd 删除指定范围行(具有粘贴功能)
dG:删除删除光标所在行到结尾(具有粘贴功能)
dd 删除行
字体颜色
:syntax on/off 开启或关闭vim颜色
查找
/ 查找字符 n:下一行 N:上一行
替换
r:替换光标所在处字符
R:从光标所在处开始替换,按esc结束
:1,10s/old/new/g 替换1到10行的old内容为new
:%s/old/new/g 替换全文本内容
:1,10s/^/#/g 添加1到10行行首注释
:1,10s/^#//g 取消注释
:1,10s/^/\/\//g 添加//注释,\转移符,取消特殊字符意义
:1,10s/^\/\///g 取消注释
粘贴
p:光标所在向下粘贴
大写P:光标所在向上复制
复制
yy:复制光标当前行
nyy:复制光标当前行以下n行
调用文件内容
:r 文件名 在vim中写入文件内容
调用命令结果
:r !命令 在vim中写入输入的命令内容
:r 命令 执行命令,之后继续编辑
编辑快捷命令
:map ^p I#<ESC>
:map ^b ^x
:map ^p I#<ESC> "^p"先按ctrl+v后按ctrl+p,按ctrl+p添加注释
:map ^B ^x 删除注释
:ab 源字符 替换为字符
:ab mymail shenchao@lampbrother.net #输入mymail时替换为shenchao@lampbrother.net
键盘符: h:左 j:下 k:上 l:右
命令模式快捷操作
gg:光标移动到行首
G:光标移动到行尾
^:行首符
$:行尾符
u:撤销
ctrl+r:反撤销
显示行号
:set nu 显示行号
:set nonu 关闭行号
-
软件安装
-
软件包介绍
1、源码包
2、二进制包(RPM包)
源码包:编译安装(C语言,Java语言)
优点:
1、开源,有能力可以自己修改
2、可以自由选择所需要功能
3、软件是编译安装,更适合,更高效,更稳定
4、卸载方便
缺点:
1、安装步骤较多,容易出错
2、编译时间太长
3、因为是编译,报错新手难以解决
二进制包
二进制包分类:直接安装(PHP,Python,shell)
1、deb包
2、RPM包
优点:
1、包管理简单,只通过几个命令就可以实现包的安装,升级,查询和卸载
2、安装速度比源码包安装快的多
缺点:
1、经过编译,不能再看到源代码
2、选择不如源码包灵活
3、依赖性,树状依赖,环形依赖,模块依赖
语言分类(根据安装方式)
编译语言:C语言,Java语言
脚本语言:shell,php,Python
软件包选择原则
1、如果软件是有大量客户端访问的,选择源码包安装,效率高,稳定
2、如果软件访问量少或本机使用,选择rpm包,安装简单
包名使用
1、如果操作系统已经安装的软件包,使用包名,因为包名存在RPM包数据库中,不需要路径查找,数据库位置\var\lib\rpm\
2、如果操作系统未安装的软件包,使用包全名,需要绝对路径
- RPM检验
RPM -V 包名 #检验已安装包的信息
S
安装包大小是否改变
M
文件类型或权限是否改变
5
MD5是否改变
D
设备中,从代码是否改变
L
文件路径是否改变
U
文件所有者是否改变
G
文件所属组是否改变
T
文件修改时间是否改变
c
配置文件
d
普通文档
g
鬼文件,不应该存在的文件
l
授权文件
r
描述文件
-
加密类型
对称加密:加密和解密密码一样
非对称加密:加密和解密不一样,互相不用知道密码,加密度高
公钥:用于访问或接受加密文件用的
私钥:用于自己解密自己加密的文件
数字证书(重要,用于检测安装的rpm包是否改动)
包名:RPM-GPG-KEY-CentOS-6
原厂公钥文件位置与数字证书导入
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
rpm包文件提取(cpio备份恢复命令,不常用)
rpm2cpio 包全名 | cpio -idv .绝对路径(文件提取到当前目录)
补丁
只能使用在未安装的源程序上,已安装的程序是升级
定义:旧文件与新文件的不同
生成补丁: diff -Naur 旧文件 新文件 > 补丁文件
补丁导入旧文件: patch -pn < 补丁名 (-n:数字 -p:取消路径等级)
-
yum源搭建
网络yum源搭建
wget 网址 (网址:www.mirrors.163.com下载网络文件)
yum clean all (清空原来yum源缓存)
yum makecache (建立新的缓存,可以不用)
yum list (重新加载yum源,下载快速)
光盘yum源
1、装入光驱
2、mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak
3、vim /etc/yum.repos.d/CentOS-Media.repo
#修改:baseurl=file:///mnt/dvd/
#修改:enabled=1
#修改:gpgcheck=1
本地yum源
服务端:
yum -y install vsftpd
mount /dev/sr0 /var/ftp/
service vsftpd start
客户端:
yum -y install ftp
vim /etc/yum.repos.d/CentOS-Media.repo
baseurl=ftp://192.168.10.100
删除多余的条件
yum list
测试安装
yum注意事项
命令不区分包名,可以都使用包名
安装时装依赖包,卸载时卸被依赖的包,尽量不要卸载
在RHEL6.3以前,update全部升级会包括内核,使系统无法开机
可以安装同一个服务的源码包与rpm包,但只能运行一个
-
安装桌面化
yum -y install xorg*
yum -y groupinstall "X Window System"
yum -y groupinstall Desktop
yum -y groupinstall "Chinese Support"
startx #启动图形界面
init 5 #进入桌面
ctrl+alt+F1 #桌面终端
ctrl+alt+F2 #字符终端
-
源码包安装步骤
安装源码包之前先用yum -y install gcc*
1、执行命令.configure --prefix=绝对路径(指定安装位置),检测系统环境是否适合安装需求,不进行实际安装,信息会写入makefile文件里,真正安装时会读取
2、执行命令make,如果之前安装过,先执行make clean清除编译过程中的缓存和临时文件,也是不进行实际安装,信息会写入makefile文件里,真正安装时会读取
3、执行命令make install,编译安装,过程较长
4、绝对路径 start,启动服务(启动文件可以查看install文件)
5、卸载时直接删除安装的目录
函数库: so函数库对应软件程序
ko模块函数库对应硬件
-
系统防护开关
防火墙关闭(对外部应用)
iptables -F (临时生效,清空防火墙配置)
service iptables stop(永久生效,停止防火墙服务)
chkconfig iptables off(永久生效,防火墙服务开机不启动)
selinux(行为控制工具,对内部应用)
注:因为seLinux是内核等级设置,需要重启系统才能生效
配置文件位置:/etc/selinux/config
setenforce 0 (临时关闭防护,0是半关闭,1是开启)
SELINUX=enforcing(开启防护)
SELINUX=disabled(关闭防护)
SELINUX=permissive(清空规则设置)
linux驱动介绍
1、常用驱动直接放入内核(必备硬件驱动)
2、把不太常用,绝大多数驱动以模块方式放入硬盘中(/lib/modules/内核版本/kernel/fs)
3、系统认为不常用,以模块方式放入硬盘中,默认没有安装,需重新编译内核,加载
4、Linux彻底不识别的驱动,需手工安装(驱动厂家提供)
-
-
用户管理
Linux是基于用户身份对系统资源进行管理的操作系统
用户分类UID:用户唯一标示符
超级用户:可以调用一切系统资源
系统用户:不能登录系统,是给应用程序所需权限(限制权限)
普通用户:权限较小,只能管理本用户的相关信息
用户 ID范围RHEL6.* UID范围RHEL7.*
超级管理员 0 0
系统用户 1-499 1-999
普通用户 500-65535 1000-65535
其中有些特殊用户不遵守这个规则
例:nlsnoboby UID:65534 是系统用户
组分类GID:组唯一标示符
组本身没有分类,是根据该组所对应的用户进行管理确认
初始组:用户创建时所指定的组
附加组:除用户初始组以外加入的组
相关配置文件
/etc/passwd(用户信息文件,共七例)
1、用户名
2、密码站位符:"!!""*"标示密码失效,不能登录
3、UID
4、GID
5、用户描述
6、家目录
7、登录shell类型
/bin/bash:可以登录
/sbin/nologin:不能登录
/etc/shadow(用户密码文件配置,共九列)
1、用户名
2、加密密码符,"!!""*"标示密码失效,不能登录
3、最近一次修改密码时间,显示为时间戳,1970.01.01开始 计算,是unix元年
4、能修改密码的时间间隔
5、密码最长有效期
6、密码到期前警告天数
7、密码到期后的宽限天数
8、密码失效时间,为时间戳
9、保留
时间戳转换命令
#时间戳转日期
date -d "1970-01-01 时间戳 days"
#日期转时间戳
计算器
/etc/group(组信息配置文件,共四列)
1、组名
2、密码站位符
3、GID
4、组成员列表,成员之间用","号隔开
/etc/gshadow(组密码文件,共四列)
1、组名
2、组密码
3、组管理员
4、组成员列表
注:密码配置文件在RHEL6.*之前,默认权限为400,在RHEL6.*之后默认权限为000
/etc/skel(用户模板文件,用于添加新建用户家目录下的默认文件)
/etc/default/useradd(是创建用户时调用的文件参数,大部分关于 用户文件的配置)
/etc/login.defs(是创建用户时调用的文件参数,大部分关于密码 文件的配置)
私有组机制
在创建用户时,先创建一个与用户同名的组,将该组作为初始组
公共组机制
先创建一个的组,之后创建的用户的初始组都是该组
加密类型:SHA512:散列模式加密
初始组:创建用户时所指定的第一个组
注:每一个用户有且只有一个初始组,并不是用户创建的文件属于哪个组,哪个组就是初始组
有效组:决定用户创建文件时,文件的所属组
注:newgrp 切换用户的有效组,用户的初始组就是默认的有效组
切换有效组的条件
1. 用户要先加入该组,才能将该组设置为有效组
2. 若事先未加入,则可以通过密码方式加入再设置(提前设置好组密码)
-
ACL权限管理
- ACL
访问控制列表,为单一的用户或者组设置对文件或者目录的独立权限
开启ACL
1、确认文件系统(分区)是否支持ACL
dumpe2fs 分区 | grep acl
2、开启(激活)ACL权限
手动:mount -o remount,acl / #临时生效
自动:a、修改/etc/fstab,在default后天就acl
b、mount -o remount / #永久生效
3、查看ACL
getfacl 文件名(获取文件的ACL权限列表)
4、设置ACL
setfacl -m u:用户名:权限 文件名(增加ACL权限)
setfacl -x u:用户名 文件名(删除ACL权限)
setfacl -b 文件名(清空ACL权限,包括mask)
setfacl -m m:权限(防止acl权限过大)
setfacl -R -m u:用户名:权限 文件名(递归设置)
setfacl -d -m u:用户名:权限 目录名(目录权限继承)
-
sudo授权
普通用户使用sudo,/etc/passwd其他人权限必须有r权限
授权:将授权的信息记录到配置文件中
visudo:专门用于修改授权配置文件
/etc/sudoers:授权配置文件
配置文件内容:
ALL ALL=(ALL) ALL
被授权者 可管理主机=(授权者身份) 命令位置
例:zhangsan ALL=(root) /sbin/shutdown -r now
sudo验证授权
sudo shutdown -r now(授权命令前需要sudo)
需要普通用户密码
验证成功执行命令(借用root身份)
注: 1)授权时,不能赋予单一命令,需要命令+选项+参数
2)仅授权所需要权限
给组授权需要在授权用户前加%号
passwd命令授权
passwd命令会验证用户UID,若为0,则可以加任何参数
若非0,则不能加参数
授权别名
作用:简化授权记录
例:
Cmnd_Alias NETWORKING = /sbin/route, /sbin/ifconfig, /bin/ping
zhangsan ALL=(root) NETWORKING
-
文件特殊权限
EUID:应用程序执行文件所持有的身份
SUID(SetUID)
定义:在命令的所有者位置有s权限
作用:一个普通用户在执行具有SUID权限的命令时,该命令的执行者会临时变更为命令的所有者
注:
1)普通用户需要对文件有执行权限
2)SUID只能设置在执行文件或脚本上
SGID(SetGID)
定义:在命令所属组位置有s权限
作用:
针对文件
一个普通用户在执行具有SGID权限的命令时,该用户会临时加入到命令的所属组内,以组成员的身份查看文件
针对目录
一个普通用户在一个具有SGID权限的目录下创建文件时,该用户的有效组临时变更为了该目录的所属组·
SBIT(STICKY BIT)
定义:在其他人位置具有权限
作用:黏着位:在具有SBIT权限的目录下,普通用户只能删除自己创建的文件(root除外)
设置特殊权限
chmod ugo +- s file
chmod 4755 file #suid(可执行文件)
chmod 2755 file #sgid(可执行文件&目录)
chmod 1755 file #sbit(目录)
umask 0022 0002
第一个位置的 0 代表该数值是一个八进制的数值
SUID : 4755
取消 : 00755
文件系统属性
格式:chattr [+-] [选项] 文件或目录
选项:
-i
对文件设置i属性,那么不允许对文件进行删除、改名,也不能添加和修改数据
对目录设置i属性,那么只能修改目录下文件的数据,但不允许建立和删除文件
-a
对文件设置a属性,那么只能在文件中增加数据,但是不能删除也不能修改数据
对目录设置a属性,那么只允许在目录中建立和修改文件,但是不允许删除
-e
Linux中绝大多数的文件都默认拥有e属性。表示该文件是使用ext文件系统进行存储的,而且不能使用"chattr -e"命令取消e属性
查看文件系统属性
格式:lsattr 选项 文件名
选项:
-a 显示所有文件和目录(显示隐藏文件)
-d 若目标是目录,仅列出目录本身属性
-
MBR/GPT文件系统管理
磁盘管理
1. 开机-加电自检
2. 主板上的CMOS芯片的BIOS程序-加载到内存中运行
3. 根据BIOS程序所记录的启动设备的顺序进行引导启动设备(U盘、硬盘、光盘)
4. 加载硬盘的第一个扇区(MBR)-加载到内存中运行
5. 通过引导记录引导操作系统
数据存储:
表示层:文件名
逻辑层:文件系统(data-block:4k) super-block
物理层:扇区(512byte) 分区表(MBR-64byte)
文件系统:
super block:超级块记录每个分区的block的大小、数量;块位图(已使用和未使用的inode和block的数量);文件系统挂载时间,最后修改时间,最近检查时间
data block:数据块保存真实数据的位置,block的大小和数量在格式化成文件系统时已经固定,除非重新格式化,否则不能修改。单个文件占用小于一个block的大小时,单独占用一个block,剩余空间不会被利用
MBR(主引导记录)512byte
1. 主引导程序(Boot Loader):446byte
安装操作系统后,446字节内就写入了引导程序
2. 分区表:64byte
每个分区的信息:16byte进行记录
最多能记录几个分区:4个分区(主+拓<=4)
拓展分区再划分的逻辑分区不记录在此位置,单独记录在一个扇区中
3. 有效标识符:2byte
55AAH代表着MBR分区表是有效的,GPT分区表(18EB)
GPT:全局唯一标示分区表,又叫giud
LBA:逻辑区块地址,寻址方式LBA0,LBA1,LBA2.....
LBA0:存储MBR分区表和GPT指针,因为兼容性
LBA1:存储硬盘总大小,以及GPT分区表信息,每个GPT分区表信息占128字节
LBA2-LBA33:每个分区信息存放位置共32个扇区,大小是32*512=16384,16384/128=128个分区
分区(MBR分区):
添加新硬盘不重启
ls /sys/class/scsi_host/ #查看主机总线号
依次扫描总线号
echo "- - -" > /sys/class/scsi_host/host0/scan
echo "- - -" > /sys/class/scsi_host/host1/scan
echo "- - -" > /sys/class/scsi_host/host2/scan
fdisk -l 磁盘名 #查看分区信息
fdisk 磁盘名 #进入分区交互模式
m 获取帮助:显示可执行的命令
p 查看分区状态,分区表
n 创建分区
主:n--p--1--起始点--结束点
拓:n--e--2--起始点--结束点
逻辑:n--l--起始点--结束点
d 删除分区
q 退出不保存
w 保存并退出
格式化(写入文件系统类型):
mkfs -t ext4 /dev/sdb1
mke2fs -t ext3 -b4096 -i16384 设备分区
mkfs.* 设备分区
挂载分区使用
mount /dev/sdb1 iso/
df -ahT #查看分区文件系统,只有挂载的才能查看
报错问题
分区表被占用
partprobe 重新加载分区表(强制-先解锁分区表)
解决文件系统配置问题
若/etc/fstab文件错误,无法开机,根据提示输入root密码
mount -o remount,rw / #重新挂载rw权限
修改错误内容
GPT分区步骤
parted 设备 #进入分区交互模式
p #查看分区状态,分区表
mkladel gpt/msdos #更改分区表类型
mkpart #创建分区
rm #删除分区
quit #退出,并执行mkfs格式化分区
注:
1、parted中执行都是立即生效
2、parted自带mkfs命令版本太低,无法写入ext2以上文件系统
3、GPT不支持fdisk查看,需要直接进分区模式查看
swap分区步骤
fdisk分出一个分区
fdisk中执行t命令更改分区类型,83普通,82swap
保存退出,执行mkswap格式化分区
swapon 启用swap分区(临时)
添加:/etc/fstab 永久更改,开机启动
/dev/sdb1 swap swap defaults 0 0
注:swap超过8G就没什么意义了
-
shell
- shell基础
为什么要学习shell脚本?
将较为复杂的实验操作流程和重复度很高的实验流程 变为脚本执行
提高执行效率、减少了错误的发生(遗漏、单词错误)
将原本人手动操作的流程,写成脚本,按照人执行的顺序自动执行
将数值、名称、命令的结果、文本内容、等传递到脚本内(变量)
shell的表现形式:
history
-c #清空历史命令(清空缓存;默认:1000条)
-w #将缓存中的历史命令保存到配置文件中
~/.bash_history #永久保存历史命令(默认:1000条)
! 数值 #调用指定条数的历史命令
↑↓ 光标键 #调用原来执行过的历史命令
!关键词 #调用最近一次以此关键词开头的历史命令
!! #执行上一次命令
命令别名
查看:alias
设置:alias 别名='真实命令 -选项'
永久保存:
单个用户:~/.bashrc
所有用户:/etc/bashrc
需要重新加载配置文件别名才能立刻生效:
source ~/.bashrc
命令执行顺序:
1. /bin/ls
2. ls='ls --color=auto'
3. shell 内置命令
4. 根据环境变量查询命令所在位置(PATH) /usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/nginx/sbin
缓存:系统自动为已存在的命令设置了缓存,当目录发生变化时,缓存和实际位置不一致,导致找不到命令
-
输入输出重定向
标准输入(键盘): /dev/stdin [设备标识号:0] 通过键盘向服务器发送指令
标准正确输出: /dev/stdout [设备标识号:1] ls命令输出的结果
标准错误输出: /dev/stderr [设备标识号:2] lss命令输出的结果
模拟标准输入:echo "123456" | passwd --stdin username 非交互式修改密码
1. 输入重定向
① "<"
wc < 统计行数 (常规写法:wc abc)
cpio -idvcu < *.cpio
patch -pin < *patch
② " << "
# wc << abc
> aside 7y8 hbm,.dd k,2 '
> asked 'd 2 dazed '
> abc
2 10 44
wc "<<" abc 统计指定关键词范围内的信息标准输出(显示器)
2. 输出重定向
定义:将原本打印到显示器上的信息,写入指定的文本或设备中(打印机)
① > 覆盖式写入
② >> 追加式写入
ll > a.txt 会将结果写入文本
lll > b.txt 不会将报错写入文本
常用方式:
ifconfig eth0 192.168.88.110/24 &> /dev/null
#将正确和错误输出都传到/dev/null
ifconfig eth0 192.168.88.110/24 2> /dev/null
#将错误输出都传到/dev/null
实际应用:
ifconfig eth0 192.168.88.110/24 1> /dev/null
#将正确输出都传到/dev/null
ls >/dev/null 2>&1
#将正确和错误输出都传到/dev/null,效率更高
echo $?
ifconfig eth0 192.168.88.110/24
#若结果不为0,则再执行一次,打印在屏幕上
-
特殊符号
选项连接符:
-a :find /etc -name "init*" -a -type f
-o :find /etc -size -4K -o -size +10M 不取从4K到10M大小的文件
命令连接符:
-exec :find /etc -name "init*" -a -type f -exec ls -l {} \;
-ok :find /tmp -name "init*" -a -type f -ok rm -rf {} \;
| :ls -l /etc/ | more 分页显示/etc/目录下的所有文件的长格式信息
echo "--help" | cat
echo "--help" |xargs cat
#将echo --help 当做cat命令的选项执行
find /etc -name "init*" -a -type f |xargs ls -l
#将find所查询到的命令结果(任务流方式)使用|xargs传递给后面的命令
; :无逻辑关系连接符
&& :有逻辑关系,符号前的命令必须执行成功,才执行符号后的命令
|| :有逻辑关系,符号前的命令若执行成功,则不执行符号后的命令
符号前的命令若执行不成功,则执行符号后的命令
[ "$a" == "abc" ] && echo yes || echo no
当a=abc时,输出yes,否则,输出no
grep 提取包含关键词的行 (行提取命令)
grep "关键词" 文本文件或文本流
正则表达式
-An 在关键词行向下显示n行
-Bn 在关键词行向上显示n行
find 在指定范围(目录)内查询符合条件的文件名&路径
-name
-type
-user -group
-nouser 查询没有所有者的文件
-[acm]time -[acm]min
-size
-perm
-a -o
默认精确查询 -name abc.txt
模糊查询:通配符
-name "*abc.txt" 用到通配符的需要用双引号引用
echo [选项] [输出内容]
-e 支持反斜线控制的字符转换
-n 取消输出后行尾的换行符号
通配符
在进行字符匹配时,实现模糊匹配,find ls cp rm默认匹配的对象是具体的操作对象(精确匹配)
* 匹配任意多个任意字符
? 匹配 一个 任意字符
[] 在指定范围内匹配任意一个字符
[a-z] [A-Z] [0-9] 连续的范围
[aoe] 不连续的范围
[^] 取反,匹配除了括号内的所有字符
Bash特殊符号
1
''
其内的只是一个普通字符,原来的特殊含义失效
2
""
其内的几乎是所有字符为一个普通字符,原来的特殊含义失效
3
``
调用指定命令的结果
4
$()
调用指定命令的结果
5
()
其内执行的命令都在新开的子shell中执行
6
[]
条件判断公式
7
{}
其内执行的所有命令,与当前shell中无异,但格式更严谨
8
#
注释
9
$
在bash shell中调用变量
10
\
针对命令的转意符
文字颜色
30黑
31红
32
绿
33黄
34蓝
35
紫
36青
37白
底纹颜色
40黑
41红
42
绿
43黄
44蓝
45
紫
46青
47白
特殊显示
0关闭
1高亮
4下划线
5闪烁
7
反显
8
消影
颜色设置:如 \e[1;41;33m \e[0m
'' 所有被单引号所引用的字符,都只是一个普通字符,原来的特殊含义失效
echo '$PATH' $在单引号中没有调用变量的功能了
"" 几乎是所有被双引号引用的字符,都只是普通字符,原来的特殊含义失效,除($ \ ``)
echo "$PATH" $在双引号中被调用时,是有效的
`` 和 $() 调用指定命令的结果
time=$(date)
abc=`ls *`
() 所有在小括号内执行的命令,都是在新开启的子shell中执行的,不会影响当前shell,当小括号内的命令执行完成时,新开启的子shell自动结束消失
{} 所有在大括号中执行的命令,都是在当前shell中执行的,与不加括号无异。大括号要严格遵循格式: { name=lisi;echo $name;}
a、大括号的左括号和第一条命令之间需要留一个空格
b、大括号内最后一条命令结尾需要使用;结束
# { name=lisi;echo $name;}
# (name=zhangsan;echo $name) 在子shell中执行
[] 条件判断公式
① [ "$abc" != "10" ] #在进行 == 和 != 进行判断时,必须遵循以下a、b两个原则
# == 和 != 是用来判断字符和字符串,不是用来判断数值的。
a、括号两侧必须留有一个空格
b、判断符号两侧必须留有空格
② [ -f /etc/bashrc ]
-f 判断指定对象是否存在,判断该文件是否是普通文件
[ -f /etc/bashrc ] && source /etc/bashrc
# 在shell中是注释的意思,在文本内不生效,作为备注和注解
拓展:并不是所有的注释都是不生效的,有些注释代表默认就生效(/etc/ssh/sshd_config)
;
//
<!-- -->
/* */
$ 调用指定变量的值,在bash shell中是这样的,其他shell中不一定
echo "$PATH"
\ 将所有的特殊字符和字符串转义为普通字符和字符串(针对命令)
-
bash 中的变量
(1) 变量的定义规范:
1. 字母、数字、下划线(不能以数字开头、不能有空格、不能使用除下划线以外的符号)
2. 赋值符号:= (等号左侧不能有空格)
a、变量的名称不能带空格
b、变量的值可以有空格(带空格的必须使用双引号,引用作为一个整体)
3. 变量的值:无特殊要求(有空格使用双引号)
4. 变量的类型有多种,某些变量要求变量名必须是大写的!(环境变量)
(2) 变量的分类:
1. 用户自定义变量
声明:x=100
调用:echo $x
set #查看当前shell中所有生效了的变量
-u #设置后,再调用未声明变量时,会报错。
-x #设置后,执行命令时,每次都会先把命令打印一遍,然后再输出结果
2. 环境变量
根据登录用户身份所设置的变量就叫环境变量(值随着用户身份变化)
使用 export 命令声明的变量就叫环境变量
如:export CON
PATH="$PATH:/usr/local/apache2/bin"
/etc/bashrc /etc/profile 针对所有用户
~/.bashrc ~/.bash_profile 针对单个用户
source file
LOGNAME= 当前用户名
PATH= 保存了命令所在位置的变量
PS1= 决定了命令提示符格式的变量
LANG= 决定了当前shell中的语系类型的变量
echo $LANG 当前shell中的语系变量
默认语系变量/etc/sysconfig/i18n #默认加载的语系变量
3. 位置参数变量(变量名不可以修改)
按照预设位置将指定位置的值传递到脚本内等待被处理
$n:n为数字,$0代表命令本身,$1-$9代表带一个到第九个参数,大于10要用大括号,如${10}
$*:代表命令行中所有的参数,但把所有的参数看成一个整体
$@:代表命令行中所有的参数,但把每个参数区分对待
$#:代表命令行中所有参数的个数
按照预设位置将指定位置的值传递到脚本内等待被处理
#!/bin/bash
x=0 #定义一个变量初始值为0,并设置变量自增幅度为1
for a in "$*" #使用for循环将$*或$@的值赋给变量a,
do
let x+=1 #变量自增,幅度为1,实现指定第几个参数
echo "第$x个参数的值是$a"
done
echo "一共有$#个参数"
4. 预定义变量(变量名不可以修改)
echo $? #获取上一条命令的返回值(0:正常 非0:报错)
exit 定义命令执行后的返回值是多少,通过返回值判断故障点
[ -f /etc/ssh/sshd_config ] || exit 6
# -f :判断该文件是否存在且为普通文件
$$ 当前进程的进程号
$! 最后一个后台的进程号
(3) 变量声明
命令:declare [+/-] [选项] 变量
- : 给变量设定类型
+ : 取消变量的类型
-a : 将变量声明成数组型
-i : 将变量声明成整数型
-r : 将变量声明成只读(变量值不能修改,也不能删除,更不能取消只读选项)
-x : 将变量声明成环境变量
-p : 显示指定变量的类型及内容
-
shell正则表达式和数值运算
read 获取键盘输入(变量赋值)
多个变量时,会依次取值,变量不够时,最后一个变量会取所有值。
read -p "显示的提示信息" 变量
$(($a+$b))
$[$a+$b]
let xx=$a+$b let数值运算
declare -i c=$a+$b 声明变量为整型,进行数值运算
expr: 数值运算,该公式会自动将数字识别为数值
expr $a + $b
#运算符两侧必须有空格
#注意变量自增的时间点(程序执行前自增 或 程序执行后自增)
正则表达式
(1) 正则表达式:
*
前一个字符任意多次(*前边必须有一个字符)
基础正则表达式
.
匹配任意一个字符
基础正则表达式
^
限制行首
基础正则表达式
$
限制行尾
基础正则表达式
[]
其内任意一个字符,[A-Za-z][0-9][^0-9][abc][a-cdf]
基础正则表达式
\{n\}
前一个字符重复n次
基础正则表达式
\{,n\}
前一个字符重复0到n次
基础正则表达式
\{n,\}
前一个字符至少重复n次及以上
基础正则表达式
\{n,m\}
前一个字符重复n次以上m次以下
基础正则表达式
+
前一个字符一次或多次
egrep
?
前一个字符0次或一次
egrep
|
分支符号(或者)
egrep
()
其内为一个整体匹配一个字符,
egrep
注:当用到egrep时"\{\}"中的反斜杠取消
(2) 基础正则表达式:
* 匹配前一个字符任意多次(连续)
*前一个字符连续出现了多少次(*前边必须有一个字符)
. 匹配任意一个字符(除去换行符以外)
若某文本要过滤包含. 的行,则需要使用转义符将.的特殊含义取消
grep "\." /sh/passwd
^ 匹配行首
$ 匹配行尾
grep "\.$" /sh/passwd #过滤以.结尾的行
grep -v "^$" /sh/passwd #取消文本的空白行
[] 匹配括号内的任意一个字符
[0-9] [a-zA-Z] [^0-9] #尽量不要使用[a-Z]
注:除了连接符 - 以外,不可以使用其他符号
\{n\} # 过滤必须出现指定次数的行
\{n,\}
# grep "a\{0,\}" passwd | wc -l
# grep "a*" passwd | wc -l
\{,n\}
\{n,m\}
# grep "o\{2,3\}" /sh/passwd
(3) 扩展正则表达式:
指定匹配的前一个字符出现的次数(类似于*)
在使用egrep 或 grep -E 时,不需要使用转义符
+ 匹配前一个字符一次或任意多次
? 匹配前一个字符0次或1次
| 分支符号(或者)
(4) 正则表达式过滤手机号码和ip
1. 中国手机号码:
以1开头,11位连续的数字
grep "1[0-9]\{10\}" sj.txt
每行中只有手机号的:
grep "^1[0-9]\{10\}$" sj.txt
中国联通:130、131、132、 145、 155、156、 185、186
拆分:
13[012][0-9]{8}
145[0-9]{8}
1[58][56][0-9]{8}
组装:
1(3[012]|45|[58][56])[0-9]{8}
2.IP范围0-255
拆分(怎么容易写正则匹配怎么拆分):
0-9 [0-9]
10-99 [1-9][0-9]
100-199 1[0-9][0-9]
200-249 2[0-4][0-9]
250-255 25[0-5]
组装:egrep "[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]" b
过滤IP
^(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])$
-
shell字符处理命令
cut 列提取命令(行操作命令:逐行提取指定列)
默认的分隔符是:tab ;还可以手动指定分割符:(空格、冒号、百分号、@)
-f #指定提取的列号
-d 分隔符 #指定分割符
-c #坐标提取,字符范围:不依赖分割符来分割,而是通过字符范围进行字段提取("-m"表示从第一个字符提取到第m个,"n-m"表示从第n提取到第m个字符,"n-"表示从第n个字符开始提取到结尾。
提取2到10列中的字符,当使用-c时,则不能用-d
cut -c "2-10" /etc/passwd
提取以":"作为分隔符的第一列
cut -d ":" -f 1 /etc/passwd
awk #行提取,并处理
awk为列提取&行提取 (逐行操作)
awk '条件{动作}' 参数
命令 | awk '条件{动作}'
动作:
print 标准输出 (自动套用原格式)
printf 标准格式化输出 (取消所有的格式输出;可以人为指定输出格式)
\t #tab
\n #换行
awk 处理下列文本时的处理流程:
ID NAME AGE SEX
1 lanc 18 man
2 sans 19 man
3 sc 38 oman
a) 读取该文本的第一行(逐行)
根据第一行中 列的数量 设置位置参数变量
读完第一行后,$0-$4都有了自己的值
$0 当前的整行
$1 第一个列的值
$n 第n个列的值
b) 当第一行处理完成后,去查看'条件{动作}'
使用printf 输出符合条件的$n,并且不显示"%"
do -h | grip "\/$" | awk '{printf $5"\n"}' | cut -d "%" -f 1
指定的分隔符号
awk默认识别的分隔符:tab 和 空格
打印/etc/passwd文件中第一列和第七列:
awk -F ":" '{printf $1"\t"$7"\n"}' /etc/passwd
awk 'BEGIN{FS=":"}{printf $1"\t"$7"\n"}' /etc/passwd
BEGIN 在未读取文本之前 就先执行的条件和动作,指定该文件中的分隔符为";"。
条件设置
awk的条件
BEGIN和END 条件只执行一次!
awk保留字
BEGIN
在未读取文本之前就先执行的条件和动作
END
在处理文本完成后,再执行的命令
关
系
运
算
符
>
大于
<
小于
>=
大于等于
<=
小于等于
==
等于,判断相等
!=
不等于
A~B
A包含B
A!~B
A不包含B
正则
/正则/
在"//"中支持正则表达式
打印文件中以":"分隔的第一列和第七列
# awk 'BEGIN{FS=":"}{printf $1"\t"$7"\n"}' /etc/passwd
打印文件中第一列,并在最后打印"OK"字符
# awk 'END{printf "ok\n" }{printf $1"\n"}' /etc./passwd
打印文件中以":"分隔的第一列和第七列,并在最后打印"OK"字符
# awk 'BEGIN{FS=":"}END{printf "ok\n" }{printf $1"\t"$7"\n"}' /etc./passwd
打印file文件中第二列中包含"chao"且第三列大于"35"的值
# awk '$2~chao{动作1} $3>35{动作2}' file
两个条件动作之间用空格作为分隔符
# awk '$2>30{动作1;动作2;动作3}' file
一个条件多个动作时,使用";"分隔
变量:
awk内置变量
作用
$0
代表awk读入的一整行数据
$n
代表awk读入的当前行的第n列数据
NR
代表当前awk正在处理的行的行号
NF
代表当前awk读取数据总字段数(列)
FS
用来声明awk的分隔符,如BEGIN{FS=":"}
从第二行开始提取
# awk 'NR>1{printf $3"\n"}'
awk NF 变量的特殊使用方式:
# head -3 /etc./passwd|awk -F ":" '{printf $(NF=5)"\n"}'
# head -3 /etc./passwd|awk -F ":" '{printf $(NF-2)"\n"}'
awk编程
在awk编程中,因为命令语句非常长,输入格式时需要注意以下内容:
多个条件{动作}可以用空格分割,也可以用回车分割。
在一个动作中,如果需要执行多个命令,需要用";"分割,或用回车分割。
在awk中,变量的赋值与调用都不需要加入"$"符。
条件中判断两个值是否相同,使用"==",以便和变量赋值进行区分。
Sed #文本修改
非交互式文本修改工具(提取、替换、删除、新增)
选项:
-n sed命令会把所有数据都输出到屏幕,-n会把经过sed命令处理的行打印。
sed -n '2p'文件名 #显示第二行的信息
-e :允许对输入数据应用多条sed命令编辑。
-f : 脚本文件名:从sed脚本中读入sed操作。和awk命令的-f非常类似。
-r :在sed中支持扩展正则表达式。
-i :用sed的修改结果直接修改读取数据的文件,而不是由屏幕输出
# sed -i '2c No such person' 文件名
动作:
p :打印,输出指定的行。
打印的二行数据
# sed '2p' file
a :在当前行后添加一行或多行。添加多行时,除最后一行外,每行末尾需要用"\"代表数据未完结。
# sed '2a new' file
i :在当前行前插入一行或多行。插入多行时,除最后一行外,每行末尾需要用"\"代表数据未完结。
# sed '2i new' file
c :替换
整行替换,c后面的字符替换原行,替换多行时,除最后一行外,每行末尾需用"\"。
# sed '2c No such person' file
替换含有IPADDR=的行为IPADDR=10.10.10.100
# sed -i "s/IPADDR=.*/IPADDR=10.10.10.100/g" file
d :删除指定的行。
删除2到4行数据
# sed '2,4d' file
删除行首含有'#'号的行
# sed '/^#/d' file
e :用一个字符串替换另外一个字符串。格式为"行范围s/ 旧字串/新字串/g"
替换第n行的old为new
# sed 'ns/old/new/g' file n代表第几行
其中"g"是将整行所有的都替换,若不加,只替换第一个old
sed 要进行多行操作时,只能通过-e 写多条操作语句,用";"或回车分隔。
如:删除文件中空行和注释
# sed -i -e '/^$/d;/^#/d' config_file
Sort 排序命令
sort [] 文件名
-f 忽略大小写
-b 忽略每行前的空白部分
-n 以数值型进行排序,默认使用字符串类型排序
-r 反向排序
-u 删除重复行(=下面的uniq)
-t 指定分隔符,默认分割符是制表符
-k n[,m] 按照指定字段范围排序,从n字段开始到m字段结束。
sort 命令默认使用每行开头第一个字符进行排序
以":"为分隔符。对第三列进行数值排序
sort -n -t ":" -k 3 /etc/passwd
假如 要进行反向排序则需要加-r 选项按照指定的排序字段进行排序,使用-t 指定分割符 , 并且使用-k 指定段号,加上-n 之后成为了数值排序。指定范围时我们可以写 –k 3,5 也可以写3,3 == 3
取消重复行uniq
uniq用来取消重复行,与sort –u 是一样的,格式:
uniq [] 文件名
-i 忽略大小写
-c 在行首显示出现的次数
-d 仅显示显示重复行
-u 仅显示不重复的行
需要注意的是,当重复行不连续时,uniq是不生效的,需要先排序,再执行
提取文件中的IP,排序并打印访问量最高的前10行
awk -F " " '{print $1}' /root/sh/logfile.log | sort | uniq -c | sort -nr | head
-
条件判断
按照文件类型进行判断
-b
判断文件是否存在,且是否为块设备文件
-c
判断文件是否存在,且是否为字符设备块文件
-d
判断文件是否存在,且是否为目录文件
-e
判断文件是否存在,存在为真
-f
判断文件是否存在,且是否为普通文件
-L
判断文件是否存在,且是否为软连接文件
-p
判断文件是否存在,且是否为管道文件
-s
判断文件是否存在,且是否为非空
-S
判断文件是否存在,且是否为套接字文件
按照文件权限进行判断
-r
判断文件是否存在,且有r权限
-w
判断文件是否存在,且有w权限
-x
判断文件是否存在,且有x权限
-u
判断文件是否存在,且有SUID权限
-g
判断文件是否存在,且有SGID权限
-k
判断文件是否存在,且有SBIT权限
两个文件之间进行比较
a -nt b
判断a文件的修改是否比b文件新
a -ot b
判断a文件的修改是否比b文件旧
a -ef b
判断a文件和b文件的Inode号是否一样
字符串的判断
-z
判断字符串是否为空(变量)
-n
判断字符串是否为非空(变量)
a == b
判断字符串a和b是否相等
a !== b
判断字符串a和b是否不相等相等
两个整数之间进行比较
[ a -eq b ]
a=b
[ a -ne b ]
a!=b
[ a -gt b ]
a>b
[ a -lt b ]
a<b
[ a -ge b ]
a>=b
[ a -le b ]
a<=b
多重条件判断
判断1 -a 判断2
逻辑与,判断1和判断2,都成立为真
判断1 -o 判断2
逻辑或,判断1和判断2,有一个成立为真
!判断
逻辑非,取反原判断式, [ ! 2 -eq 3 ]
-
shell语法
if [];then
语句
fi
if [];then
语句
else
语句
fi
if [];then
语句
elif
语句
elif
语句
....
else
语句
fi
for i in 资源池
do
语句
done
for ((;;))
do
语句
done
while [](成立循环)
do
语句
done
nutil [] (不成立循环)
do
语句
done
while true(无限循环)
do
语句
done
while : (无限循环)
do
....
done
exit 退出脚本
break 退出循环
contnue 结束当次循环
-
shell扩展之数组
shell计算:
echo $(seq 1 10) 取1-10范围内的整数(可直接应用于for的循环结构中)
浮点运算
c=$(echo "5.01-4*2.0"|bc)
echo $c
-2.99
c=$(awk 'BEGIN{print 7.01*5-4.01 }')
echo $c
31.04
数组
数组声明:
declare -a abc
abc[0]=1,abc[1]=2
unset abc
unset abc[1]
数组赋值:
a、
abc=(1 2 3) a[0]=1;a[1]=2;a[2]=3
b、
a="1 2 3"
abc=($a)
调用数组所有值:
echo ${abc[*]}
echo ${abc[@]}
数组长度获取:
数组长度(元素数=值的个数):
${#abc[@]}
元素长度:
echo ${abc[1]} | wc -L
echo -n ${abc[1]} | wc -L
#去掉换行符再统计
数组遍历:
abc=(1 2 3)
a=0
for i in ${abc[@]}
do
echo "下标为$a的元素的值为:$(i)"
let a++
done
数组元素修改:
abc=(1 2 3)
abc[3]=10
abc=(1 2 3)
bcd=(${abc[*]} 4)
echo $(bcd[*])
数组切片:
abc=(1 2 3 4 5 6 7)
${abc[@]}
${abc[@]:1}
#从下标为1的位置开启取值,取所有
${abc[@]::3}
#从下标为0的位置连续取3个值
${abc[@]:2:3}
#从下标为2的位置连续取3个值
${abc[@]:(-2):2}
#从倒数第二个下标位连续取2个值
bcd=(${abc[@]:(-2):2})
#将之前的处理结果赋值给新的数组变量
元素切片:
abc=(zhangsan lisi laowang laosong)
${abc[0]}
##取第一个元素的所有字符
${abc[0]:1}
#从第一个元素的下标为1位置开始,取剩余所有字符
${abc[0]::3}
#从第一个元素的下标为0位置开始,连续取三个字符串
${abc[0]:2:3}
#从第一个元素的下标为2位置开始,连续取三个字符串
数组替换:
abc=(one two three four)
${abc[@]/e/E}
#每个被匹配元素只替换一次
${abc[@]//e/E}
#每个被匹配元素替换多次
${abc[@]/e/}
#每个被匹配元素只删除一个字符
${abc[@]//e/}
#每个被匹配元素删除多个字符
abc=(zhangsan lisi laowang laosong)
${abc[0]/#z/Z}
#将数组内第一个元素的首字符z替换成Z
${abc[0]/%n/N}
#将数组内第一个元素的尾字符n替换成N
#若想实现每一个都智能替换,要使用很复杂的循环,暂不建议现在编写
将1个字符串拆分为多个字符串(sed替换时,有空格)
a=`echo 2018-04-28_12:15:30_ABC.log |awk -F "." '{printf $1}'| sed -r 's/[-_:]/ /g' | tr -d "[a-zA-Z]"`
abc=(${a})
for i in ${abc[@]}
do
echo $i
done
利用数组求最大值
a=(34 78 3 95 62 59 100)
max=${a[0]}
len=${#a[@]}
for ((i=1;i<$len;i++))
do
if [[ ${a[i]} -gt ${max} ]]
then
max=${a[i]}
fi
done
echo "数组中最大值为:$max"
字符串反转输出:
(a=$(seq 1 9);echo $a|rev)
-
高级文件系统管理
-
磁盘配额
定义:限制用户和组在指定分区上的使用空间和文件数目(inode号数量)
实验规划
1. 创建足够大的分区
根据用户额度的需求创建分区(10G)
分区、格式化、挂载(/movie)
2. 创建用户和组
用户要指定thot作为初始组
[root@localhost ~]# groupadd thot
[root@localhost ~]# useradd -g thot cj
[root@localhost ~]# useradd -g thot bd
[root@localhost ~]# useradd -g thot xz
3. 配额的规划
thot 软:400M 硬:500M 软:8 硬:15
cj 软:40M 硬:50M 软:6 硬:10
bd 软:200M 硬:250M 软:4 硬:8
xz 软:200M 硬:250M 软:4 硬:8
实验流程
1. 检查操作系统是否支持磁盘配额
grep "CONFIG_QUOTA" /boot/config-*****
CONFIG_QUOTA=Y #若查询结果中为y证明支持配额
2. 查看配额相关设置工具是否安装
rpm -q quota #验证quota是否安装
3. 分区的创建:
创建足够大小的分区
创建用户和组:
创建用户时指定thot作为初始组
4. 开启磁盘配额
vim /etc/fstab #自动挂载
/dev/sdb1 /movie ext4 default,usrquota,grpquota,acl 0 0
mount -a #重新加载/etc/fstab文件,使新增的挂载生效
#若之前已经手动挂载了/dev/sdb1,则在执行mount -a 之前先卸载掉之前的挂载
验证是否挂载成功:mount
/dev/sdb1 on /movie type ext4 (rw,usrquota,grpquota,acl)
5. 生成磁盘配额配置文件 #必须先关闭SELinux!!!!!!!!
quotacheck -avug
-a 自动扫描/etc/mtab,根据挂载属性,为所有开启了磁盘配额的分区创建配额文件
-v 显示过程
-u 创建用户配置文件
-g 创建组配置文件
-c 清除原配置文件,生成新的配置文件
验证是否生成配置文件的方式:
在指定分区的挂载点下:是否生成下列的两个文件
aquota.group
aquota.user
#必须先关闭SELinux!!!!!!!
6. 编辑配置文件,写入限制(默认单位是K,可以使用K,M,G,T)
edquota
-u 用户名 #给指定用户设置配额
-g 组名 #给指定组设置配额
-t #设置宽限天数
-p #将已设置的额度复制给指定用户
edquota -p bd -u xz
7. 启用设置好的配额
quotaon
-avug #启用配额
quotaoff
-avug #关闭配额
8. 查看设置的磁盘配额的额度(查看)
quota
-uvs 用户名 #查看指定用户的配额(所有磁盘对此用户的限制)
-gvs 组名 #查看指定组的配额
repquota
-ugvs 分区名 #查看指定分区上,限制了哪些用户和组,以及额度
9. 验证额度是否生效
使用普通用户执行验证命令
dd if=/dev/zero of=/movie/* bs=1M count=40
dd if=数据来源地址
of=数据目标地址
bs=每次写入指定目标时,所写入的块的大小(最好用4096-保证和block大小一致)
count=所写入的块的个数
-
伪设备文件
/dev/zero :拥有无限个0的设备
/dev/null :黑洞,可以接收任何数据(不限大小)回收站
/dev/urandom :随机设备文件,输出随机字符
1. 数据销毁:
dd if=/dev/zero of=/dev/sdb
2. 测试磁盘的读写效率
dd if=/dev/zero of=/movie/aaa bs=4096 count=512 #测试写入效率
dd if=/movie/aaa of=/dev/null bs=4096 #测试读取速度
make >> /dev/null
echo $?
将命令的执行过程重定向到/dev/null中,简化执行过程中的显示
-
raid阵列
磁盘阵列分类:一是外接式磁盘阵列柜、二是内接式磁盘阵列卡,三是利用软件来仿真
Raid(磁盘阵列)
Raid 0 带区卷
Raid 1 镜像卷
Raid 5 在每块硬盘中分出一个区,写入奇偶校验值
Raid 10 先做镜像卷,再做带区卷
Raid 01 先做带区卷,再做镜像卷
硬件Raid才有实际用途,软Raid没有实际用途(能否开机问题)
卷名 磁盘数量 硬盘容量 动态扩容 磁盘容错 速度
简单卷 只能1块 / 用于 不支持 /
跨区卷 至少2块 可以不一致 用于 不支持 /
带区卷 至少2块 必须一致 / 不支持 最快
镜像卷 只能2块 必须一致 利用率50% 支持 最慢
Raid 5 至少3块 必须一致 利用率N-1 支持 较快
raid 10
基础:/dev/sdb /dev/sdc /dev/sdd /dev/sde
热备:/dev/sdf /dev/sdg
mdadm -Cv 逻辑磁盘名称(md*) -l10 -n 基础磁盘(4个) -x 热备(2)
mdadm -S /dev/md127 #停止运行raid
mdadm --zero-superblock /dev/sdb #清空raid数据
mdadm -sD 设备名 #查看raid信息
mdadm -D 设备名 #查看更详细信息
mdadm /dev/md127 -f 设备名 #标记某块磁盘损坏
热备磁盘
全局热备:对阵本服务器上的所有raid阵列进行热备
局部热备:针对指定的raid阵列进行热备
-
LVM逻辑卷管理(Logical Volume Manager)
定义:融合成一个或几个大的虚拟磁盘存储池,按照我们的需求去存储池划分空间来使用
物理卷(PV,Physical Volume):由磁盘或分区转化而成
- 使用fdisk 来进行分区,分区的系统ID需要使用t选项修改为8e,针对分区
- 创建物理卷--pvcreate
- 查看物理卷—pvscan & pvdisplay
- 删除物理卷—pvremove
卷组(VG,Volume Group):将多个物理卷组合在一起组成了卷组
- 创建卷组—vgcreate
格式:vgcreate 选项 卷组名 物理卷名(可以写多个,空格分开)
-s 大小:指定VG的PE大小
- 查看卷组—vgscan & vgdisplay
-
增加卷组容量--vgextend
格式:vgextend 卷组名 物理卷名
-
减小卷组容量--vgreduce
格式:vgreduce 卷组名 物理卷名
vgreduce –a 卷组
#删除指定卷组内所有空的物理卷
- 删除卷组—vgremove
逻辑卷(LV,Logical Volume):把卷组理解为硬盘的话,那么我们的逻辑卷则是硬盘上的分区,逻辑卷可以进行格式化,存储数据
-
创建逻辑卷--lvcreate
格式:lvcreate 选项 -n 逻辑卷名 卷组名
-L 容量:指定创建的逻辑卷大小,单位:MB,GB,TB等
-l(小) 个数:按照PE个数来指定逻辑卷大小
-n 逻辑卷名:指定逻辑卷叫什么名
注:因为逻辑卷相当于是分区,所以需要进行格式化和挂载才能使用,及自启动
- 查看逻辑卷—lvscan & lvdisplay
- 增加逻辑卷容量--lvextend
注:修改lv及文件系统的大小,必须先将lv及文件系统卸载(umount)
lvextend -L +10G /dev/testvg/testlv #先增加lv的大小
resize2fs -f /dev/testvg/testlv 30G #再修改文件系统的大小
- 减小逻辑卷容量—lvreduce
注:减少lv空间的操作是有风险的,操作之前一定要做好备份,以免数据丢失。
e2fsck -f /dev/vg/lv #检查文件系统
resize2fs /dev/vg/lv newsize #减少后文件系统大小
lvreduce -L newsize /dev/vg/lv #减少后lv大小
物理扩展(PE,Physical Extend):PE卷组的最小存储单元,PE所在的位置是VG卷组,即硬盘上,那么我们可以把PE理解为硬盘上的扇区,默认是4MB,可自由配置
lvextend -L 15G /dev/clustervg/clusterlv #从10G增加到15G
-
-
系统服务管理
服务的分类(CentOS 6.*):
RPM安装的服务:独立式服务:在/etc/init.d/有独立脚本的叫独立服务
手动启动:
1. service 服务名 start|stop|restart.....
2. /etc/init.d/服务名 start|stop|restart....
开机自启动:
1. chkconfig --level 2345 服务名 on|off
2. /etc/rc.d/rc.local #借助自启动脚本执行服务的启动命令
集中管理式服务:通过一个大的服务(xinetd)管理一些小的服务的模式
1.、安装xinetd大服务yum -y install xinetd
2、安装telnet-server小服务yum -y install telnet-server
3.、/etc/xinetd.d/*有所有的小服务的配置文件
修改小服务的配置文件(开关:disabled=yes 修改为no)
4、重启xinetd服务service xinetd start
5、通过windows使用telnet连接Linux
telnet 192.168.10.100 23(使用非root用户登录)
源码包安装的服务:(默认:无法使用service和chkconfig管理)
手动:
1. 绝对路径:/usr/local/apache2/bin/apachectl start|stop|restart....
2、别名:alias str='/usr/local/apache2/bin/apachectl start'
3、链接:ln -s /usr/local/apache2/bin/* /usr/local/bin
4、写个管理脚本:./http start|stop|restart
自动:
1. /etc/rc.d/rc.local #写入源码包启动管理命令(case语句)
2. 实现使用chkconfig管理:
a、在实现了service的基础上,修改脚本,添加两句话即可:
# chkconfig: 2345 55 25
#第一串数字代表以什么等级启动,第二第三串数字代表软连接时以什么方式命名
# description: SSH is a protocol for secure remote shell access.
b、chkconfig --add 脚本名
#偶然会出现报错:因为两个数值超过了99
c、检查是否添加成功
chkconfig --list 脚本名
-
Linux启动管理
- linux运行级别
基本上runlevel分为0-6 ,7个等级:
0:关机,shutdown
1:单用户模式(sigle user),root用户,无须认证;维护模式
2:多用户模式(multi user),会启动网络功能,但不会启动NFS;维护模式
3:多用户模式(multi user),完全功能模式;文本界面
4:预留级别:目前无特别使用目的,但习惯同3级别使用
5:多用户模式(multi user),完全功能模式,图形界面
6:重启模式
启动流程
加电BIOS自检
1、主要检测主机硬件设备如:CPU、内存、硬盘、显卡等是否正常
2、BIOS中设置的系统启动顺序来搜索可启动的磁盘设备(光盘、硬盘、U盘)
3、搜到第一个可启动的设备后就读取该设备的第一个扇区的内容并执行
系统引导
以MBR为例:
1、Boot Loader(446b)查找内核位置
GRUB通过hd0,0找到了存放grub.conf的位置
通过grub.conf所声明的根(root (hd0,0)获取了内核和内核扩展文件的位置
2、识别分区表(64b)
查看所有分区的大小和结构
GRUB功能
1、选择要启动的内核或系统
2、提供交互式接口(e编辑模式)
3、提供密码保护
kenrel启动
1、加载vmlinuz:压缩的kenrel程序,即内核,
2、一部分驱动程序会被直接编译进内核文件中
3、另一部分驱动程序会以模块的形式放在initrd中
4、initrd包含根文件系统所在设备驱动和相关程序,是kenrel能够识别并加载根的桥梁
6、内核被加载到内存中立即初始化系统中的设备,包括CPU、I/O、存储等
7、内核会以只读的方式挂载根文件系统,并且运行第一个程序/sbin/init
init启动(系统守护进程)
/sbin/init进程是系统第一个启动的程序,它是其他所有进程的父进程。首先会去读取/etc/inittab文件来执行相应的脚本进行系统初始化,如设置键盘、字体,装载模块,设置网络等,在niittab中有一个很重要的设置选项runlevel。根据runlevel的不同启动不同的服务,让Linux的使用环境不同
1、执行系统初始化脚本(/etc/rc.d/rc.sysinit),对系统进行基本的配置,以读写方式 挂载 根文件系统及其它文件系统,到此系统算是基本运行起来了,后面需要进行运行级别的确定及相应服务的启动
/etc/rc.d/rc.sysinit功能:
设置主机名
打印文本欢迎信息
激活selinux和udev
激活swap
挂载/etc/fstab中定义的本地文件系统
检测根文件系统并以读写方式重新挂载
设置系统时钟
装载键盘映射
根据/etc/sysctl.conf设置内核参数
激活软RAID和VM设备
清理操作
2、执行/etc/rc.d/rc脚本,该文件定义了服务启动的顺序是先K后S,而具体的每个运行级别的服务状态是放在/etc/rc.d/rc*.d(*=0~6)目录下,所有的文件均是指向/etc/init.d下相应文件的符号链接。rc.sysinit通过分析/etc/inittab文件来确定系统的启动级别,然后才去执行/etc/rc.d/rc*.d下的文件
3、执行用户自定义引导程序/etc/rc.d/rc.local完成了系统所有的启动任务后,linux会启动终端或X-Window来等待用户登录
4、最后一步输入用户名及密码就可以登入系统了
-
GRUB配置文件
grub.conf是grub的主配置文件,通过这个配置文件,grub才能找到kernel
default:定义默认启动的操作系统
timeout:定义选择操作系统菜单的等待时间
splashimage:指定我们选择kernel或操作系统菜单后面那张图片
hiddenmenu:表示隐藏选择k操作系统的菜单,只有出现等待界面后按下enter键才会出现。如果没有这个字段,则每次系统启动都会出现这个选择菜单。
title identify:指定一个操作系统,linux中可以有多个title;identify是这个操作系统的识别符,可以随意写。
root:用于指定grub所能识别的根,而不是根文件系统。
kernel:用于指定系统的内核文件的位置
initrd:帮助kernel完成系统的启动,例如加载根文件系统所在分区的驱动等。如果kernel本身有相应强大的功能,则不需要initrd
password:设定密码。放在title外表示进入操作系统等待菜单的编辑模式需要密码,而放在title内表示启动对应的操作系统需要密码,密码可以是明文或是用MD5进行加密过的。可以防止其他人进入编辑kernel菜单进入单用户模式启动我们的系统
-
设置背景图片
背景图片的位置:splashimage=(hd0,0)/grub/splash.xpm.gz
grub是以hd来识别磁盘的,第一磁盘为hd0,第二个磁盘为hd1...,而hd0,0表示第一个磁盘的第一个分区,hd0,1表示第一个磁盘的第二个分区...,并且grub是直接读分区来找到对应的文件;而我的系统上只有一块硬盘,并且/boot是一个单独的分区,并且为系统的第一个分区,grub等文件在这个分区上。(如果你的系统上/是一个独立分区,并且boot,grub和其中的文件都在/这个分区中,则这段应该是: splashimage=(hd0,0)/boot/grub/splash.xpm.gz)所以它的意思是:grub在第一个分区中找到grub这个目录,再找到这个图片文件作为背景.
图片的特点为:
1,必须是xpm的格式
2,必须用gzip压缩
3,最多使用14位的颜色位数
4,分辨率640*480
修改背景图片:
yum -y install ImageMagick
convert -resize 640x480 -colors 14 153067412492.jpg splash.xpm
gzip splash.xpm
将生成的文件导入到/boot/grub/下(导入前先将源文件备份)
-
grub 加密
vim /boot/grub/grub.conf
添加:
password=123456
a. 密码添加在title前面
将密码放在这个位置时,在选择grub菜单时就需要输入密码了。
b. 密码添加在title后面
密码在这个位置时,选择完操作系统后,在进入系统引导时才需要输入密码。
设置MD5加密密码
grub-md5-crypt #生成MD5密码串
vim /boot/grub/grub.conf
添加:
password --md5 MD5密码串
grub密码破解
使用光盘启动
进入修复模式
chroot /mnt/sysimage #将/mnt/sysimage 重新挂载为可读写的/
vim /boot/grub/grub.conf
删除:
password=****
exit #只能使用exit退出
reboot
-
root密码找回
a. 重启系统后出现GRUB界面在引导装载程序菜单上,用上下方向键选择你忘记密码的那个系统键入"e" 来进入编辑模式
b. 接下来你可以看到如下图所示的画面,然后你再用 上下键选择最新的内核(这里是第二行,kernel..),然后继续按"e"键。
然后在编辑界面rhgb quiet后面加"空格",然后键入"single",或者直接输入数字的"1"并回车确定。
回车后,按"b"键启动进入单用户模式,在这里修改root的密码。
-
手动安装grub
一般在grub被覆盖的情况下我们需要进行手动的安装grub到我们的MBR中,那现在的问题是grub已经损坏了,我们没有一个可以交互写命令的地方了,应该怎么设置呢?so…我们要借助光盘上的拯救模式。
根据提示加载光盘上的虚拟系统后,我们需要手动安装下grub
a. chroot /mnt/sysimage
由于是光盘启动的救援模式,so….它的根目录是虚拟的,我们需要用chroot命令将真根目录挂载回来
b. 执行grub 进入交互界面
root (hd0,0) #设置grub的主目录
setup (hd0) #直接将grub安装到MBR中,不需要指定分区(硬盘开头)
quit
c. 重启
-
内核模块操作命令
模块位置:
/lib/modules/2.6******/kernel/
模块名保存文件:
/lib/modules/2.6******/modules.dep
depmod #模块同步到modules.dep中
-a #扫描所有,并写入*.dep
-A #扫描新模块,并写入*.dep
-n #显示到屏幕,不写入*.dep
查看内核模块
lsmod #查询所有模块的信息
modinfo #查询某模块的简单信息
添加删除内核模块
modprobe [选项] 模块
a. 下载到相应的模块
b. 复制到指定位置,一般/ib/modules/2.6******/kernel/
c. 用depmod进行扫描,将新模块写入modules.dep文件中
d.用modprobe进行安装
-
日志管理
-
rsyslog管理日志文件
日志管理:/var/log/
服务: rsyslogd(必须开机自启)
作用:分析日志是由哪个服务产生的,根据rsyslogd配置文件,决定哪些服务的日志保存位置
包含的服务
- 和系统启动相关的核心服务
- 一部分RPM包安装的服务
日志文件
说明
/var/log/cron
记录了系统定时任务相关的日志
/var/log/cups
记录打印信息的日志
/var/log/dmesg
记录了系统开机时内核自检的信息,也可以使用dmesg命令
/var/log/btmp
记录错误登入日志,只能用lastb命令查看
/var/log/wtmp
永久记录所有用户的登入,注销信息,和系统启动,重启关键事件,last查看
/var/log/utmp
记录用户当前登入信息,用w,who,users等命令查看
/var/log/lastlog
记录系统所有用户最后一次登入时间的日志,只能用lastlog查看
/var/log/maillog
记录邮件信息,启动时间,版本,配置文件位置,开机自启动,
/var/log/message
记录系统重要的日志,系统出错,先查这个日志
/var/log/secure
记录验证和授权信息,只要涉及账号和密码的程序都会记录
rsyslog所管理的一些服务
服务名称
说明
auth
安全和认证相关信息,不推荐使用
authpriv
安全和认证相关信息,私有
cron
系统定时任务cront和at产生的日志
daemon
和各守护进程相关日志
ftp
ftp守护进程产生的日志
kern
内核产生的日志,不是永恒进程产生的
local0-7
为本地使用预留服务
lpr
打印产生的日志
mail
邮件收发信息
news
与新闻服务器相关日志
syslog
syslogd服务产生的日志信息,
user
用户等级类别的日志信息
uucp
uucp子系统的日志信息,早期指数据传递协议,现常用在新闻组服务中
-
rsyslog配置文件
/etc/rsyslog.conf
日志等级
注:none等级,不记录任何信息
设置方式
- 设置TCP和UDP远程连接接收,取消配置文件相关设置的注释
- 设置TCP和UDP远程连接发送,添加接收日志主机IP,修改主机名
- 设置发送等级和位置,配置文件中,相关服务下添加
- 配置文件中,左侧是选择器,记录服务名和等级,右侧是日志保存位置
- 多个选择器用","隔开,服务名和等级之间"."代表包含当前等级以上,".="代表当前等级,".!"代表除这个级别其他等级都包含
- 保存位置,@代表UDP,@@代表TCP,":"后加端口,或文件绝对路径
- 所有设置必须重启服务service rsyslog restart
-
搭建日志收集服务器
收信服务器:
vim /etc/rsyslog.conf
取消注释:
$ModLoad imtcp #开启tcp连接,也可以选择开启UDP
$InputTCPServerRun 514 #指定连接端口
tail -f /var/log/secrue
发信服务器:
vim /etc/rsyslog.conf
添加:
authpriv.* @@192.168.10.101:514 #添加服务
useradd huang #测试
-
日志轮替
作用:事先为日志设定规则,通过大小,时间进行轮替
原理:logrotate主要是针对rsyslog服务所管理的日志,也包含以下RPM包服务日志
/etc/logrotate.conf #主配置文件中的设置进行轮替规则
/etc/logrotate.d/* #一些rpm包的日志管理文件轮替规则
/etc/cron.daily/* #每天运行,查看轮替规则,达到标准,进行轮替,在/etc/cron.*还有其他时间目录也是一样功能
-
添加源码包apache日志轮替
vim /etc/logrotate.conf
添加:
/usr/local/apache2/logs/access_log {
daily
create
rotate 30
}
logrotate /etc/logrotate.conf #手动执行,达到标准的日志轮替,可以测试是否成功
logrotate -vf /etc/logrotate.conf #强制执行日志轮替,无论是否达到条件
注:{}中规则没有填写的根据/logrotate.conf 的规则执行,如果没有设置dateext命名规则,则文件根据file.1,file.2以此类推设置
-
日志切割
作用:事后发现日志过大,通过脚本进行日志切割
方法
split -l 100 install.log -d -a 3 文件名
-d 切割后文件的前缀
-a 切割后文件后缀,以数字表示 3 diabetes三位数
-l 指定切割行数
-
-
备份管理
- 备份原理
需要备份哪些数据
日志、用户配置文件、服务配置文件
备份策略
同端备份:在同一个主机的不同目录下备份(安全等级较低,恢复快速)
多端备份:将数据存放在不同的设备上备份(安全等会较高)
异地备份:灾备(异地容灾备份)在不同的地域进行数据备份(安全等级较高,备份和恢复难度较大)
云端备份:安全等级特别高,数据安全性不是很高,对象存储:AWS: s3 ali:OSS腾讯:COS
备份类型
原则:在不影响正常的业务的运行情况下进行备份
冷备:在数据停止写入后,进行数据备份
温备:停止某一部分的数据的写入,进行备份
热备:数据在持续读写过程中进行备份
备份方式
完整备份:将所有数据都复制一份
增量备份:
备份等级0-9,每次备份前一次数据增加量,备份压力很小,恢复过程复杂(按照指定顺序)
差异备份:
备份等级0-1,每次备份前一次备份数据和增加的数据,备份压力逐渐增大,但是安全等级较高
差异备份+轮询机制:
实现指定0等级备份的时间范围,重新开始差异备份
-
备份命令
yum -y install dump
增量:level 0-1-2-3-4-5-6-..
差异:level 0-1-1-1-1-1-1-..
dump -0uj -f /root/boot.dump.bz2 /boot
-level #0-9十个备份级别
-f #指定文件名
-u #备份分区是把备份时间记录在/etc/dumpdates
-v #显示详细信息
-j #备份后压缩
增量备份与恢复:
备份:只能备份0-9个级别
dump -0uj -f /root/boot.dump.bz2 /boot
dump -1uj -f /root/boot1.dump.bz2 /boot
dump -2uj -f /root/boot2.dump.bz2 /boot
..........
恢复:恢复顺序与备份顺序一致
restore -r -f /root/boot.dump.bz2
restore -r -f /root/boot1.dump.bz2
restore -r -f /root/boot2.dump.bz2
..........
差异备份:
备份:只备份0-1等级
dump -0uj -f /root/boot.dump.bz2 /boot
dump -1uj -f /root/boot1.dump.bz2 /boot
dump -1uj -f /root/boot1.dump.bz2 /boot
...........
恢复:只要恢复两次
restore -r -f /root/boot.dump.bz2
restore -r -f /root/boot1.dump.bz2
查看命令
dump -W #查看dump备份记录,只要挂载分区是才有记录
cat /etc/dumpdates #查看dump备份记录,只要挂载分区是才有记录
-
恢复命令
restore -C -f 备份文件 #一定要在需要恢复的路径下执行
-C #比较备份数据和实际数据的变化。如果实际数据中的现有数据发生了变化,这个选项能够检测这个变化。但是如果实际数据新增了数据,这个选项是不能检测到变化
-r #还原数据
-i #交互模式,一般进行恢复时文件选择
-t #查看模式,查看备份文档中的内容
-f #指定备份文件的名称
restore -i -f 备份文件 #交互模式下,有选择性的恢复数据
ls #列出该备份包中的所有文件
cd #切换到指定目录中
add #将需要恢复的数据进行标记
delete #将标记的文件取消标记
extract #将标记了的文件恢复到当前目录下
输入:
1(数字) #确认进行文件恢复
n #不重新设置要恢复数据的权限和归属
quit 退出交互模式
-
系统管理
- 进程管理
程序:永久存在的!
进程:程序运行的过程
线程:程序具体用来处理每一个任务的过程
程序(配置文件) --> 进程(主进程) --> 进程(子进程) --> 线程(处理任务)
ps #查看进程的静态信息
top #查看进程的动态信息
进程优先级:数值越小,优先级越高
PRI(最终值)=PRI(初始值)+NI
-
ps 详解命令
静态查看系统中的进程,查询的是命令执行一瞬间的进程的状态。
aux 以BSD操作系统的格式输出
-le 以Linux标准格式输出
选项详解:
a #显示一个终端的所有进程
u #显示进程的归属用户及内存的使用情况
x #显示没有控制终端的进程
l #长格式显示,更加详细的信息
e #显示所有进程 与a的作用一致
结果分析:
USER #该进程的运行用户,或者理解为产生进程的用户
PID #进程的PID号
%CPU #进程占用的cpu的百分比
%MEM #进程占用物理内存的百分比
VSZ #占用的虚拟内存的大小(KB)
RSS #占用物理内存的大小(KB)
tty #登录终端(Alt+F1-F6)
STAT #进程状态
D #无法中断的休眠状态(通常 IO 的进程)
R #正在运行的进程
S #处于休眠状态
T #停止或被追踪
W #进入内存交换(从内核2.6开始无效)
X #死掉的进程(基本很少见 )
Z #僵尸进程,没运行但存在
< #优先级高的进程
N #优先级较低的进程
L #被锁进内存的进程
s #进程的领导者(在它之下有子进程)
l #多进程的
+ #位于后台的进程组
START #进程启动时间
TIME #进程运行的时间(总时间),非系统时间
COMMAND #产生此进程的命令
ps -le 结果分析
F #进程标志,说明进程有那些权限
1 #进程可以复制
4 #进程使用超级用户权限
S #进程状态
PPID #进程的父进程ID号
C #cpu占比 %
PRI #进程优先级,数字越小优先级越高,越快被调用执行
NI #进程优先级,数字越小越先被调用
ADDR #进程存在内存的位置
SZ #进程占用的内存大小
WCHAN #进程是否运行(-代表正在运行)
-
top 详解命令
top [选项] [参数]
-d 秒数 #指定刷新频率
-b #使用批处理模式,和-n结合将top的结果重定向到文本
-n 次数 #指定top 次数,和-b结合
-p #指定查看某的PID的进程
-s #使top在安全模式下运行,避免在交互模式下出现错误
-u 用户名 #只查看(监听)某一个用户的进程
在交互模式下使用的命令:
?或h #帮助信息
P #按照CPU使用率排序
M #按照内存使用率排序
N #按照PID号排序
T #按照cpu运算时间排序
k #按照PID号给予某一个进程信发送指令,可用于杀死进程
r #按照PID给某个进程重设优先级(Nice)值
q #退出交互模式
top 结果分析
第一行信息:top - 23:49:08 up 1:21, 1 user, load average: 0.00, 0.01, 0.05
top系统时间 up系统运行时间 user在线用户 load average CPU负载
第二行信息:Tasks: 93 total, 1 running, 92 sleeping, 0 stopped, 0 zombie
total所有进程 running正在运行进程数 睡眠进程数 停止进程数 僵尸进程数
第三行信息:Cpu(s): 0.2%us, 0.3%sy, 0.0%ni, 98.7%id, 0.7%wa, 0.0%hi, 0.1%si
CUP使用 us已使用 sy未使用
第四行信息:Mem: 493952k total, 301832k used, 192120k free, 18568k buffers
内存使用 total内存总大小 buffers缓存大小
第五行信息:Swap: 2047996k total, 0k used, 2047996k free, 188072k cached
swap内存
#剩下的选项基本和我们的PS是相同的。
拓展:pstree 进程树
-p #显示PID
-u #显示运行用户
-
kill详解命令
kill 进程号
kill -l #查看kill 所支持的信号
常用的信号:
HUP(1) #复位,重新加载配置,相当于reload
#kill -hup 2244
#kill -1 2244
INT (2) #中断(同 Ctrl + C)
TERM(15) #终止(正常退出)
KILL(9) #强制终止,产生交换文件(vim)
CONT(18) #继续(与STOP相反)
STOP(19) #暂停(同 Ctrl + Z)
killall 进程名
killall -i #交互式,询问是否杀死
killall -I(大) #忽略大小写
pkill 终端号
pkill -9 -t 终端号 #强制杀死某登录终端
-
进程优先级修改
1、只有root用户可以减小优先级值,可调整范围(-20)-19,普通用户只能增加(0-19)范围
2、修改PRI只是临时生效,需要永久生效写脚本
ps –le 可以查看到进程的优先级
#PRI(最终值)=PRI(初始值)+NI
#PRI(初始值)大小固定不变的,要想修改进程的优先级,可以通过修改NI来改变
#如何修改NI值?可调整范围(-20)-19
#值允许root用户将进程的优先级调高(数值调小)
1. TOP的交互模式下,r调整指定PID号的进程的优先级(+-数值)
2. nice
nice -n 数值(+/-) service 服务名 start|restart
#只能借助启动或重启的过程来实现NI值的修改
#PRI(最终值)的数值越小,优先级越高,优先级越高越优先获取资源
3. renice
renice 数值(+/-) PID号
#改启动状态进程的NI值,通过指定PID号实现优先级的修改
-
终端工作号
PID(进程号):
#所有的程序在同一个操作系统中运行时,所分配到的一个唯一的身份标识(不区分终端)
工作号:
#在同一个终端上,位于后台的进程,会被单独分配一个工作号,方便快速的调用后台进程
#不同终端的后台任务,互相不可见
#工作号可以理解为是一种特殊的进程号
#进程里包含了所有的工作号
#在将某进程放入后台时(不管执行还是暂停),会顺序显示该进程的工作号和进程号
相关命令
bg 工作号 #将位于后台的暂停的任务,恢复到后台接着执行
fg 工作号 #将位于后台的暂停的任务,恢复到前台接着执行
jobs #查看所有后台任务
-l #显示工作进程PID
命令 & #将工作到到后台,并持续执行
ctrl + z #将工作放到后台,并暂停执行
让后台的工作脱离终端进行运行
1、/etc/rc.local 文件
2、定时计划任务(下边)
3、nohup 命令 选项 操作对象 &
#查看到exit 表示命令没有执行成功,会生成nohup.job文件可以查错
-
系统资源查看
查看CPU数量
cat /proc/cpuinfo | grep "processor" | wc -l
#逻辑CPU个数,即为所有物理CPU上的core的个数
cat /proc/cpuinfo | grep "physical id" | sort -u | wc -l
#物理CPU个数
cat /proc/cpuinfo | grep "cpu cores" | uniq | awk -F: '{print $2}'
#每个物理CPU中Core的个数
cat /proc/cpuinfo | grep "core id" | uniq | wc -l
#查看core id的数量,即为所有物理CPU上的core的个数
查询进程或命令调用的资源
ldd 命令路径 #查看该命令运行时所需要调用的函数文件
lsof 进程 #查看进程在运行过程中,所调用的所有资源
-p PID #根据PID号查询
-u 用户名 #根据用户名查询
vmstat #监控系统资源
Procs(进程):
r: 正在运行进程
b: 阻塞的进程
Memory(内存):
swpd: 虚拟内存已使用的大小
free: 空闲的物理内存的大小
buff: 用作缓冲的内存大小(系统)
cache: 用作缓存的内存大小(被调用资源)
Swap:
si: 每秒从磁盘读入虚拟内存的大小
so: 每秒虚拟内存写入磁盘的大小
注:如果这个值大于0,表示物理内存不够用
IO: (现在的Linux版本块的大小为1024bytes)
bi: 从系统写入硬盘的块数
bo: 从硬盘读入系统的块数
system:
in: 每秒CPU中断数,包括时钟中断。
cs: 每秒上下文切换数(资源调用的次数,如:函数)。
CPU(以百分比表示):
us: 用户进程执行消耗cpu时间(user time)
sy: 系统进程消耗cpu时间(system time)
id: 空闲时间(包括IO等待时间)
wa: 等待IO时间
st: 虚拟机偷取时间(不为0则代表cpu被其他虚拟机所调用)
dmesg #查看开始是内核的检测信息(/var/log/dmesg)
free #查看内存使用情况
-b 以字节为单位显示
-k 以KB为单位(默认)
-m 以MB为单位
-g 以GB为单位
显示信息解释:
第一行:
total: 总计物理内存的大小
used: 已使用内存大小
free: 空闲内存大小
shared: 共享内存,一般系统不会用到
Buffers/cached: 未使用的缓存大小
第二行:(-/+ buffers/cached)
(-buffers/cache)used内存数:第一部分Mem行中的 used – buffers – cached
(+buffers/cache)free内存数:第一部分Mem行中的 free + buffers + cached
注:可见-buffers/cache反映的是被程序实实在在吃掉的内存,而+buffers/cache反映的是空闲的内存总数
uptime #系统启动时间和平均负载(一般用top)
uname #查看系统与内核相关信息
-a 查看所有相关信息
-r 查看内核版本
-s 查看内核名称
lsb_release -a #查看当前发行版
-
定时任务
单次计划任务:只执行一次的定时任务
命令:at
服务:atd(必须开机自启)
格式:at [-选项] 时间
格式一:
at 12:00 2018-07-18 #在指定的精确的时间点执行任务
>shutdown -h now #要执行的命令
>ctrl+d #保存并退出
格式二:
at now+10(minutes, hours, days, weeks) #在经过指定的时间后执行任务(倒计时)
>shutdown -h now #要执行的命令
>ctrl+d #保存并退出
at -m #让指定的计划任务在执行完成后,给任务的执行者发送邮件通知
atq #查看计划任务的列表(只显示未执行的),显示每一个任务的任务号
atrm 任务号 #删除指定任务号的计划任务
at -c 任务号 #查看指定任务号的详细信息(要执行的内容)
at 的黑白名单
at.allow(默认不存在)
at.deny(默认存在)
#当白名单不存在,黑名单为空时:所有用户都可以使用at设置定时任务
#当前情况下:若黑名单中有用户,则只有该用户无法执行定时任务
#白名单的优先级高于黑名单(有了白名单文件,黑名单文件失效)
#当黑白名单都存在,但都为空时:只有root用户能指定定时任务
#当黑白名单都存在,白名单为空,黑名单有用户:只有root用户能指定定时任务
#当白名单存在时,由于白名单优先级高于黑名单,只有在白名单中写入用户时,才是放行某用户,否则所有的普通用户都无法执行定时任务
循环计划任务:
按照给定的时间规则,在指定的时间循环内执行任务
命令:crontab
服务:crond(必须开机自启)
crontab -e #编辑定时计划任务
crontab -l #查看设定好的任务
crontab -r #删除所有的计划任务(慎重执行,所有的任务都写在了同一个文件中)
编辑配置文件时的格式:
分 时 日 月 周 #日期和星期一般不同时设置(取其一)
* * * * * #要执行的任务(命令、脚本)
分:0-59
时:0-23
日:1-31
月:1-12
周:0-7 #0和7都是周天
* #表示该范围内的任意时间
, #表示间隔的多个不连续时间点
- #表示一个连续的时间范围
/ #指定间隔的时间频率
例子:
0 17 * * 1-5 #周一到周五每天17:00
30 8 * * 1,3,5 #每周一、三、五的8点30分
0 8-18/2 * * * #8点到18点之间每隔2小时
0 * */3 * * #每隔3天
频率:
在指定的时间内,每隔多久执行一次任务
0 12 */3 * * /bin/bash /sh/a.bash
默认是最小到分钟,可以通过sleep命令实现秒级定时循环
* * * * * bash a.bash
* * * * * sleep 30 && bash a.bash
#每隔30s执行一次任务
/etc/cron.daily #放入到该目录下的脚本会每天指定一次
cron黑白名单
cron.allow(默认不存在)
cron.deny
#使用限制和at服务的限制是一样的!
-
Linux网络基础
linux配置
临时配置:
使用命令调整网络参数简单、快速,可直接修改运行中的网络参数一般只适合在调试网络的过程中使用,系统重启以后所做的修改将会失效
永久配置:配置文件修改,重载服务或者重启以后才会生效
协议分类
网络层协议:IP协议、ICMP、ARP等
传输层协议:TCP、UDP等 TCP/IP 协议簇
应用层协议:DHCP、DNS、FTP、HTTP、SSH等
常见端口
20 21 ftp服务 #文件共享
22 ssh服务 #安全远程网络管理
23 telnet服务 #明文远程连接
25 smtp: #简单邮件传输协议(发信)
465 smtp(ssl) #发信
110 pop3: #邮局协议(收信)
143 Imap4 #收信
993 imap4(ssl) #收信
80 www #网页服务(http://)
443 https://
3306 mysql端口
53 DNS端口
IP地址配置
临时:ifconfig 网卡 IP地址 子网掩码
例:
ifconfig eth0 192.168.12.250 netmask 255.255.255.0
ifconfig eth0 192.168.12.250/24
ifconfig eth0:0 192.168.12.254/24 #添加子端口
永久:修改/etc/sysconfig/network-scripts/ifcfg-eth0
重启网络服务:service network restart #针对所有网络服务
启动关闭网卡:ifdown eth0;ifup eth0 #针对单个网卡
主机名配置
查看主机名:hostname
linux可以重复主机名,windows不能原因:
linux:不需要考虑wins
windows:需要考虑wins
wins服务:IP与主机转换功能,使用netbios协议底层协议
centos6中修改主机名
临时设置主机名:hostname 主机名
永久设置:修改/etc/sysconfig/network文件
centos7中修改主机名
hsotnamectl set-hsotname xx.xx.xx(FQDN)
注:区别 /etc/rc.d/rc.sysinit 和 /etc/sysconfig/network
1./etc/hosts 域名解析文件
2.优先级比dns服务高
3.主机名有可能被hosts更改,规则在/etc/rc.d/rc.sysinit
4.如果主机名未修改,并且hosts文件中有一条针对本机IP的解析记录,则结果作为该解析的结果,如果主机名已经修改过,则不会变化
网关配置
网关:应用在末梢网络中,默认路由,用于特殊环境
路由:应用于任何环境,跟精确匹配
route -n 查看系统中的路由表信息
临时:
默认网关:
添加:route add default gw ip
删除:route del default gw ip
指定路由:
添加:route add -net 网段 gw ip
删除:route del -net 网段 #实际配置路由条目
永久:
网关:
/etc/sysconfig/network-scripts/ifcfg-eth0
路由:
/etc/rc.local
DNS配置
注:配置DNS时,理论上不需要重启服务,过段时间会自动刷新。
域名解析测试命令:nslookup
1./etc/sysconfig/network-scripts/ifcfg-eth0 #针对eth0的网卡配置dns
DNS1=IP
2./etc/resolv.conf #全局的dns配置
主机映射文件:/etc/hosts #优先级比dns服务高
用于保存主机名和IP地址的映射记录,但这种映射只是本地机的映射,也就是说每台机器都是独立的
主机映射文件和DNS服务器的比较:
默认情况下,系统首先从hosts文件查找解析记录
hosts文件只对当前的主机有效
hosts文件可减少DNS查询过程,从而加快访问速度
netstat 查看系统的网络连接状态、路由信息、接口等
例:
netstat -antp
netstat -tlun
-a:显示所有活动连接
-n:以数字形式显示
-t:查看TCP协议相关信息
-u:查看UDP协议相关信息
-p:显示PID和进程名
-l: 监听
traceroute测试命令
原理:TTL网络生存周期,逐渐增加TTL跳数,直到到达目标端口
作用:测试从当前主机到目的主机之间经过的网络节点,用于追踪数据包在网络上的传输时的全部路径,它默认发送的数据包大小是40字节,默认使用UDP协议进行传输,返回值为ICMP
显示:从第一个路由到其他路由的时间
例:traceroute 网址或IP #linux用
tracert 网址或IP #windows用
-I (大) #使用ICMP协议进行测试,Linux中默认使用UDP。
-p 3 #指定测试时发送的数据包个数(即测试次数)
-n #以IP的方式进行连接测试,避开DNS的解析,减少延时
注意:1当返回值中间出现*号时,一般情况是中间节点防火墙封掉了ICMP的返回值。
2当返回值从中间到结束都是*号时,一般情况为目标服务器拒绝接收UDP数据包或禁止了ICMP的返回包
ping测试网络连通性
使用ICMP协议
-i #指定间隔时间
-c #指定ping的次数
-s #指定数据包的大小
arp 地址解析协议
例:arp -a
-a 查看所有
-d ip地址 #删除某条ARP记录
-s ip地址、MAC地址 #绑定ip地址
nmap网络探测扫描命令
作用:查询网络中有哪些主机,尝试跟端口进行连接
处理僵尸进程:根据http状态码,查询
-sP #探测某网段内有哪些主机是存活的
-sT IP #探测某主机上开启了哪些TCP端口
-sS IP #同上,但是是安全扫描,被扫描主机将记录很少的日志
-O IP #扫描对方的操作系统类型
远程管理
Windows à Linux : VNC
1 yum –y install tigervnc tigervnc-server
2 vncpasswd--windows
3 vncserver--linux
Linux à Windwos : rdesktop
1 yum –y install rdesktop
2 rdesktop –f –u 用户名 –p 密码 –a 16 IP
#linux需要时桌面模式
远程传输工具
scp 进行文件的上传和下载
例:
scp ./install.log root@192.168.88.20:/root/ #以本地作为源
scp root@192.168.88.20:/root/install.log ./ #以其他机子作为本地
上传:scp 本机文件 用户名@IP地址:目录
下载:scp 用户名@IP地址:文件 本地位置
指定端口:-P (大) #不是默认端口需要指定端口
sftp 安全的ftp传输
登录: sftp 用户名@ip地址
指定端口: -oPort=端口
常用命令:远程主机ls cd pwd put get
本地 lls lpwd
telnet远程连接
服务端安装:telnet-server
客户端安装:telnet
客户端连接:telnet 服务端IP 23
SSH远程连接
使用的软件:openssh
ssh 远程登录命令
登录:ssh 用户@ip地址
指定端口:-p(小)
-
常用命令
ls 显示目录文件
选项:-d 显示当前目录
-i 显示inode号
-h 常见单位显示
-a 显示所有文件包括隐藏文件
cd 切换目录(shell内置命令)
cd - 进入上一次目录
cd ~ 进入家目录
cd .. 进入上级目录
pwd 显示当前路径
mkdir 建立目录
例:mkdir -p /huang/xiao/qi 递归建立
rm 删除文件
选项:-r递归,删除目录
-f强制
例:rm -rf 文件和目录
tree 显示目录下所有目录树(要安装的命令)
touch 创建新文件或修改文件时间
cat 查看文件内容
选项:-n显示行号
例:cat -n 文件名
more 分页显示文件内容
空格键:下翻 n键:上翻 q键:退出
less 分行显示文件内容
空格键或pgdn:下翻 pgup键:上翻 q键:退出
head 显示文件头,默认10行
选项:-n 指定显示文件头几行
tail 显示文件后几行,默认10行
选项:-n 指定显示文件头几行
-f 监听文件尾部
cp 复制文件(如果复制链接文件,则复制原文件)
选项:-r 复制目录(包括目录内文件数据)
-p 连带文件属性复制
-d 若源文件是链接文件,则复制链接属性
-a 相当于-rpd
例:cp -pdr 源文件位置 目的位置
mv 剪切或改名
例:mv 源文件 目的文件位置
type 区分命令类型
例:type 命令
ln 生成链接文件(硬链接)
选项:-s 生成软链接
例:ln -s 源文件 目的文件
chmod 修改权限
例:chmod 775 文件或目录
选项:-R 递归设置,将设置到该目录上的权限递归设置到该目录下的所有子文件上
chown 修改所有者
例:chown 用户:用户组 文件或目录名 (同时修改所有者和所属组)
选项:-R 递归设置,将设置到该目录上的所有者递归设置到该目录下的所有子文件上
chgrp 修改所属组
例:chgrp 所属组 文件名或目录
umask 查看文件和目录默认权限
man 查看命令帮助
例: man -f 命令
选项:-f 查看命令等级
0-9 命令等级
help 查看内部命令帮助
例:help 内部命令
--help 查看常用命令选项帮助
例:命令 --help
命令 --version 查看命令作者
info查看帮助页
例:info 命令
选项:n进入下一小节
p进入上一小节
q退出
enter确认
which查找存储命令路径与alias别名
例:which 命令
whereis查找存储命令路径与man帮助存储位置
例:whereis 命令
whatis 查询命令帮助等级
例:whereis 命令
locate按文件名查找系统中的文件(包含匹配,在系统数据库中查找)
例:locate 文件名
配置文件:/etc/updatedb.conf
配合命令:updatedb强制更新数据库/var/lib/mlocate/mlocatedb位置
find 查询符合条件的文件名(完全匹配,可用通配符)
例:find 查找位置 选项 文件名
选项:-name 按文件名查找
-iname 不区分大小写
-size 按文件大小查找
-type 按文件类型查找(f:文件d:目录l:链接)
-ctime 按权限修改时间查找,如+4,-4,4天
-mtime按数据修改时间查找
-atime 按访问时间查找
-nouser按没有属主的文件查找
-user 按用户名查找
-group 按用户组查找
-uid 按用户ID查找
-gid 按属组组ID查找
-inum 按i节点查找
-perm 按权限查找,如775
-exec {} \;管道符作用
grep 查找符合条件的字符串,文件中查找数据,包含匹配
例:grep "字符串" 文件名
选项:-i 不区分大小写
-v 反向
-c 统计符合条件的行数
-A 数字 #列出符合条件的行,并连续列出后面n行
-B 数字 #列出符合条件的行,并连续列出前面n行
--colour=auto 查找字符显示红色
"|" 管道符,命令1的结果作为命令2的条件
例:ls -l | grep "^-"
netstat 查看系统网络状态
例:netstat -tuln
选项:-t 显示tcp
-u 显示udp
-l 监听
-n 显示IP和端口
tar 打包压缩命令
例:tar -zcvf 压缩文件名 源文件
选项:-z:gz格式 -j:bz2格式
-c:解压 -x:压缩
-t:显示压缩文件不解压
-C:解压到指定位置
tar -zxvf 123.tar.gz 123/aaa -C /root/ 解压其中一个文件
w 查看当前在线用户(显示用户登入时间,在线持续时间,1,5,15分钟前的cpu负载,来源IP)
who查看当前在线用户(在线持续时间,来源IP)
last 列出登入相关信息(显示用户开始登入时间,退出登入时间,在线时间,系统重启时间)
文件位置:/var/run/wtmp
lastlog显示账户最后一次登入时间
文件位置:/var/run/utmp
write 给在线用户写信息
wall对所有在线用户说话
mail邮件命令
例:mail 用户名 (写信ctrl+d:保存退出)
选项:1 2 查看对于邮件 h列出邮件标题 q退出
邮件保存位置:/var/spool/mail/root
ping网络探测
选项:-c 指定次数
-s 指定数据包大小
ifconfig查看网卡配置
例:ifconfig etho0 配置临时生效网卡
netstat查看网络状态
例:netstat -tuln
选项:-t tcp
-u udp
-l listen
-n 显示IP和端口
配置文件:/etc/services
telnet 测试端口连通性
例:telnet IP 端口
sync数据同步,强制把内存数据保存到硬盘
shutdown关机重启命令
例:shutdown -r now重启(可以指定时间,建议使用)
shutdown -h now关机
mount挂载命令(直接执行可以查看已经挂载的挂载点)
例:mount [-t iso9660] /dev/sr0 挂载点
选项:-t 文件系统 光盘iso9660 U盘fat:16或vfat:32
-L 卷标名 挂载指定卷标的分区
-o 特殊选项 可以指定挂载的额外选项
常用挂载
挂载光盘
例:mount 【-t iso9660】 /dev/sr0 /mnt/cdrom
卸载挂载
例:umount /mnt/cdrom
指定字符编码挂载
例:mount -o iocharset=utf8 /dev/sr0 /mnt/cdrom/
挂载特殊指定项
mount -o remount,exec 挂载点(remount针对已挂载)
挂载本地镜像
mount -o loop 镜像文件 挂载点
查看分硬盘区
例:fdisk -l
显示当前系统字符编码
例:echo $LANG
修改字符编码
例: $LANG=zh_CN.UTF-8
$LANG=en_US.UTF-8
强制把内存数据保存到硬盘中(建议重启前使用)
例:sync
重启命令(建议使用)
例:shutdown -r now 或指定时间 05:30
umount 卸载挂载点
例:umount 挂载点或设备文件名
rpm二进制包安装命令
例:rpm -ivh 包全名
选项:-i:安装
-v:显示更详细信息
-h:显示安装进度
-q:查询包是否安装
-a:查询所有安装包
-qi:查询安装包的信息
-qip:查询未安装包的信息
-ql:查询包中,文件的安装位置
-qf:查询系统文件属于哪个安装包
-qR:查询软件包所依赖的软件包
-qRp:查询没有安装的软件包的依赖包
-e:卸载
-V:检验安装包有没有修改过
-U:升级安装包,如果没有安装,就安装
-F:升级安装包,如果没有安装,就不安装
--force:强制安装,用于文件丢失
--import:用于导入数字证书,安装包在
date修改时间命令
例:date -s 20180613或15:12:11
选项:-s:指定时间
lrzsz安装包,用于xshell上传或下载文件的
例:先安装lrzsz安装包,
选项:rz:下载
sz:上传
dos2unix和Unix2dos安装包,需要安装,用于Windows和Linux系统之间的文件转换
例:dos2unix 文件名 或 unix2dos 文件名
yum在线安装
例:yum -y install 包名
选项:install安装
remove卸载
update升级(如果不指定包名,就全部软件升级,小心使用)
list查看yum源所有可以安装的rpm包,可以指定包名
search查看yum源中所有与关键字相关的包
info查看包的信息
grouplist查看所有软件组
groupinstall安装指定组包
groupinfo查看组包中的软件
groupremove卸载组包
LANG查看系统当前语言
例:LANG=zh_CN.UTF-8
选项:echo $LANG 查看当前使用语言
uname -r 查看系统内核版本
du 统计目录大小(统计文件大小是准确的)
例:du -sh 目录
选项:-h 人性化显示
-s 和
-a 显示每个子文件磁盘占用量
df 查看分区大小(查看硬盘剩余空间是准确的)
例:df -h
选项:-h 人性化显示
-a 显示所有文件系统
-T 显示挂着的文件系统类型
diff 生成补丁
例:diff -Naur 旧文件 新文件 > 补丁文件
patch导入补丁命令
例:patch -pn < 补丁名 (-n:数字 -p:取消路径等级)
防火墙关闭
例:iptables -F (临时生效,清空防火墙配置)
service iptables stop(永久生效,停止防火墙服务)
chkconfig iptables off(永久生效,防火墙服务开机不启动)
useradd添加用户
例:useradd 选项 参数 用户名
选项: -u:UID
-g:指定初始组
-d:指定家目录,目录不需要事先创建
-s:指定登录shell
-G:指定附加组
-r:创建系统用户,默认密码失效,没有家目录,与-s一起使用,指定shell为/sbin/nologin
passwd修改密码
例:passwd 选项 用户
选项: -l:锁定用户密码
-u:解锁用户密码
-U:查看密码状态
usermod用户信息修改
例:usermod 选项 用户名
usermod -m -d /home/已更改名 用户名
选项: -u:修改UID
-g:修改初始组
-d:修改家目录与-m一起使用
-L:锁定密码
-U:解锁密码
-G:修改附加组
-l 新用户名 旧用户名 修改用户名
-s:修改登录的shell
userdel删除用户
例:userdel 选项 用户名
选项:-r:连家目录一起删除
groupadd增加组
例:groupadd 组名
groupdel删除组
例:groupdel 组名(尽量空组)
gpasswd向组内添加成员
例:gpasswd 选项 用户名 组名
选项:-a:指定一个用户添加到组
-d:删除组内成员
-M:批量添加组成员
echo $?(上次命令是否执行成功,0表示成功,非0表示错误)
id显示用户的UID,初始组,附加组
例:id 用户名
su切换用户
例:su 用户名
例:su - 用户名 连带环境变量一起切换
newgrp切换有效组
例:newgrp 组
dumpe2fs查看ACL权限
例:dumpe2fs 分区 | grep acl
setfacl设置ACL权限
例:setfacl -m u:用户名:权限 文件名(添加ACL权限rwx)
setfacl -x u:用户 文件名(删除ACL权限)
setfacl -b 文件名(清空ACL权限,包括mask)
setfacl -m u:权限(设置mask权限)
setfacl -R -m u:用户名:权限 文件名(递归设置)
setfacl -d -m u:用户名:权限 文件名(默认权限设置)
getfacl查看文件权限
例:getfacl 文件名或目录
chattr 文件属性设置
例:chattr +i 文件或目录
选项:i:对文件,不允许任何操作修改
对目录,那么只能修改目录下文件的数据
a:对文件,那么只能在文件中增加数据
对目录,那么只允许在目录中建立和修改文件
e:表示该文件是使用ext文件系统进行存储的,而且不能使用"chattr -e"命令取消e属性
lsattr 查看文件属性
例:lsattr -a 文件名
选项:-a 显示所有
-d 如果目标是目录,仅显示目录本身
77.fsck文件系统修复命令
例:fsck -y 分区名
dumpe2fs 显示磁盘状态
例:dumpe2fs -h 分区名
#卷标,挂载点,UUID,挂载参数,文件系统状态,inode总量/空闲,block总量/空闲,单个block大小
stat显示文件详细信息
例:stat 文件名
#文件名,文件大小,占用的block的大小,所在设备编号,硬链接数,属组,属主,权限,访问时间,数据修改时间,状态时间
file判断文件类型
例:file 文件名
type判断命令是否是内部或外部命令
例:tpye 命令
fdisk分区命令MBR
例:fdisk -l 查看磁盘分区
选项:fdisk 进入分区交互模式
-m 操作菜单
-n 新建分区
-p 查看分区
-d 删除分区
-q 退出不保存
-w 退出保持
-t 修改分区属性(可以更改swap分区用)
-L 查看分区属性
82. partprobe强制读取所有分区
例:若分区报错,可使用此命令,若没安装,parted-2*安装包
mkfs格式化分区
例:mkfs -t ext4 分区名
mkfs -t ext4 -b4096 -i4096 分区
mkfs.ext4 分区
84. parted分区命令GPT
例:parted 分区 #进入交互模式
选项:p 打印分区表
mklabel 更改分区表类型gpt/msdos
mkpart 创建分区
rm 删除分区
q 退出(修改实时生效)
85. swap分区命令
例:1.fdisk分区
2.更改分区属性为swap
3.mkswap 格式化分区
4.swapon 开启swap分区
5.free查看swap分区状态
86. quota磁盘配额相关命令
选项:quotacheck -avgu 生产磁盘配额文件
-a #扫描所有磁盘
-v #显示扫描过程
-c #清楚原有文件重新生成行动文件
-g #生成组文件
-u #生成用户文件
edquota -u 用户名 #指定用户限制设置
-g 组名 #指定组限制设置
-t #用户宽限天数设置
-T #组宽限天数设置
-p #复制设置
quota -uvs #查看此用户在所有磁盘的配额
quota -hvs #查看此组在所有磁盘的配额
repquota -ugvs 分区 #查看该分区的所有配额设置
quotaon -guav 分区 #开启指定分区磁盘配额设置
quotaoff -guav 分区 #关闭指定分区磁盘配额设置
87. dd用指定大小的块拷贝一个文件
if=指定源文件
of=指定目的文件
bs=bytes:同时设置读入/输出的块大小为bytes个字节
count=blocks:仅拷贝blocks个块,块大小等于ibs指定的字节
dd应用实例
1.将本地的/dev/hdb整盘备份到/dev/hdd
dd if=/dev/hdb of=/dev/hdd
2.将/dev/hdb全盘数据备份到指定路径的image文件
dd if=/dev/hdb of=/root/image
3.将备份文件恢复到指定盘
dd if=/root/image of=/dev/hdb
4.备份/dev/hdb全盘数据,并利用gzip工具进行压缩,保存到指定路径
dd if=/dev/hdb | gzip > /root/image.gz
5.将压缩的备份文件恢复到指定盘
gzip -dc /root/image.gz | dd of=/dev/hdb
6.备份与恢复MBR
a.备份磁盘开始的512个字节大小的MBR信息到指定文件:
dd if=/dev/hda of=/root/image count=1 bs=512
count=1指仅拷贝一个块;bs=512指块大小为512个字节。
b.恢复:
dd if=/root/image of=/dev/had
将备份的MBR信息写到磁盘开始部分
7.拷贝内存内容到硬盘
dd if=/dev/mem of=/root/mem.bin bs=1024 (指定块大小为1k)
8.拷贝光盘内容到指定文件夹,并保存为cd.iso文件
dd if=/dev/cdrom(sr0) of=/root/cd.iso
9.增加swap分区文件大小
第一步:创建一个大小为256M的文件:
dd if=/dev/zero of=/swapfile bs=1024 count=262144
第二步:把这个文件变成swap文件:
mkswap /swapfile
第三步:启用这个swap文件:
swapon /swapfile
第四步:编辑/etc/fstab文件,使在每次开机时自动加载swap文件:
/swapfile swap swap default 0 0
10.销毁磁盘数据
dd if=/dev/urandom of=/dev/hda1
注意:利用随机的数据填充硬盘,在某些必要的场合可以用来销毁数据。
11.测试硬盘的读写速度
dd if=/dev/zero bs=1024 count=1000000 of=/root/1Gb.file
dd if=/root/1Gb.file bs=64k | dd of=/dev/null
12.确定硬盘的最佳块大小:
dd if=/dev/zero bs=1024 count=1000000 of=/root/1Gb.file
dd if=/dev/zero bs=2048 count=500000 of=/root/1Gb.file
dd if=/dev/zero bs=4096 count=250000 of=/root/1Gb.file
dd if=/dev/zero bs=8192 count=125000 of=/root/1Gb.file
88. LVM逻辑卷管理命令
选项: pvcreate 磁盘设备名 #创建物理卷
pvscan或pvdisplay #查看物理卷
pvremove #删除物理卷
vgcreate -s PE大小 卷组名 物理卷名 #创建卷组
vgscan或vgdisplay #查看卷组
vgremove 卷组名 #删除卷组
vgextend 卷组名 物理卷名 #增加物理卷
vgreduce 卷组名 物理卷名 #删除物理卷
lvcreate -L 大小 -n lv名 卷组名 #创逻辑卷
lvscan或lvdisplay #查看逻辑卷
lvremove 逻辑卷名 #删除逻辑卷
lvextend -L +大小 分区名 #增加逻辑卷容量,只修改MBR表
resize -f 分区名 分区实际大小 #修改superblock大小 e2fsck -f 分区名 #检查文件系统
resize -f 分区名 减少到大小 #与增加大小反着来
lvreduce -L 实际大小 分区名
89. RAID设置命令
例:mdadm -Cv md* -l10 -n4 磁盘 -x2 热备 #创建RAID10
mdadm -D 查看RAID10状态
mdadm -f cip #指定磁盘损坏
mdadm 设备名md* --remove 磁盘 #移除磁盘
mdadm 设备名md* --add 磁盘 #添加磁盘
mdadm -S 设备名md* #停止RAID
mdadm --zero-superblock 设备名md* #删除RAID
90. set查询当前所有生效的变量
例:set -u #设置后,被调用的无效变量报错
set -x #设置后,每次执行命令,打印一次命令
unset 变量名 #取消变量
91. env只查询环境变量
92. echo 输出到屏幕
例:echo -e "字符或格式"
选项:-e 支持反斜线控制的字符转换
-n 取消输出后行尾的换行符
93. history历史命令
例:history -c #清空历史命令
-w #把缓存的历史命令保存到配置文件中
dd命令详解
作用
dd:用指定大小的块拷贝一个文件
格式
dd if=/dev/zero of=/指定目录 bs=1M count=1000
if=文件名:输入文件名,缺省为标准输入。即指定源文件。< if=input file >
of=文件名:输出文件名,缺省为标准输出。即指定目的文件。< of=output file >
bs=bytes:同时设置读入/输出的块大小为bytes个字节。
count=blocks:仅拷贝blocks个块,块大小等于ibs指定的字节数。
dd应用实例
将本地的/dev/hdb整盘备份到/dev/hdd
dd if=/dev/hdb of=/dev/hdd
将/dev/hdb全盘数据备份到指定路径的image文件
dd if=/dev/hdb of=/root/image
将备份文件恢复到指定盘
dd if=/root/image of=/dev/hdb
备份/dev/hdb全盘数据,并利用gzip工具进行压缩,保存到指定路径
dd if=/dev/hdb | gzip > /root/image.gz
将压缩的备份文件恢复到指定盘
gzip -dc /root/image.gz | dd of=/dev/hdb
6. 备份与恢复MBR
a.备份磁盘开始的512个字节大小的MBR信息到指定文件:
dd if=/dev/hda of=/root/image count=1 bs=512
count=1指仅拷贝一个块;bs=512指块大小为512个字节。
b.恢复:
dd if=/root/image of=/dev/had
将备份的MBR信息写到磁盘开始部分
拷贝内存内容到硬盘
dd if=/dev/mem of=/root/mem.bin bs=1024 (指定块大小为1k)
拷贝光盘内容到指定文件夹,并保存为cd.iso文件
dd if=/dev/cdrom(sr0) of=/root/cd.iso
增加swap分区文件大小
第一步:创建一个大小为256M的文件:
dd if=/dev/zero of=/swapfile bs=1024 count=262144
第二步:把这个文件变成swap文件:
mkswap /swapfile
第三步:启用这个swap文件:
swapon /swapfile
第四步:编辑/etc/fstab文件,使在每次开机时自动加载swap文件:
/swapfile swap swap default 0 0
销毁磁盘数据
dd if=/dev/urandom of=/dev/hda1
注意:利用随机的数据填充硬盘,在某些必要的场合可以用来销毁数据。
11. 测试硬盘的读写速度
dd if=/dev/zero bs=1024 count=1000000 of=/root/1Gb.file
dd if=/root/1Gb.file bs=64k | dd of=/dev/null
通过以上两个命令输出的命令执行时间,可以计算出硬盘的读、写速度。
/dev/zero,是一个输入设备,你可你用它来初始化文件。该设备无穷尽地提供0,可以使用任何你需要的数目——设备提供的要多的多。他可以用于向设备或文件写入字符串0。
/dev/null——它是空设备,也称为位桶(bit bucket)。任何写入它的输出都会被抛弃。如果不想让消息以标准输出显示或写入文件,那么可以将消息重定向到位桶。外号叫无底洞,你可以向它输出任何数据,它通吃,并且不会撑着!
12. 确定硬盘的最佳块大小:
dd if=/dev/zero bs=1024 count=1000000 of=/root/1Gb.file
dd if=/dev/zero bs=2048 count=500000 of=/root/1Gb.file
dd if=/dev/zero bs=4096 count=250000 of=/root/1Gb.file
dd if=/dev/zero bs=8192 count=125000 of=/root/1Gb.file
通过比较以上命令输出中所显示的命令执行时间,即可确定系统最佳的块大小。