1965年,美国麻省理工学院(MIT)、通用电气公司(GE)及AT&T的贝尔实验室联合开发Multics工程计划,其目标是开发一种交互式的具有多道程序处理能为的分时操作系统,但因Multics追求的目标过于庞大复杂,项目进度远远落后于计划,最后贝尔实验室宣布退出。
1969年,美国贝尔实验室的肯汤普森在DECPDP-7机器上开发出了UNIX系统。
a)AIX系统:由IBM公司在Unix的内核上开发出来的系统
b)HP-UX:由HP戴尔公司在Unix的内核上开发出来的系统
c)Solaris(蛇牢瑞死):由SUN微软公司在Unix的内核上开发出来的系统
Linux的版本分类
a)Redhat6.x2.6.x(瑞的汉的)
b)Redhat7.x3.10.x
a)Redhat系列
b)Debian系列
Linux:主要发行版本
c)Redhat(瑞的汉的)系列
d)Debian(爹饼)系列
常见开源软件:
e)Apache:web服务器
f)Nginx(Ng克死):web服务器
g)Mysql:数据库
h)PHP:脚本语言
i)Samba(伤八):Linux跟Windows之间的内网文件服务器
j)Python:脚本语言
k)Ruby(如比):脚本语言(日本开发)
l)Sphinx(斯分克丝):中文分词
m)MongoDB(NO谁库):NOSQL数据库
n)Redis(瑞地死):Linux中的辅助数据库
注意:Redis是用来辅助Mysql数据库的,用来优化SQL性能
GPT:开源软件规范(拥有法律效率)
Windows格式化续
Linux系统文件格式
p)EXT2
q)EXT3
r)EXT4
s)XFS
Linux分区表类别
a)MBR分区表:主引导记录分区表,最大只支持2.1T硬盘,最多支持4个分区。
b)GPT分区表:全局唯一标示分区表,支持9.4ZB硬盘,(1ZB=1024PB,1PB=1024EB,1EB=1024TB)理论上GPT支持无限制分区。
a)主分区:最多只能有4个
b)扩展分区:最多只能有1个,主分区加扩展分区最多有4个,不能写入数据,只能包含逻辑分区
c)逻辑分区:在扩展分区能多支持多个逻辑分区,至少10个以上,可以写入数据。
注意:Linux跟windows的二个分区表同样的
Linux分区步骤
t)分区
u)格式化
v)设备文件名:给分区写入设备文件名,有了设备文件名才可以给挂载点
w)挂载点:使用已经建立的空目录作为挂载点(任何目录都可以,除了/bin//etc//lib/)
注意:Linux下一切皆为文件
swap(死我扑)
分区设备名
x)设备文件名:
注意:/是Linux的根目录,叫根,是Linux的最高一级目录
Linux是树型结构,根目录下放一级目录,一级目录下放二级目录等。
Windows也是树型结构,不过他是先分我的电脑—磁盘—目录等。
dex是专门用来放硬件设备的目录,所以里面放的内容大多是硬件特殊设备的
hda1跟sda1,中的a字母是代表你当前是第几块硬盘,要是2块硬盘a字母就会变成b字母
hda1跟sda1,中的1数字是代表你当前是第几个分区,要是第二分区1数字就会变成2数字
1-4数据的标志一定是给主分区跟扩展分区的,无论逻辑分区怎么分,都会从5数字开始
Linux分区
y)必须分区:不分不能装系统
z)推荐分区
注意:如果有单独的分区,他会有单独的存储空间,可以往里面写入数据,是不会写在根目录里的,是写在自己的空间里的。也就是说从系统上来看,他们是从属关系,根是最高目录。如果从硬盘来看,要单独分区,他就会有单独的存储空间。所以才叫单独分区
Linux安装
Desktop图形界面
MinimalDesktop(秘你楼)图形界面
Minimal最小化安装
Basicserver(贝思客)基本服务
Databaseserver(达特备四)集成MySQL数据库
Webserver集成Apacheweb服务
Virtualhost(我的有豪斯特)集成虚拟化主机
Softwaredeveiopmentworkstation集成软件开发环境
centOS的版本分类
aa)Desktop:图形界面
ab)MinimalDesktop:图形界面
ac)Minimal(咪呢NO):最小化安装
ad)Basicserver(A谁库谁我):基本服务
ae)Databaseserver(爹可呗死谁我)数据中心服务,会装Mysql
af)Webserver:里面会装Apache
ag)VirtualHost(我涛好死)涛说本地话:装虚拟机主键
ah)SoftwareDevelopmaentWorkstation:装开发环境
LinuxIP地址配置
一点注意事项
Linux中硬盘和光盘
Linux不靠扩展名区分文件类型
注意:建议要是有以上的文件在,一定要加扩展名,因为Linux系统不止你一个人在维护,这个也会好分类,容易分得清楚
Linux的存储设备挂载
a)Windows下的存储设备全自动分配盘符,但是全都要手动弹出设备(盘符=挂载点)
b)Linux中只有硬盘是自动挂载的,其它的存储设备全需要手动挂载,但是全都要手动弹出设备。
注意:在Linux系统中可以设置自动挂载存储设备,但是一旦设置了自动挂载,要是开机的话,系统没有检测到存储设备,那系统会调动全都的运算能力来分析为什么没有,因而死机
服务器注意事项
*************************************
linux常用命令
Linux文件的命名规则
Linux命令的格式(ls)
a)选项:是用于调整命令的功能的,不加权限只能执行,加了权限就可以执行更复杂的功能
b)参数:是命令的操作对象,省略参数的原因是默认参数
c)当有多个选项时,可以写在一起
d)两个特殊的目录.和..,分别代表当前目录和当前目录的父目录
e)个别命令不遵循此格式
ls(选项)(参数)
默认别名:(ll:显示目录下所有文件的配套信息)
常用:
ls:显示目录文件路径:/bin/ls/权限:所有用户。
ls–a/目录/:显示所有文件
ls–color=nerern/目录/:不显示颜色显示目录下内容
ls–lh:显示文件大小单位
ls–l:显示目录下所有文件的配套信息
可以用(ll命令)作用一样
ls–ld:只显示当前输入的目录信息,不显示该目录下的子目录
ls–i:显示文件的inode号i节点
manls:查看ls下的短选项跟长选项
选项:
-a:显示所有档案及目录(ls内定将档案名或目录名称为“.”的视为影藏,不会列出);
-A:显示除影藏文件“.”和“..”以外的所有文件列表;
-C:多列显示输出结果。这是默认选项;
-l:与“-C”选项功能相反,所有输出信息用单列格式输出,不输出为多列;
-F:在每个输出项后追加文件的类型标识符,具体含义:“*”表示具有可执行权限的普通文件,“/”表示目录,“@”表示符号链接,“|”表示命令管道FIFO,“=”表示sockets套接字。当文件为普通文件时,不输出任何标识符;
-b:将文件中的不可输出的字符以反斜线“”加字符编码的方式输出;
-d:仅显示目录名,而不显示目录下的内容列表。显示符号链接文件本身,而不显示其所指向的目录列表;
-f:此参数的效果和同时指定“aU”参数相同,并关闭“lst”参数的效果;
-i:显示文件索引节点号(inode)。一个索引节点代表一个文件;
--file-type:与“-F”选项的功能相同,但是不显示“*”;
-k:以KB(千字节)为单位显示文件大小;
-m:用“,”号区隔每个文件和目录的名称;
-n:以用户识别码和群组识别码替代其名称;
-r:以文件名反序排列并输出目录内容列表;
-s:显示文件和目录的大小,以区块为单位;
-L:如果遇到性质为符号链接的文件或目录,直接列出该链接所指向的原始文件或目录;
-R:递归处理,将指定目录下的所有文件及子目录一并处理;
--color[=WHEN]:使用不同的颜色高亮显示不同类型的。
参数:
目录:指定要显示列表的目录,也可以是具体的文件。
文件格式的意思
a)引用计数分类
目录操作命令(cd,pwd,mkdin,rmdir,rm,tree)
a)cd:切换目录,路径:shell内置命令,权限:所有用户
b)cd~:进入家目录,或用cd直接进入
c)cd–:进入上次目录
d)cd.:进入当前目录
e)cd..:进入上级目录
a)mkdir:建立目录,路径:/bin/mkdir/,权限:所有用户
b)mkdir–p:递归建立目录,一级过一级的建立
a)rm:删除文件,路径:/bin/rm/,权限:所有用户
b)rm–rf:删除文件跟目录
c)-r:递归,删除目录
d)-f:强制
相对路径跟绝对路径
1.相对路径:参照当前所在的目录,进行查找,一定要确实当前所有的目录,从当前位置开始查找打开。
2.绝对路径:从根目录开始指定,一级一级递归查找。在任何目录下,都能进入指定位置,从根目录开始查找打开。
文件操作命令(touch,rm,cat,more,less,head,tail,echo)
拓展:
echo“hello”>文件名
>会覆盖源文件的内容
>>追加内容到源文件中
touch{5..10}.txt
-n列出行号
cat显示多个文件的内容
cat将多个文件合并(按照文件先后顺序)
操作方式:
空格键向下翻页,b键向上翻页?,q键退出,,Enter键换行
head-n显示文件前n行
tail-n显示文件最后n行
tail-f实时监控文件尾部变化
a)head:默认显示文件头10行。路径:/bin/head/。权限:所有用户,
b)head-n20文件名:显示文件头20行
a)tail:默认显示文件尾10行。路径:/bin/tail/。权限:所有用户,
b)tail-n20文件名:显示文件尾20行
c)tail–f文件名:监听文件尾,不退出,适合监听实时文件
文件和目录都能操作的命令(rm,cp,mv,shell,type,ln)
a)cp源文件目标位置:复制。路径:/bin/cp/。权限:所有用户
b)cp-a源文件目标位置:相当有-r-p-d这三个的功能
c)cp–r源文件目标位置:复制目录
e)cp-d源文件目标位置:若源文件是链接文件则复制链接属性
f)cp源文件/目标目录/:原名复制
g)cp源文件/目标目录/新文件名:改名复制
a)mv文件/目标目录/:剪切
b)mv文件.新文件名:改名,用“.”来代表当前目录
a)内部命令:shell自带的。没有明确的可执行文件
b)外部命令:后期开发。有可执行文件
a)ln源文件目标文件:硬链接
b)ln–s源文件目标文件:软链接,文件名都必须要写绝对路径
软链接跟硬链接的分类
a)类似windows快捷方式
b)软链接拥有自己的I节点和Block块,但是数据块中只保存原文件的文件名和I节点,并没有实际的文件数据
c)软链接的权限为1rwxrwxrwx。为系统中最高权限
d)修改任何一个文件,另一个都改变
e)删除链接文件,源文件不爱影响。删除原文件,软链接无法访问
f)软链接可以连接文件,也可以连接目录,可以跨分区
g)ln源文件目标文件:硬链接
a)拥有相同的I节点和存储Block块,可以看做是同一个文件
b)修改任何一个文件,另一个都改变
c)删除任何一个文件,另一个都能访问
d)硬链接文件和原文件的Inode号一致,只有这个标记代表硬链接,很不容易找到
e)不能链接目录,不能跨分区
f)删除源文件,快捷方式文件还可以访问,这就是跟软链接的区别
g)ln–s源文件目标文件:软链接,文件名都必须要写绝对路径
alias:别名
alias(a里儿死):别名(照顾管理员的使用习惯)
alias:查询系统现有别名
aliasser(别名)=“命令”:给命令起个别名,方便使用
注意事项
命令行临时生效,永久生效需要写入对应的系统文件
别名的优先级高于系统命令,除非必要时不能和命令名重叠
权限位
权限位为10位
a)-:普通文件
b)d:目录文件
c)l:链接文件
d)b:块设备文件
e)c:字符设备文件
f)s:套接字
g)p:管道
注意:常用是前三个文件类型,后四个是特殊文件类型
a)后九位分类
b)三位权限分类
修改权限(chmod)
a)chmod权限文件名:修改权限
b)chmod755abc
c)chmod644abc
chmodu+xaa给aa文件的所有者添加x权限
chmodg+w,o+waa给aa文件的所属组和其他人添加w权限
chmodu=rwxaa给aa文件的所有者赋予rwx权限
chmod644aa修改aa文件的权限为755,对应为rw-r--r--
常见权限
a)文件:执行权限
b)目录:标准权限
权限的意义(读写执行基本权限)
a)r:读取文件内容(cat,more.head,tail)
b)w:编辑,新增,修改文件内容,但是不包含删除文件,要是要删除文件,需要在文件的当前目录中删除文件(vi,echo)
c)x:文件可执行
注意:要想删除文件需要拥有w目录的权限,因为删除文件是在目录中删的
a)r:可以查询目录下文件名
b)w:具有修改目录结构的权限。如新建文件和目录,删除此目录下文件和目录,重命名此目录下文件和目录,剪切(tovch,rm,mv,cp)
c)x:可以进入目录(cd)
对文件有写权限,只代表可以修改这个文件的内容;要想删除文件,需要对文件所在目录有写权限
只要对目录有写权限,目录中的文件,就算是root创建的,普通用户一样能删除
目录一般都同时有r-x权限,如果一个目录只有r却没有x,你能用ls查看,却不能cd进去!(用普通用户测试)
权限命令
a)chown用户名文件名:改变文件属主者/所有者。(例:chownuser1aa)user1必须存在
b)chown:用户名文件名:修改属组者(例:chown:user1aa)
c)chown用户名:用户名文件名:改变属主/所有者同时改变属组,(例:chownuser1:user1aa)
例:
chownuser1aa:将aa文件的所有者修改为user1用户
chownuser1:user1aa:将aa文件的所有者修改为user1用户并且所属组修改为user1组
chown:user1aa:将aa文件的所属组修改为user1组
chgrpadmfile1:改变文件file1的所属组为adm
用户的建立
退出远程管理:logout(落狗儿刺)
权限的注意事项
a)文件最大权限:x权限
b)目录最大权限:w权限
a)0:最小权限
b)5:基本权限,可进入,可查看。
c)7:完整权限
系统文件目录默认权限
a)文件:
b)目录:
总结:Linux的安全机制,不给新建文件x权限。
帮助命令(help,lnfo,man)
a)help内部命令:查看内部命令帮助
b)命令--help:查看命令的常见选项
a)回车:进入子帮助页面(带有*号标记)
b)u:进入上层页面
c)n:进入下一个帮助小节
d)p:进入上一个帮助小节
e)q:退出
a)man命令:查看命令帮助
b)man级别命令:查看命令在级别分类中的命令
c)whatis命令:查看命令拥有那些特别的帮助
查找命令
a)updatedb(O破强):强制更新数据库
b)/var/lib/mlocate:命令所搜索的后台数据库
c)/etc/updated.conf:配置文件,用于定义locate命令
d)PRUNE_BIND_MOUNTS=”yes”:开启搜索限制
e)PRUNEFS=:搜索时,不搜索的文件系统
f)PRUNENAMES=:搜索时,不搜索的文件类型
g)PRUNEPATHS=:搜索时,不搜索的路径
注意:有些系统文件打开后出现的是乱码,这是为了保护系统安全
find搜索命令
a)find(返的)查找位置–name文件名:按照文件名查找(例:find/-nameaabbcc)
注意:-4指的是前三天
+4指的是前五天
d)例:find/-ctime+4
按天:ctimeatimemtime
按分钟:cminaminmmin
cchange#表示属性被修改过:所有者、所属组、权限
aaccess#被访问过(被查看过)
mmodify#表示内容被修改过
find/etc-mmin-120:120分钟内内容被修改过的
find/etc-ctime+7:七天之前属性被修改过的文件
a)–uid数字:按照用户属主ID查找文件
b)–gid数字:按照属组组ID查找文件
c)–user用户名:按照属主用户名查找文件
例
find/home-userlisi
在/home中,查找所有lisi用户的文件
注意,在系统中需要存在此用户,否则报错
d)–group组名:按照属组组名查找文件
e)–nouser:找没有属主的文件(常用)
f)例:find/-nouser
a)–name:按照文件名
b)–size:按照文件大小,不能加小数点,(单位:k(小写),M(大写))(+50k:大于50k。-50k:小于50k。50k:等于50k。)(例:find/-size+50k)
单位是数据块一块是512字节
1M->1024k->2048块(1块是0.5k也就是512字节)
100M->102400k->204800块
find/etc-size-10k查找小于10k的文件
find/etc-size+2M查找大于2M的文件
注意+-号,如果没有,是精确这么大,通常都会带上+或-号,表示一个范围
c)–type类型:按文件类型查找,(f:普通。d:目录。l:链接)
d)–perm755:按照权限查找(例:find.–perm644)(-400:只要比这个权限大,包含在内的就会列出所有来)(+400:只要有一个包含你写的权限就会显现出来)
e)–inum:按照i节点查询(例:find.inum节点数)
f)–iname:按照文件名查找,不区分大小写
通配符跟正则表达式
a)*:用于匹配任意内容
b)?:用于匹配任意一个内容,必须有一个,不然是出不来的
c)[]:用于匹配中括号内任意一个内容:[a-z]任意一个小写字母,[A-Za-z]任意一个字母,[0-9]任意一个数字
a)*:前一个字符重复任意多次
b)?:前一个字符重复1次或0次
c)[]:匹配中括号中任意一个内容:[a-z]任意一个小写字母,[A-Za-z]任意一个字母,[0-9]任意一个数字
Linux没有所有者的正常文件
注意:要是不在这2行内的文件,要很注意。有可能是入侵文件
-exec命令的叠加查询
-exec:find目录–perm(第一种命令)-444-execls(第二种命令)–l{}\;
命令一的执行结果作为命令二的操作对象
例:find.–size+5k-execls-lh{}\;
find...-exec命令{}\;
{}表示find查询的结果集
\是转义符,不使用命令别名,直接使用命令本身
;分号是表示语句的结束
注意:固定格式,只能这样写。注意中间的空格。
逻辑跟运算
find.–typef-a-size+2k注意(-a=AMD)
逻辑与运算,两个条件都成立才成立
find.–typef-o-size+2k注意(-o=OR)
逻辑或运算,两个条件成立一个,就成立
逻辑连接符:
-a(and逻辑与)
-o(or逻辑或)
例:find/etc-size+1k-a-size-10k
在etc目录下查找大于1k并且小于10k的文件
find跟grep的意义
grep
注意事项:
尽量不要在根目录/中查找,查找得慢,会占用太多服务器资源
如果需要在服务器中全盘查找,可以写一条计划任务在凌晨执行(计划任务后面讲)
查找范围越小越好,匹配条件,越精准越好
转义符的作用是什么?
在linux中有一个别名机制,如rm删除文件,执行的却是rm-i(用whichrm可以查看命令别名),使用rm删除文件前会提示,就是因为rm-i这个参数。如果想使用命令原意,可以在加\转义,
如:\rmtest.txt则不会提示,直接删除
管道符
catinstall.log|greplib
在显示文件的结果中,grep搜索含有lib的行
命令1|命令2命令1的结果,作为命令2的操作对象
管道符例子
把第一个命令的结果放在一个临时文件里,第二个命令处理这临时文件,这临时文件本来是不存在的
第二个命令从第一个命令的临时文件中搜索包含“yum”这个的文件名
如何按关键字查询端口
第一命令查询系统网络状态,第二命令用第一命令的查询结果来查询关键字,第三个命令用第二命令的结果来统计数量
判断服务器正在连接的有多少统计
netstat查看系统网络连接状态
a)–t:查看tcp协议端口
b)–u:查看udp
c)–l:监听
d)–n:以ip和端口号显示,而不是主机名和协议名
e)-a显示所有socket,包括正在监听的。
f)-c每隔1秒就重新显示一遍,直到用户中断它。
g)-i显示所有网络接口的信息,格式同“ifconfig-e”。
h)-r显示核心路由表,格式同“route-e”。
i)-v显示正在进行的工作。
psaux:查看进程
a)2021:ftp服务,文件共享
b)22:SSH服务,安全运维网络管理
c)23:telnet服务
d)25:smtp:简单邮件传输协议,发信
e)110:pop3:邮局协议,收信
f)80:www:网页服务
g)3306:Mysql端口
h)3389:windows终端服务
i)53:DNS端口
a)端口数量:
a)ctrl+]------------quit退出方式
a)–ttcp-uudp-l监听-n以IP和端口号显示
压缩和解压缩
“.zip”“.gz”“.bz2”Linux可以识别的压缩格式
常见压缩格式:
.zip.gz.bz2linux可以识别的常见压缩格式
.tar.gz.tar.bz2常见的压缩和打包格式
a)zip:是为了跟windows通用的一种格式,用的不多
b)zip压缩文件名压缩文件:压缩,不删除原文件
c)zip-r压缩目录名压缩目录:压缩目录(例:zip-rtest.zip/test)-r:压缩目录
d)unzip压缩包:解压缩。路径:/usr/bin/unzip
a)“.gz”格式:不会打包,要是强制打包,只会打包目录下的所有文件
b)gzip源文件名:压缩,不会保存源文件。
c)gzip-c源文件名>压缩文件:强制保留源文件。(例:gzip-ccangls>cangls.gz)
d)gzip-r源目录:不能压缩目录,压缩目录下所有内容
e)gzip-d压缩包:解压缩
a)“.bz2”格式:不能压缩目录。
b)bzip2源文件:压缩(例bzip2aa)
c)bzip2-k源文件:压缩之后保留源文件
d)bzip2-d压缩文件:解压,(例:bzip2-daa.bz2)-k保留压缩文件。
a)不压缩,只打包
b)压缩同时打包“tar.gz”/”.gz”格式
c)压缩同时打包“tar.bz2”/”.bz2”格式
d)查看不解包
e)指定解压缩文件位置
注意:按上面例子,压缩包–C之间只能有一个空格,多个空格报错。
常用网络命令
b)按ctrl+d,保存,发送
a)按ctrl+d,保存,发送
a)ping-c次数ip:探测网络通畅
b)ping-s65536ip:指定探测数据包的大小
c)ctrl+c:强制终止
d)虚拟机不同:
a)ifconfigeth0192.168.140.252.netmask255.255.255.0临时生效。eth0,eth0:0第一块网卡和第一模拟网卡
ifconfigeth0192.168.1.1netmask255.255.255.0
ifconfigeth0192.168.1.1/24
ifconfigeth0:0192.168.1.2设置网卡子端口
ifconfig(参数)
del<地址>:删除网络设备IPv6的IP地址;
down:关闭指定的网络设备;
io_addr:设置网络设备的I/O地址;
irq
media<网络媒介类型>:设置网络设备的媒介类型;
mem_start<内存地址>:设置网络设备在主内存所占用的起始地址;
metric<数目>:指定在计算数据包的转送次数时,所要加上的数目;
mtu<字节>:设置网络设备的MTU;
netmask<子网掩码>:设置网络设备的子网掩码;
tunnel<地址>:建立IPv4与IPv6之间的隧道通信地址;
up:启动指定的网络设备;
-broadcast<地址>:将要送往指定地址的数据包当成广播数据包来处理;
-pointopoint<地址>:与指定地址的网络设备建立直接连线,此模式具有保密功能;
-promisc:关闭或启动指定网络设备的promiscuous模式;
IP地址:指定网络设备的IP地址;
网络设备:指定网络设备的名称。
ifconfigeth0up
ifconfigeth0down
ifconfigeth0add33ffe:3240:800:1005::2/64#为网卡eth0配置IPv6地址
ifconfigeth0del33ffe:3240:800:1005::2/64#为网卡eth0删除IPv6地址
ifconfigeth0hwether00:AA:BB:CC:dd:EE
[root@localhost~]#ifconfigeth0192.168.2.10
[root@localhost~]#ifconfigeth0192.168.2.10netmask255.255.255.0
[root@localhost~]#ifconfigeth0192.168.2.10netmask255.255.255.0broadcast192.168.2.255
ifconfigeth0arp#开启网卡eth0的arp协议
ifconfigeth0-arp#关闭网卡eth0的arp协议
ifconfigeth0mtu1500#设置能通过的最大数据包大小为1500bytes
a)mail:收信
b)邮件保存位置:/var/spool/mail/root/
c)mail用户名:发信
shell中的发信
直接调用mail命令发送邮件
发送带附件的邮件,-a参数
模拟网卡
关机-重启命令
a)sync:数据同步,把内存中数据强制保存进硬盘,建议关机前使用
b)shutdown-hnow:关机命令,建议使用。路径:/sbin/shutdown/,权限:root
c)init0:关机
d)halt:关机
e)poweroff:关机
a)shutdown-rnow:重启命令
b)reboot:重启命令,路径/sbin/reboot/,权限:root
c)init6:重启命令
挂载命令
Linux所有存储设备都必须挂载使用,包括硬盘
常见的存储设备:
/dev/sda1第一个scsi硬盘的第一分区
/dev/cdrom光盘
/dev/sr0光盘centos6.x
常用挂载点:
/mnt
/media
/cdrom
挂载格式:
mount[-t文件系统类型][-o特殊选项]设备文件名挂载点
-t:文件系统:加入文件系统类型来指定挂载的类型,可以ext3、ext4、iso9660等文件系统。
-o:特殊选项:可以指定挂载的额外选项,比如读写权限、同步异步等,如果不指定则默认值生效。
-oloop:挂载光盘文件
a)mount-oremount,noexec/boot:重新挂载/boot分区目录,并使用noexec禁止使用执行文件权限
b)mount-oremount,exec/boot:重新挂载/boot分区目录,并使用exec恢复使用执行文件权限
光盘挂载
a)Redhat5.x以前/dev/hdc
b)Redhat6.x以后/dev/sr0
U盘挂载
注意:Linux默认不识别windows的NTFS文件格式,如果要使用必须重新编译内核
卸载:
umount设备名称或者是挂载点
#所有的挂载的设备卸载方式都一样
挂载注意事项
Shell使用小技巧:
a)补齐功能允许用户输入命令名或文件名起始的若干个字母后,按Tab键补齐命令名或文件名。
a)命令历史允许用户浏览先前输入的命令并重新调用它们,用history命令可以显示命令列表,按方向键↑和↓可查找以前执行过的命令。!命令前缀
a)范例:
Linux的驱动
a)安装中文字体和编码
b)终端或传输协议需要支持的‘
配置文件:
a)/etc/fstab:自动挂载配置文件
b)/var/lib/mlocate/mlocate.db
c)/etc/updated.confl
服务器管理规范:
越是安全等级要求高的服务器,越是严格限制用户等级,不能所有人都是root,远程服务器不能关机+重启。
服务器不允许在负载高峰执行高负载命令。例如杀毒、大数据压缩解压缩,复制,全盘搜索
VIM编辑器
Vim编辑器简介
Linux图形化界面下的文本编辑器
gedit、libreoffice、evincePDF阅读器
①gedit是一个GNOME桌面环境下兼容UTF-8的文本编辑器。它使用GTK+编写而成,因此它十分的简单易用,有良好的语法高亮,对中文支持很好,支持包括gb2312、gbk在内的多种字符编码。gedit是一个自由软件。
②LibreOffice是OpenOffice.org办公套件衍生版,同样免费开源,以MozillaPublicLicenseV2.0许可证分发源代码,但相比OpenOffice增加了很多特色功能。LibreOffice拥有强大的数据导入和导出功能,能直接导入PDF文档、微软Works、LotusWord,支持主要的OpenXML格式。软件本身并不局限于Debian和Ubuntu平台,OpenXML格式Windows、Mac、PRMpackageLinux等多个系统平台。
③Evince是一套文件阅读工具,可以用来阅读许多种格式的资料,像是Postscript、PDF或是其他格式的文件
文本编辑器的作用:
创建或者修改文本文件
维护Linux系统中的各种配置文件
常用版本
a)vi:类Unix系统中默认的文本编辑器
b)vim:vi编辑器的增强版本,习惯上也称为vi
c)vim全屏幕纯文本编辑器
d)vim是vi的升级版
vim的使用
命令模式、输入模式、末行模式
三种模式之间的互相切换方式
插入命令
e)a:在光标所有字符后插入,(追加)
f)A:在光标所有行尾插入
g)i:在光标所有字符前插入,(插入)
h)I:在光标所有行行首插入
i)o:在光标下插入新行,打开新行
j)O:在光标上插入新行
命令模式操作
k)移动光标
l)把光标移动到文件头或文件尾
m)把光标移动到行首或行尾
n):n:移动到第几行(例::30:移动到第30行)
p)删除整行,剪切,(删除相当剪切)
q)复制(用p/P粘贴)
r)撤销
s)替换
t)显示行号
u)颜色开头
v)查找,掌握
w)批量替换
注意:g的范围内所有old换为new
x)批量注释
vim使用技巧
y)在vim中导入其他文件内容或命令结果
vim多文件模式
z)vim-o文件1文件2:同时打开二个文件(列表模式)。按ctrl+w+向下键切换
aa)vim-o文件1文件2:同时打开二个文件(对列模式)。按ctrl+w+向右键切换
配置文件
ab)~/.vimrc:vim的配置文件,注意:刚开始的话,些文件是不存在的,是新建立的
ac)~/.bashrc:环境变量配置文件:别名
快捷键
ad):map快捷键快捷键执行的命令:设定快捷键执行的命令
注意:临时生效,要永久生效,需要写入~/.vimrc文件里
例1:
:map^PI#
当输入ctrl+p快捷键时,执行在首行添加#注释
^P不能手动输入,需要执行ctrl+V+P来定义。或者ctrl+V,然后ctrl+P
例2:
:map^B^x
当输入ctrl+B快捷键时,光标会移动到行首,然后删除一个字符
例3:
:abmymailliuchuan@itxdl.cn
注:如果想让这些快捷键永久生效,可以写入vim的配置文件。
替换
ae):ab源字符替换字符:替换,按空格键或回车键替换
af):abmymailshenchao@lampbrother.net
ag)输入mymail时按回车键就会变成shenchao@lampbrother.net
软件安装
软件包分类
软件包类型
a)rpm软件包扩展名为“.rpm”
b)dpkg软件包扩展名为“.deb”
a)一般为“.tar.gz”、“.tar.bz2”等格式的压缩包,包含程序的原始代码
a)在压缩包内提供install.sh、setup等脚本安装程序
b)绿色免安装软件包
c)在压缩包内提供已编译好的执行程序,解压到指定位置即可直接使用
源码包的特点
二进制包的分类
a)DPKG包
DPGK是DebianPackager的简写,Debian提供的一种软件包管理系统,用于安装、卸载、升级等操作,以*.deb作为软件包的后缀名。
b)RPM包
RPM是RedHatPackageManager的缩写,RedHat提供的一种软件包管理系统,用于安装、卸载、升级等操作,以*.rpm作为软件包的后缀名。
RPM优缺点
c)优点
d)缺点
二进制软件包的特点
专门的工具进行安装、卸载、升级和管理软件
安装简洁、速度快
经过封装,无法直接获取源代码
功能选择性差,功能定制不灵活
软件包的选择
Linux软件包的命名
Linux软件包的命名也有一定的规律,一般遵循:名称-版本-修正版-类型
tree-1.2.3-4.x86_64.tar.gz
tree-1.2.3-4.el6.x86.rpm
软件名:tree
版本号:1.2.3
修订次数:4
适用系统:el5el6el7
应用平台:i386i686x86x86_64amd64noarch不区分平台
软件类型:.rpm.deb.tar.gz等
二进制软件包安装位置
/etc/配置文件保存位置
/usr/bin/软件命令保存位置
/usr/lib/函数文件保存位置
/usr/share/doc/使用手册保存位置
/usr/share/man/帮助文档保存位置
RPM包的依赖
a)模块依赖:是安装包安装的时候指定的一个安装包,需要人们去官方网站:www.rpmfing.net中查找
包名和包全名的区别
rpm包的命名含义
rpm包的默认安装位置
rpm包安装命令
a)–i:install安装(install)
b)–v:显示理详细的信息(verbose)
c)-h:打包#显示安装进度(hash)
d)--test:测试安装,只是检测一下依赖性,不会实际安装
e)--force:强制安装。不管是否已经安装,都重新安装。就是--replacefi/es和–replacepkgs的综合,注意:用来要是系统中软件中的一个文件丢失可用--force修复,--force是只替换软件中没有的文件,其它文件的配置等都会保留
以下的可以作为参考,不建议使用
RPM包服务启动
c)网页目录:/var/www/html/.index.html
e)日志文件:/var/log/httgp/
注意:服务的标准启动方式:/目录/启动文件restart
RPM包升级
升级命令:
格式:
rpm–Uvh软件包全名
-U升级安装,若没安装,则直接安装,若安装有旧版本,则升级安装
-F升级安装,若没安装,则不安装,必须有旧版本,才进行升级安装
RPM包的卸载
a)--nodeps:不检查依赖性,不能使用
RPM包的查询
a)rpm-q包名:查询包是否安装(-qquery)
b)rpm-qa包名:列出系统所有以安装包(-aall)
c)rpm-qa|wc-l:查询一共多少包
a)rpm-qi包名:查询以安装包的信息
b)Rpm-qip包全名:查询没有安装包的信息
a)rpm-ql包名:查询以安装包中间件的安装位置(-llist)
b)rpm-qlp包全名:查询未安装包打算安装到那位置的信息
a)rpm-qf系统文件名:查询系统文件属于那个包(-ffile)
a)rpm-qR包名:查询已安装包的依赖包(-R:requires)
b)rpm-qRp包全名:查询未安装包依赖包
RPM的验证
1.rpm-V已安装的包名:检验指定RPM包中的文件(v:verify)
指定软件安装后的完整性,及文件的元数据是否发生变化
2.rpm-Va:检验本机已经安装的所有软件包
3.rpm-Vf系统文件名:检验某个文件是否被修改
校验例证:
打印到屏幕上的信息共分为3部分:
第一部分为验证结果;第二部分为文件类型;第三部分为文件位置。
对称加密跟非对称加密
a)自己把自己的文件加密,别人想要看这个文件,就需要跟所有者就是加密这个文件的人,索取密码
b)相当于跟人共用一个密码,安全级别较低,安全系数在128-512之间
a)A跟B都有自己的公钥和私钥跟密码,公钥代表锁,私钥代表钥匙,密码代表密码锁。
b)A持有B的公钥,A给B发文件时用B的公钥加密,B就可以用自己的私钥和密码打开,因为是用B的公钥加密,所以这个加密文件就只有B才能打开
c)A持有B的公钥,A给B发文件时同时A跟B的公钥加密,这样A跟B都可以单独的打开加密文件。
d)个人拥有密码,不怕外露
e)加密等级较高,安全系数是1024左右
f)验证公钥时需要安装CA数字证书,所有的公钥都是经过CA认证的才能拥有CA数字证书
g)由第三方CA认证来保障公钥的可信度和安全度
数字证书
刚刚的校验方法只能对已经安装的RPM包中的文件进行校验,但如果RPM包本身就被动过手脚,那校验就不能解决问题了,我们就必须使用数字证书验证。
数字证书的使用:
2首先必须找到原厂的公钥文件,然后进行安装
2然后安装RPM包时,会去提取RPM包中的证书信息,然后和本机安装的原厂证书进行验证
2如果验证通过,则允许安装;如果验证不通过,则不允许安装并警告
RPM包中文件的提取
a)rpm2cpio:将rpm包转换为cpio格式的命令
b)cpio:是一个标准工具,它用于创建软件档案文件和从档案文件中提取文件
c)–idv:还原
d).文件绝对路径:一定要有“.”要是没有“.”就会覆盖系统路径,“.”是代表当前目录
注意:要是命令中有2,就代表从2前的格式转换成2后的格式(例:rpm2cpiorpm格式转换cpio格式)
cpio命令主要是用来建立或者还原备份的工具,cpio命令可以复制文件到归档包中(压缩),或者从归档包中导出文件(解压缩)。
cpio的三种模式:
备份
格式:cpio–ovcB>[文件|设备]
-o:进入copy-out模式(压缩)
-v:显示过程
-c:使用portableformat存储方式
-B:设定输入输出块为512bytes
例子:
cpio备份:
find/etc-print|cpio–ocvB>/root/etc.cpio
#利用find找出/etc然后备份到/root下
还原:
格式:cpio–idvcu<[cpio文件]
-i:进入copy-in模式(解压)
-d:恢复到指定位置(视压缩方式恢复)
-u:替换所有文件,无提示
cpio还原
cpio–idvcu
注:由于备份时备份的路径使用的是绝对路径,所有恢复时会按照绝对路径恢复回去,所以不会在/root下生成文件。
例子2:
备份:
cd/etc#切换到/etc下
find.–print|cpio-ocvB>/root/etc.cpio
#以相对路径方式进行备份
恢复:
cd/root#切换到/root
mkdirtest#创建恢复目录
cdtest#进入恢复目录
cpio-idvcu
#恢复以相对路径备份的etc.cpio文件,内容会被恢复到/root/test/目录下。
10)rpm2cpio提取RPM软件包中的文件
格式:rpm2cpio包全名|cpio–idv./命令绝对路径
#./是当前目录+命令的绝对路径是which查询出的绝对路径(必须)
假设不小心把系统下的/bin/ls命令删除了,使用时报错了,需要恢复。
方案:
A、重新安装ls命令,使用--force选项强制执行
B、从相对应的软件包内提取ls命令
步骤:
2先确定ls命令属于哪一个软件包
2先模拟出ls命令被删除的样子
2提取RPM包中的ls命令,并恢复到/bin目录下(站到/目录下进行恢复)
yum常用命令
yum组管理命令
a)yumgrouplist:列出所有可用的软件组列表
a)yumgroupinfo软件组名:列出软件组中包含的软件(例:yumgroupinfo"WebServer":查询软件组"WebServer"中包含的软件)
a)yumgroupinstall软件组名:安装指定软件组(例:yumgroupinstall"WebServer":安装网页服务软件组)
a)yumgroupremove软件组名:卸载指定软件组
yum搭建方式:
2本地光盘源
2局域网yum源
2互联网yum源
搭建光盘yum源
注意:一般需要禁止的系统执行文件,基本都用改名来处理
a)解释下yum源文件
a)baseurl=file:///mnt/cdrom/:将第一行修改为光盘路径,要是有剩行就一一注释
注意:///:前//是代表协议,后/是代表根目录
b)enabled=1:设置yum源文件生效
源码包安装问题
a)答案:可以的,因为安装的路径位置不同
a)答案:不会,因为系统只能启动一个
a)如果服务是给大量客户端访问的,不建议修改端口,如Apache
b)如果服务只是给内部用户访问,建议修改端口,如ssh
a)答案:建议源码包
RPM包跟源码包的配置文件
c)网页:/var/www/html/
e)启动方式:
f)RPM包的伪用户:daemon
b)启动脚本:/usr/local/apache2/bin/apachectl
c)网页:/usr/local/apache2/htdocs/
d)日志:/usr/local/apache2/logs/
f)源码包的伪用户:apache
源代码软件包特点:
最新的软件版本
根据用户需要,灵活定制软件功能
应用场合举例:
安装较新版本的应用程序时
当二进制软件无法满足需要时
编译安装可由用户自行修改、定制功能
需要为应用程序添加新的功能时
make命令是GNU的工程化编译工具,用于编译众多相互关联的源代码问价,以实现工程化的管理,提高开发效率。
注意:使用前要先安装gcc(c语言编译包)
make(选项)(参数)
-f:指定“makefile”文件;
-i:忽略命令执行返回的出错信息;
-s:沉默模式,在执行之前不输出相应的命令行信息;
-r:禁止使用build-in规则;
-n:非执行模式,输出所有执行命令,但并不执行;
-t:更新目标文件;
-q:make操作将根据目标文件是否已经更新返回"0"或非"0"的状态信息;
-p:输出所有宏定义和目标文件描述;
源码包安装
注意:一定要指定安装位置(除非指定安装位置会报错)
安装源码包前必须先安装gcc,gcc是c语言编译器
安装方式:yum-yinstallgcc
a)winscp:绿化版工具,目前主流
b)xshell自带的文件传输工具:
a)解压
b)cd解压目录
c)查看安装文档
a)./configure--prefix=/usr/local/apache2/
b)–prefix:指定安装位置
c)检查系统环境是否符合安装要求
d)自定义功能,最后生成Makefile文件
a)安装必须停止
b)是否出现error,warning,no等关键字
a)如果安装报错,就必须先用makeclean命令,才能重新安装
a)如果安装报错,不止要用makeclean命令,还要删除安装位置注意errorwarning等错误报警
a)如何启动可以在安装文档中查询
b)启动时有报错不用理
源码包安装举例
准备环境:
yum仓库
确认源代码编译环境
需安装支持C/C++程序语言的编译器
gcc-4.1.1-52.el5、gcc-c++-4.1.1-52.el5
make-3.81-1.1.i386……
安装步骤:
补丁
a)diff选项oldnew:比较old和new文件的不同
b)选项:
a)分别创建old和new两个文本文件,有相同的内容,也有不同的内容,形成对比。、
b)#创建两个文件,内容要有差别
c)diff-Naur/test/old.txt/test/new.txt>./txt.patch
d)打开生成的txt.patch,会发现new比old多出来的两行被单独标记出来(用+号)
e)比较下两个文件的不同,并生成补丁文件
a)patch–pn<补丁文件:按照补丁文件进行更新(例:patch-p3 c)–p3:用来删除补丁文件里面的目录,如/tmp/texe,删除:根,tmp,texe,三个目录,所以就是-p3 d)“-pn”不好理解,我们说明下。补丁文件是要打入旧文件的,但是你当前所在的目录和补丁文件中的记录的目录是不一定匹配的,所以就需要“-pn”来同步两个目录。比如我当前是在“/root/test”目录中(我要打补丁的旧文件就在当前目录下),补丁文件中记录的文件目录为“/root/test/old.txt”,这时如果写入“-p1”(在补丁文件目录中取消一级目录)那么补丁文件就会打入“/root/test/root/test/old.txt”文件中,这显然是不对的。那如果写入的是“-p2”(在补丁文件目录中取消二级目录)那么补丁文件打入的就是“/root/test/test/old.txt”,这显然也不对。如果写入的是“-p3”(在补丁文件目录中取消三级目录)那么补丁文件就是打入的“/root/test/old.txt”,我们的old.txt文件就在这个目录下,所以就应该是“-p3” 实验: patch-p2 #按照补丁文件对old.txt进行更新 脚本安装程序 a)webmin:是通过网页来管理Linux系统 b)./setup.sh a)安装位置 b)日志位置 c)Perl安装位置 d)端口 e)管理员名 f)管理员密码 g)是否开启:自动启动 h)ssl:不启动 函数库管理 a)静态函数库 b)动态函数库 a)查询 函数库一般可以直接在网上下载到,那么应该如何安装呢? 一般情况下函数库文件的存放位置是在/usr/lib/或/lib下;然后会在/etc/ld.so.conf配置文件中记录这两个目录或者新增加的目录,这个配置文件中只记录函数库存放目录,不记录实际函数库名称 b)安装 由于/usr/lib/已经被/etc/ld.so.conf配置文件记录所以不需要重写 3.假有新的目录需要改写到/etc/ld.so.conf配置文件中,写完后需要刷新下缓存 ldconfig刷新函数库配置文件缓存 -p列出缓存中识别的所有的函数库 补充 a)du-h目录名:查看目录下文件的大小,并统计目录的大小(统计文件大小,要是和df的结果不一样,建议重启系统) b)du-sh目录名:只查看目录大小(统计文件大小,要是和df的结果不一样,建议重启系统) a)df:统计占用的空间大小,统计剩余空间是准确的 b)du:统计文件大小。统计的文件大小是准确的 用户管理 Linux是基于用户身份对系统的资源进行管理的操作系统 用户和组的类型 用户帐号:UID(UserIdentity,用户标识号) 超级用户UID:0UID:0 系统用户UID:1-499UID:1-999 普通用户UID:500-65535UID:1000-65535 组帐号:GID(GroupIdentify,组标识号) 初始组(私有组) 附加组(公共组) 用户的六个信息文件 用户信息文件:/etc/passwd a)用户ID:0超级用户UID。如果用户UID为0,代表这个账号是管理员账号。那Linux中如何把普通用户升级成为管理员呢?就是把其他用户的UID修改为0就可以了,这点和Windows是不同的。不过不建议建立多个管理员账号。 c)用户ID:500-65535普通用户UID。建立的普通用户UID从500开始,最大到65535。这些用户足够使用了,但是如果不够也不用害怕,2.6.x内核以后的Linux系统用户UID已经可以支持232这么多了。 添加用户时,如果不指定用户的初始组,则会自动创建和用户名相同的组。 如何把普通用户变成超级用户:把用户UID改为0 影子文件:/etc/shadow 组信息文件:/etc/group a)初始组:每个用户初始组只能有一个,初始组只能有一个,一般都是和用户名相同的组作为初始组 b)附加组:每个用户可以属于多个附加组。要把用户加入组,都是加入附加组 组密码文件:/etc/gshadow 用户的家目录 用户模板目录 添加用户:useradd命令 a)选项: 6-d目录手工指定家目录,目录不需要事先建立 useradd默认值文件 /etc/default/useradd a)GROUP=100:这个选项是建立用户的默认组,也就是说添加每个用户时,用户的初始组就是GID为100的这个用户组。目前我们采用的机制私有用户组机制。 b)HOME=/home:这个选项是用户的家目录的默认位置,所以所有的新建用户的家目录默认都在/home/下。 c)INACTIVE=-1: d)EXPIRE=: e)SHELL=/bin/bash: f)SKEL=/etc/skel:这个选项就是定义用户的模板目录的位置,/etc/skel/目录中的文件都会复制到新建用户的家目录当中。 g)CREATE_MAIL_SPOOL=yes: /etc/login.defs h)MAIL_DIR/var/spool/mail: i)PASS_MAX_DAYS99999: j)PASS_MIN_DAYS0: k)PASS_MIN_LEN5: l)PASS_WARN_AGE7: m)UID_MIN500 n)UID_MAX60000 p)GID_MAX60000 q)CREATE_HOMEyes: r)UMASK077: s)USERGROUPS_ENAByes: t)ENCRYPT_METHODSHA512: 设定密码 第一次对用户使用时是为此用户创建密码,第二次使用时是修改密码。 root身份执行passwd 1、可以给任何用户设置或修改密码 2、在进行密码修改时不需要提供原始密码 普通用户执行passwd 1、默认只能给自己修改密码 2、给自己修改密码时需要提供用户的当前密码 非交互式密码设置: echo“123123”|passwd--stdinuser1 用户信息修改 -d目录#结合-m选项直接对源家目录进行改名实现修改家目录 usermod–m–d/home/u4user4(用户user的原家目录是/home/user4) 删除用户 1.userdel-r用户名:删除用户 -r:连带家目录一起删除 添加删除组 把已经存在的用户加入组 a)“-“连带环境变量一起切换 改变有效组的命令 用户权限赋予 补上 1、id用户名 #显示用户的UID、初始组、附加组列表 2、su用户名 #切换用户身份 su-用户名 #连带环境变量一起切换 3、newgrp组名 #修改用户的有效组,切换到普通用户之后,执行命令 有效组定义:用户创建文件或目录时使用哪个组作为文件的所属组,就是有效组。 注: 初始组、附加组:是用户和组之间的关系 有效组:用户和文件之间的关系 权限管理 ACL权限 ACL概述 ACL(AccessControlLists),为单一的用户或者组设置对文件或者目录的独立rwx权限,对于有些特殊需求非常有帮助。 a)dumpe2fs-h分区文件:查询指定分区详细文件系统信息 ACL基本命令 查询 b)getfacl 建立 注意:如果给目录赋予acl权限,两条命令都要输入 -R递归· -mu:用户名:权限:只对已经存在的文件生效 -md:u:用户名:权限:只对未来要新建的文件生效 删除 手工开启ACL权限 a)mount-oremount,acl/:重新挂载根分区,并挂载加入acl权限(临时生效) sudo简介和原则 a)命令越详细,得到的权限就越小 b)命令越粗略,得到的权限就越大 root身份visudo命令 a)rootALL=(ALL)ALL c)%wheelALL=(ALL)ALL 举例 a)visudo:打开配置文件 b)用户名ALL=/sbin/shutdown–rnow b)第一种方法 c)第二种方法 a)visudo b)aaALL=/usr/sbin/useradd:赋予aa添加用户权限.命令必须写入绝对路径 b)aaALL=/usr/bin/passwd:赋予改密码权限 c)aaALL=/usr/bin/passwd[A-Za-z]*,!/usr/bin/passwd"",!/usr/bin/passwdroot:赋予改密码权限并取消对root的密码修改 a)sudo/usr/sbin/useraddee:普通用户使用sudo命令执行超级用户命令 三大文件特殊权限 分类 设定文件特殊权限 a)4:代表SUID b)2:代表SGID c)1:代表SBIT SetUID SetUID是什么,功能 a)只有可以执行的二进制程序才能设定SUID权限 b)命令执行者要对该程序拥有x(执行)权限 c)命令执行者在执行该程序时获得该程序文件属主的身份(在执行程序的过程中灵魂附体为文件的属主) d)SetUID权限只在该程序执行过程中有效,也就是说身份改变只在程序执行过程中有效 SetUID的作用介绍 注意:如果取消SetUID权限,则普通用户就不能修改自己的密码了 SetUID的命令 a)例:chmodu+s/usr/bin/vim SetUID的几点建议 检测SetUID的脚本??? SetGID SetGID的作用 a)SGID的含义如下: b)当普通用户lamp执行locate命令时,会发生如下事情: a)如果SGID针对目录设置,含义如下: b)举例 SetGID命令 文件特殊权限之StickyBIT StickyBIT的作用 a)粘着位目前只对目录有效 b)普通用户对该目录拥有w和x权限,即普通用户可以在此目录拥有写入权限 c)如果没有粘着位,因为普通用户拥有w权限,所以可以删除此目录下所有文件,包括其他用户建立的文件。一但赋予了粘着位,除了root可以删除所有文件,普通用户就算拥有w权限,也只能删除自己建立的文件,但是不能删除其他用户建立的文件 文件系统属性chattr权限 命令格式 a)[+-=] b)[选项] 查看文件系统属性lsattr a)选项 a)给文件赋予i属性 b)#给目录赋予i属性 a)mkdir-p/back/log:建立备份目录 b)chattr+a/back/log/:赋予a属性 c)cp/var/log/messages/back/log/:可以复制文件和新建文件到指定目录 d)rm-rf/back/log/messages:但是不允许删除 文件系统管理 文件系统管理-初级 硬盘结构 a)硬盘的逻辑结构分二种 b)硬盘的大小是使用“磁头数×柱面数×扇区数×每个扇区的大小”这样的公式来计算的。其中磁头数(Heads)表示硬盘总共有几个磁头,也可以理解成为硬盘有几个盘面,然后乘以二;柱面数(Cylinders)表示硬盘每一面盘片有几条磁道;扇区数(Sectors)表示每条磁道上有几个扇区;每个扇区的大小一般是512Byte。 a)机械硬盘 b)固态硬盘 文件系统 a)用来实际保存数据的(柜子的隔断),block的大小(1KB、2KB或4KB)和数量在格式化后就已经决定,不能改变,除非重新格式化(制作柜子的时候,隔断大小就已经决定,不能更改,除非重新制作柜子)。 b)每个blcok只能保存一个文件的数据,要是文件数据小于一个block块,那么这个block的剩余空间不能被其他文件是要;要是文件数据大于一个block块,则占用多个block块。 c)Windows中磁盘碎片整理工具的原理就是把一个文件占用的多个block块尽量整理到一起,这样可以加快读写速度。 常用的硬盘管理命令 df跟du命令和区别 a)df–ahT a)du[选项][目录或文件名] du与df的区别: lsof|grepdeleted:查看被删除的文件,然后一个进程一个进程的手工kill也是可以的 这些文件在必要的情况下,可以谨慎的选择无用文件删除,要是全都的文件被删除,系统就会崩溃、 在非必要情况下重启就可以解决垃圾文件的问题,就没必要去手工删除。手工删除危险性高。 fsck文件系统修复命令 b)fsck–y/dev/sdb1:无需手工启动,这命令系统启动时会自动启动。如果开机启动修复失败了,那手工启动修复也没用 显示磁盘状态dumpe2fs c)dumpe2fs/dev/sda3 判断文件类型 e)file文件名判断文件类型 f)type命令名判断命令类型 fdisk命令手工分区 fdisk磁盘分区模式 安装步骤 a)新建主分区 b)新建扩展分区 c)新建扩展分区 注意:要是出现以上二个图片中的内容 如果新建分区后没有重启系统的情况下在新建分区就会出错,出错信息:有可能是因为系统的分区表正在被占用,需要重启系统后才能生效, partprobe d)强制重读所有分区文件,重新挂载分区文件内所有分区。这不是分区必须命令, e)如果没有提示重启,可以不执行,也可以重启系统(Warning:Unabletoopen/dev/hdcread-write(Read-onlyfilesystem)./dev/hdchasbeenopenedread-only.光盘只读挂载,不是错误,不用紧张) f)如果这个命令不存在请安装parted-2.1-18.el6.i686这个软件包 注意:目前partprobe被淘汰了,6.8以后没有效果 格式化 a)mkfs命令非常简单易用,不过是不能调整分区的默认参数的(比如块大小是4096),这些默认参数除非特殊情况,否则不需要调整,如果想要调整就需要使用mke2fs命令进行重新格式化 建立挂载点 g)mkdir挂载目录:建立挂载目录 挂载 h)mount分区设备文件名挂载目录:挂载目录 i)mount:查询当前系统以挂载的设备 自动挂载 j)修改分区自动挂载文件 k)vi/etc/fstab注意:此文件直接参与系统启动,如果修改错误,系统启动报错 l)第一列:设备文件名 m)第二列:挂载点 n)第三列:文件系统 p)第五列:1是否可以被备份0不备份1每天备份2不定期备份 q)第六列:2是否检测磁盘fsck0不检测1启动时检测2启动后检测 r)dumpe2fs分区设备文件名:可以查看UUID 重启 s)要是全都做好没问题的话 t)重启测试或mount-a重新挂载所有内容,用它进行测试 /etc/fstab/文件修复 a)mount-oremount,rw/:重新挂载,并读写分区 b)修改/etc/fstab文件,把它改回来就可以正常启动了 parted命令分区 分区表 parted交互模式 查看分区 修改成GPT分区表 注意:一定要把/etc/fstab文件中和原有分区的内容删除掉,才能重启动。要不系统启动就一定会报错的 建立分区 建立文件系统 调整分区大小 注意:如果不是ext2模式的不可以调整分区大小 删除分区 注意:还有件事要注意,parted中所有的操作都是立即生效,没有保存生效的概念。这点和fdisk交互命令明显不同,所以所做的所有操作大家要倍加小心 swap分区 分区 a)fdisk/dev/sdb:进行磁盘分区 修改swap分区ID b)t:修改分区ID,在硬盘分区模式中使用 c)只有一个分区,所以不用选择分区了 d)82:改为swap的ID e)mkswap/dev/sdb1:swqp分区专属的格式命令 查看内存信息 f)free:查看内存信息 swap分区挂载 g)swapon分区设备文件名:挂载,swap分区的专用挂载 swap分区自动挂载 h)vi/etc/fstab:配置自动挂载数据 文件系统管理-高级 磁盘配额的概念 由于Linux是一个多用户管理的操作系统,而Linux默认情况下并不限制每个用户使用磁盘空间的大小,假如某个用户疏忽或者恶意占满磁盘空间,将导致系统磁盘无法写入甚至崩溃;为了保证系统磁盘的有足够的剩余空间,我们需要对用户和组进行磁盘空间使用限制。 磁盘配额限制类型: 1.限制用户和组对磁盘空间的使用量 2.限制用户和组在磁盘内创建文件的个数 磁盘配额限制级别: 注:磁盘配额是针对分区进行设置的,无法实现“某用户在系统中共计只能使用50MB磁盘空间”只能设置某用户在/home分区能使用30M这样的限制。切记:磁盘配额是针对分区的! 磁盘配额开启条件 内核是否支持磁盘配额? #grep"CONFIG_QUOTA"/boot/config-2.6.32-431.el6.x86_64 #rpm-qquota 磁盘配额实验规划 ü准备足够大小的分区,要远大于实验的需求空间 ü创建实验用户和组 用户:cj、bd、xz、 组:thot ü磁盘配额规划 thot:硬:500M软:450M文件数不限制 cj:硬:50M软:40M硬:10个软:8个 bd:硬:250M软:200M文件数不限制 xz:硬:250M软:200M文件数不限制 ü宽限天数修改为8天 磁盘配额实验流程 环境准备 操作系统,额外的磁盘,内核是否支持 查看系统是否支持磁盘配额 查看分区的挂载属性是否满足 dumpe2fs–h/dev/sdb1|grep"Defaultmountoptions" 注:无法查看分区是否支持用户和组的磁盘配额,需要使用mount查看 查看结果中是否包含usrquota、grpquota两个挂载属性? 如果没有两个挂载属性,则需要重新挂载并添加两个属性,并写入自动挂载 创建分区、用户、用户组 分区大小要远大于实验要求大小,避免影响实验结果 用户:cj、bd、xz 注:创建用户时,指定thot为初始组 SELinux必须关闭才能进行下面的实验! 保证用户创建的文件能消耗组额度 Useradd–gthotcj quotacheck:生成用户和组的配置文件 quotacheck选项 -a扫描/etc/mtab文件中所有启用磁盘配额功能的分区。如果加入此参数,命令后面就不需要加入分区名了 -u建立用户配额的配置文件,即生成aquota.user -g建立组配额的配置文件,即aquota.group -v显示扫描过程 -c清除原有的配置文件,重新建立新的配置文件 quotacheck-avug 注:若报错没有权限生成文件,则需要关闭SELinux 编辑配置文件、设置指定限制大小 edquota选项用户名或组名 -u用户名 -g组名 -p复制磁盘配额规则,不需要每一个用户或者组都手动设置一遍 #edquota-p模板用户-u目标用户 注:配置文件中所写大小默认单位KB 启动和关闭磁盘配额 启动: quotaon选项 -a根据/etc/mtab文件启动所有分区的磁盘配额(不写分区名) -u启动用户的磁盘配额 -g启动组的磁盘配额 -v显示启动过程信息 quotaon-avug 关闭: quotaoff选项分区名 -a根据/etc/mtab文件关闭所有分区的磁盘配额(不写分区名) -u关闭用户的磁盘配额 -g关闭组的磁盘配额 quotaoff-avug 查看磁盘配额的信息 查询指定用户和组的配额: quota选项用户或组名 -v显示详细信息 -s以常见单位显示大小 quota-uvs用户名 quota-gvs组名 查询指定分区的磁盘配额: repquota选项分区名 -u查询用户配额 -g查询组配额 -v显示详情 -s以常见单位显示 repquota-uvs查询用户配额 repquota-gvs查询组配额 验证磁盘配额是否生效 切换到执行用户,以预设用户身份进行文件创建(su) 测试工具: dd生成指定大小的文件(dd命令详解见下面或附件) ddif=/dev/zeroof=/分区名/testfilebs=1Mcount=60 注意:用户的测试需要切换到指定用户身份,而组磁盘配额的验证需要? 非交互设置磁盘配额 setquota-u用户名软(容)硬(容)软(数)硬(数)分区名 注:同样,这样的非交互式的命令更适合写入脚本,而且,假如有很多用户的磁盘配额配置相同也可以用复制来实现。 磁盘配额关键属性 usrquota grpquota SELinux关闭 在用redhatlinux操作系统下怎样关闭SElinux呢?由于在默认情况下,SElinux是默认开启的,即SElinux的状态为enable。对于实验环境下,有时候SElinux的存在很让人头疼。 1.怎样查看iptables和SElinux状态: #serviceiptablesstatus #getenforce 2、关闭iptables和SElinux: #serviceiptablesstop#临时关闭防火墙 #chkconfigiptablesoff#永久关闭防火墙,开机不自启动,想自启动改成on #setenforce0#临时关闭SElinux,临时打开SElinux状态命令:setenforce1 3、永久关闭SElinux #vim/etc/selinux/config,然后将改成SELINUX=disabled,这样即使重启操作系统SElinux也是关闭状态。 查看SElinux状态: #/usr/sbin/sestatus-v 临时关闭:setenforce0 伪设备文件 /dev/zero:产生无限个0 用来测试 /dev/null:位桶(垃圾桶) 可以让不想显示打印在界面的,可以用>>/dev/null来吞掉 /dev/zero,是一个输入设备,你可你用它来初始化文件。该设备无穷尽地提供0,可以使用任何你需要的数目——设备提供的要多的多。他可以用于向设备或文件写入字符串0。 /dev/null——它是空设备,也称为位桶(bitbucket)。任何写入它的输出都会被抛弃。如果不想让消息以标准输出显示或写入文件,那么可以将消息重定向到位桶。外号叫无底洞,你可以向它输出任何数据,它通吃,并且不会撑着! LVM逻辑卷管理 LVM(LogicalVolumeManager)逻辑卷管理,它是Linux环境下对磁盘分区进行管理的一种机制。 普通的磁盘分区管理方式在分区划分好之后就无法改变其大小,当一个逻辑分区存放不下某个文件时,解决的方法通常是使用符号链接,或者使用调整分区大小的工具,但这只是暂时解决办法,没有从根本上解决问题。 简单来说LVM就是将物理磁盘融合成一个或几个大的虚拟磁盘存储池,按照我们的需求去存储池划分空间来使用,由于是虚拟的存储池,所以划分空间时可以自由的调整大小,如下图: LVM的组成部分 ü物理卷(PV,PhysicalVolume):由磁盘或分区转化而成 ü卷组(VG,VolumeGroup):将多个物理卷组合在一起组成了卷组,组成同一个卷组的可以是同一个硬盘的不同分区,也可以是不同硬盘上的不同分区,我们通常把卷组理解为一块硬盘。 ü逻辑卷(LV,LogicalVolume):把卷组理解为硬盘的话,那么我们的逻辑卷则是硬盘上的分区,逻辑卷可以进行格式化,存储数据。 ü物理扩展(PE,PhysicalExtend):PE卷组的最小存储单元,PE所在的位置是VG卷组,即硬盘上,那么我们可以把PE理解为硬盘上的扇区,默认是4MB,可自由配置。 创建LVM ü将物理磁盘分区,或整块磁盘分成一个区 ü将物理磁盘上的分区建立成物理卷(PV) ü将创建好的物理卷组合成卷组(VG),通过添加或者删除一块物理卷,来实现卷组大小的调整。 ü最后将卷组划分成逻辑卷(LV),逻辑卷也是可以随意调整大小的,逻辑卷相当于真正的分区,那么要使用必须进行格式化和挂载。 物理卷管理 卷组管理 创建卷组vgcreate 格式:vgcreate选项卷组名物理卷名(可以写多个,空格分开) -s大小:指定VG的PE大小 查看卷组 vgscan:查看简单信息 vgdisplay:查看详细信息 增加卷组容量vgextend 格式:vgextend卷组名物理卷名 减小卷组容量--vgreduce 格式:vgreduce卷组名物理卷名 vgreduce–a卷组 #删除指定卷组内所有空的物理卷 删除卷组 vgremove 逻辑卷管理 创建逻辑卷--lvcreate 格式:lvcreate选项-n逻辑卷名卷组名 -L容量:指定创建的逻辑卷大小,单位:MB,GB,TB等 -l(小)个数:按照PE个数来指定逻辑卷大小 -n逻辑卷名:指定逻辑卷叫什么名 注:因为逻辑卷相当于是分区,所以需要进行格式化和挂载才能使用,及自启动 查看逻辑卷 lvscan:查看简单信息 lvdisplay:查看详细信息 增加逻辑卷容量--lvextend 注:修改lv及文件系统的大小,必须先将lv及文件系统卸载(umount) eg. lvextend-L+10G/dev/testvg/testlv#先增加lv的大小 resize2fs-f/dev/testvg/testlv30G#再修改文件系统的大小 减小逻辑卷容量—lvreduce 注:减少lv空间的操作是有风险的,操作之前一定要做好备份,以免数据丢失。 e2fsck-f/dev/vg/lv#检查文件系统 resize2fs/dev/vg/lvnewsize#减少后文件系统大小 lvreduce-Lnewsize/dev/vg/lv#减少后lv大小 RAID磁盘阵列 定义:独立磁盘构成的具有冗余能力的阵列 磁盘阵列分类: 一是外接式磁盘阵列柜、 二是内接式磁盘阵列卡, 三是利用软件来仿真 1.通过把多个磁盘组织在一起作为一个逻辑卷提供磁盘跨越功能 2.通过把数据分成多个数据块(Block)并行写入/读出多个磁盘以提高访问磁盘的速度 3.通过镜像或校验操作提供容错能力 RAID磁盘阵列主要为了保证硬件损坏的情况下业务不会终止,无法防止误操作 硬-软raid 硬raid:独立的管理系统 软raid:借助系统来管理 RAID磁盘阵列简介 RAID0:没有奇偶校验的条带卷 RAID0提高存储性能的原理是把连续的数据分散到多个磁盘上存取,这样,系统有数据请求就可以被多个磁盘并行的执行,每个磁盘执行属于它自己的那部分数据请求 RAID1:独立磁盘冗余阵列(镜像卷) RAID1通过磁盘数据镜像实现数据冗余,在成对的独立磁盘上产生互为备份的数据。当原始数据繁忙时,可直接从镜像拷贝中读取数据,因此RAID1可以提高读取性能。 RAID10:镜象阵列条带 Raid10是一个Raid1与Raid0的组合体,它是利用奇偶校验实现条带集镜像,所以它继承了Raid0的快速和Raid1的安全。 先建raid1在建raid0 损坏一块磁盘时的损坏率:0%(raid01:0%) 损坏二块磁盘时的损坏率:三分之一(raid01:三分之二) 损坏三块磁盘时的损坏率:百分百(raid01:百分百) RAID5:分布式奇偶校验的独立磁盘结构 RAID5是一种存储性能、数据安全和存储成本兼顾的存储解决方案。RAID5可以理解为是RAID0和RAID1的折中方案。 等分成几分之一,用来存储备份。 Raid5阵列搭建流程 准备物理磁盘 创建raid5阵列 mdadm-Cv阵列名称(md*)-l5-n3磁盘-x1磁盘 -C:create -v:显示详细信息 mdadm-Cv/dev/md0-l5-n3/dev/sdb1/dev/sdb2/dev/sdb3-x1/dev/sdb5 记得要格式化并挂载才能使用,还有自动挂载 查看raid5阵列信息 mdadm–D设备名 生成raid5阵列配置文件 模拟raid5阵列磁盘损坏 mdadm/dev/md0–f/dev/sdb3 #标记阵列中某磁盘损坏,并查看磁盘状态 移除故障磁盘,添加新磁盘 mdadm/dev/md0--remove/dev/sdb3 #移除故障磁盘 mdadm/dev/md0--add/dev/sdb6 #添加新的磁盘,恢复正常热备 if=文件名:输入文件名,缺省为标准输入。即指定源文件。 of=文件名:输出文件名,缺省为标准输出。即指定目的文件。 bs=bytes:同时设置读入/输出的块大小为bytes个字节。 count=blocks:仅拷贝blocks个块,块大小等于ibs指定的字节数。 1.将本地的/dev/hdb整盘备份到/dev/hdd ddif=/dev/hdbof=/dev/hdd 2.将/dev/hdb全盘数据备份到指定路径的image文件 ddif=/dev/hdbof=/root/image 3.将备份文件恢复到指定盘 ddif=/root/imageof=/dev/hdb 4.备份/dev/hdb全盘数据,并利用gzip工具进行压缩,保存到指定路径 ddif=/dev/hdb|gzip>/root/image.gz 5.将压缩的备份文件恢复到指定盘 gzip-dc/root/image.gz|ddof=/dev/hdb 6.备份与恢复MBR a.备份磁盘开始的512个字节大小的MBR信息到指定文件: ddif=/dev/hdaof=/root/imagecount=1bs=512 count=1指仅拷贝一个块;bs=512指块大小为512个字节。 b.恢复: ddif=/root/imageof=/dev/had 将备份的MBR信息写到磁盘开始部分 7.拷贝内存内容到硬盘 ddif=/dev/memof=/root/mem.binbs=1024(指定块大小为1k) 8.拷贝光盘内容到指定文件夹,并保存为cd.iso文件 ddif=/dev/cdrom(sr0)of=/root/cd.iso 9.增加swap分区文件大小 第一步:创建一个大小为256M的文件: ddif=/dev/zeroof=/swapfilebs=1024count=262144 第二步:把这个文件变成swap文件: mkswap/swapfile 第三步:启用这个swap文件: swapon/swapfile 第四步:编辑/etc/fstab文件,使在每次开机时自动加载swap文件: /swapfileswapswapdefault00 10.销毁磁盘数据 ddif=/dev/urandomof=/dev/hda1 注意:利用随机的数据填充硬盘,在某些必要的场合可以用来销毁数据。 11.测试硬盘的读写速度 ddif=/dev/zerobs=1024count=1000000of=/root/1Gb.file ddif=/root/1Gb.filebs=64k|ddof=/dev/null 12.确定硬盘的最佳块大小: ddif=/dev/zerobs=2048count=500000of=/root/1Gb.file ddif=/dev/zerobs=4096count=250000of=/root/1Gb.file ddif=/dev/zerobs=8192count=125000of=/root/1Gb.file Shell脚本 shell基础 Shell概念 Shell的分类 查询Linux中支持的shell类型 a)cat/etc/shells:查询Linux中支持的shell类型 Shell的执行方式 解析器解析 相对路径和绝对路径的“执行方式” source shell脚本 a)添加x执行权限(相对或绝对路径执行) b)用bash命令,调用脚本文件 Bash历史命令的基本功能 Bash_history:查看历史命令缓存记录文件 记录用户使用命令的文件,需要用户正常退出的情况下才会记录到文件里面,这文件在家目录下的bash_history 历史命令 历史命令的查看 命令:history[选项] -c清空历史命令 -w把缓存中的历史命令保存到历史命令配置文件 历史命令的调用 调用之前使用过的历史命令有以下几种办法: ü使用上、下光标键调用 ü使用“!n”,重复执行第n条历史命令 ü使用“!!”,重复执行上一条命令 ü使用“!字符”,重复执行最近一条以此字符开头的命令 命令与文件名的补全 Bash放在/bin/bash中,它有许多特色,可以提供如命令补全、命令编辑和命令历史表等功能 命令别名 命令:alias别名=’原命令[选项]’ 两个配置文件: 单个用户:~/.bashrc 所有用户:/etc/bashrc 注:别名命令的优先级更高 注意:配置文件修改后需要重新加载,让新添加的内容立刻生效 source/etc/bashrc source./etc/bashrc(这个点不是当前路径的意思) kernel2.6.32前: aliasgrep='grep--color=auto' 需要人为添加到配置文件 kernel3.10后 配置文件中默认包含 快捷方式的几个方法 因为apachectl在/usr/local/bin/在环境变量目录下,所以可以在执行就可以了 aliassto=’/usr/local/apache2/bin/apachectlstop’ 注意事项:不要使用已经存在的命令,要是别名的做作用跟命令的一样,就可以用命令作为别名的名称,例((aliasgrep='grep--color=auto')) 命令执行的顺序: NO.1用绝对路径或相对的方式执行命令 NO.2别名命令 NO.3bash内置命令 NO.4根据环境变量定义的目录查询找到的命令 Bash常用快捷键 输入输出重定向 bash的标准输入输出 设备 设备文件名 文件描述符 类型 键盘 /dev/stdin 0 标准输入 显示器 /dev/stdout 1 标准正确输出 /dev/stderr 2 标准错误输出 a)标准输出:(/dev/stdout) b)重定向输出 c)输出类型: d)输入 输出重定向 输入重定向 命令:wc[选项][文件名] -c统计字数(字符) -w统计单词数(字符串) -l统计行数 多命令顺序执行 echo命令:用于字符串的输出 用于字符串的输出 1.echo[选项][输出内容] -e支持反斜线控制的字符转换 -n取消输出后行尾的换行符号 echo–e:支持反斜线支持的控制转换 常用控制字符 显示颜色 “\e[1”代表颜色输入开始;“\e[0m”代表颜色输入结束;固定格式! 特殊的控制显示 a)\e[0m关闭所有属性 b)\e[1m设置高亮度 c)\e[4m下划线 d)\e[5m闪烁 e)\e[7m反显 f)\e[8m消隐 grep命令 命令:grep[选项]“关键词”文件名#行提取命令 -A数字:列出符合条件的行,并将连续列出后续n行 -B数字:列出符合条件的行,并将连续列出前面n行 -c:统计包含字符串的行一共几行! -i:忽略大小写 -n:输出行号 -v:反向查找(取反) --color=auto:搜索出的关键词高亮显示 find和grep的区别 find是在系统中查找符合条件的文件名,是完全匹配,如果需要模糊查找使用通配符。 #搜索时,只有完全匹配的才会被查找出来。 grep是在文件中查找符合条件的字符串,是包含匹配,如果需要精确查询,需要使用正则表达式 #查询关键词时,只要包含关键词的行都被显示 格式:命令1|命令2 将命令1的标准输出作为命令2的标准输入 ls–l/etc|more /etc目录下内容较多,长格式显示后一页显示不全,用more分页显示下 Xargs命令 xargs是实现“将标准输出作为命令的参数” eg: echo"--help"|cat echo“--help”|xargscat echo"--help"|xargscat--help:当做了命令的选项 如果在特殊情况下xargs是用命令1的关键字做为命令2的选项 正常情况下,是用于fing命令的 fing:这一类输出结果一条条的命令,不能直接使用“|”管道符进行内容传递,需要使用xargs find./-name"*.sh"-execls-l{}\; find./-name"*.sh"|xargsls–l 以上二条命令输出的结果相同 通配符 ?:匹配一个任意字符,如a?匹配的结果都是以a开头及a后面紧跟一个字符的 *:匹配0个或任意多个任意字符,也就是说可以匹配任何内容, 如a*,匹配的结果是,只要开头是a都匹配 []:匹配括号内的任意一个字符(除了-外,不能使用分割符号) [0-9]:0-9任意一个 [a-z]:小写24个字母任意一个 [A-Z]:大写24个字母任意一个 [a-Z]和[a-zA-Z]:结果相同,大小写24个字母任意一个 若有n在[]中,n会被作为匹配对象 实验 Bash中其他特殊符号 '':所有在单引号中出现的,都以原格式输出,特殊符号没有作用 字符串整体,所有字符串都没有特殊含义,echo‘$PATH’ "":几乎所有的在双引号中出现的,都以原格式输出,除了($\``) 字符串整体,大部分在“”中无特殊含义除了$\``echo“$PARH” ``:写入到反引号中的命令,会被反引号调用出命令的结果 反引号:将命令的结果赋给某变量(a=`date`) $()a=`date`==a=$(date):跟``功能一样 ():在小括号中执行的命令(是在新的子shell中执行的,结果不影响当前shell中的内容) 作用:变量测试+替换 ()中最后一个命令可不用”;”结尾 {}:在大括号中执行的,和不加大括号结果一样,没有区别,只是大括号的使用(特殊)格式:{name=zs;echo$name;} ~/.bash_profile-->~/.bashrc-->/etc/bashrc [-f/etc/bashrc]&&./etc/bashrc] []:用于变量的测试 [==]:判断符号两侧,括号两侧必须有空格["$a"=="$b"] [!=]:注意:><>=<=不能直接套用以上格式。 ["$a"=="$b"]&&echo"yes"||echo"no"] 单引号&双引号: 单引号当中的特殊符号没有特殊含义,双引号里面的特殊符号也没有特殊含义,但是$和`和\是例外! 反引号: 小括号、中括号、大括号 bash是可以手动开启的,每bash一下就是开启一个shell,相应的就会有父shell和子shell bash前 bash后: 注:最明显的感觉就是当你新开启一个shell后,你刚才执行的历史命令调用不出来。 大括号{}和小括号() 区别: 2()执行一串命令时,需要重新开一个子shell进行执行 2{}执行一串命令时,是在当前shell执行 2()和{}都是把一串的命令放在括号里面,并且命令之间用;号隔开 2()最后一个命令可以不用分号 2{}最后一个命令要用分号 2{}的第一个命令和左括号之间必须要有一个空格 2()里的各命令不必和括号有空格 2()中执行命令时,新开启shell进行 2{}执行命令时,就在本shell中进行 注释 脚本注释:#//; 编程器注释:/*$$$*/ Bash的变量和运算符 变量是计算机语言中能储存计算结果或能表示值抽象概念,变量可以通过变量名访问,在指令式语言中,变量通常是可变的. 赋值符号:= 两侧不能有空格 值: 若值当中有空格,则需要将整个值用引号(单、双、反)作为一个整体 a='123' b="echo$x" c=`date` 查看: set所有生效了的变量 定义变量的规范: 2变量名称可以由字母、数字和下划线组成,但是不能以数字开头,变量中间不能有空格。如果变量名是“2name”则是错误的。 2如果当中有空格,则需要将整个值用引号作为一个整体(单,双,反) 2在Bash中,变量的默认类型都是字符串型,如果要进行数值运算,则必修指定变量类型为数值型。 2变量用等号连接值,等号左右两侧不能有空格。 2变量的值如果有空格,需要使用单引号或双引号包括。如:“test="helloworld!"”。其中双引号括起来的内容“$”、“\”和反引号都拥有特殊含义,而单引号括起来的内容都是普通字符。 2双引号“”括起来的$\``都有特殊含: 2单引号括起来的都是普通字符 在变量的值中,可以使用“\”转义符。 2如果需要增加变量的值,那么可以进行变量值的叠加。不过变量需要用双引号包含"$变量名"或用${变量名}包含变量名。 2如果是把命令的结果作为变量值赋予变量,则需要使用反引号或$()包含命令。 2环境变量名建议大写,易于区分 set:查看变量/自定义变量/取消变量: 包含env环境变量 遵循设置规范:变量的设置规范(数字、字母、下划线) set变量:查看变量 set: set-u+u /etc/bashrc /etc/profile set-x+x 在输出命令结果之前,将命令本身输出一次,辅助功能 unset:取消变量,只能取消临时变量 环境变量 2环境变量设置 exportAGE=18 2环境变量查询和删除 env命令:查看环境变量 env命令和set命令的区别是,set命令可以查看所有变量,而env命令只能查看环境变量。 ü系统默认的环境变量 env现实所有环境变量 PATH变量 保存所有存放命令路径的变量,(变量叠加) üPATH变量:系统查找命令的路径 PATH变量的值是用“:”分割的路径,这些路径就是系统查找命令的路径。也就是说当我们输入了一个程序名,如果没有写入路径,系统就会到PATH变量定义的路径中去寻找,是否有可以执行的程序。如果找到则执行,否则会报“命令没有发现”的错误。 我们可以考虑把自己写的脚本放入这些目录,实现直接调用(当命令使用) 或者: 我们修改PATH变量的值,而不是把程序脚本复制到/bin/目录中,以后所有写入这个目录的脚本都可以直接执行。 上边写的这些变量的定义啊,叠加啊,修改啊,什么的都是临时的。 PS1变量(使用单引号) üPS1变量:命令提示符设置 PS1是用来定义命令行的提示符的,可以安装我们自己的需求来定义自己喜欢的提示符。PS1可以支持以下这些选项: u\d:显示日期,格式为“星期月日” u\H:显示完整的主机名。如默认主机名“localhost.localdomain” u\h:显示简写主机名。如默认主机名“localhost” u\u:显示当前用户名 u\v:显示Bash的版本信息 u\w:显示当前所在目录的完整名称 u\W:显示当前所在目录的最后一个目录 u\#:执行的第几个命令 u\$:提示符。如果是root提示符为“#”,如果是普通用户提示符为“$” 想要使用这些必须先知道定义的规范,来看下官方的PS1: 定义ps1的值时需要注意单引号,否则不生效 随便玩,玩坏了记得改回来! LANG语系变量 echoLANG:查看当前系统语系 LANG定义的是Linux的主语系环境变量: 这是因为我们Linux安装时,选择的是中文安装,所以默认的主语系变量是“zh_CN.UTF-8”。那么Linux中到底支持多少语系呢?我们可以使用以下命令查询: 或者用wc–l统计下一共支持多少! 我们当前是什么语系可以用locale直接查询! 配置文件也能查询到我们的默认语系: 这又是当前系统语系,又是默认语系,有没有快晕倒的感觉。解释下吧,我们可以这样理解,默认语系是下次重启之后系统所使用的语系,而当前系统语系是当前系统使用的语系。如果系统重启,会从默认语系配置文件/etc/sysconfig/i18n中读出语系,然后赋予变量LANG让这个语系生效。也就是说,LANG定义的语系只对当前系统生效,要想永久生效就要修改/etc/sysconfig/i18n文件了。 说到这里,我们需要解释下Linux中文支持的问题。是不是我们只要定义了语系为中文语系,如zh_CN.UTF-8就可以正确显示中文了呢?这要分情况,如果我们是在图形界面中,或者是使用远程连接工具(如SecureCRT),只要正确设置了语系,那么是可以正确显示中文的。当然远程连接工具也要配置正确的语系环境,具体配置方式可以参考Linux系统安装章节。 那么如果是纯字符界面(本地终端tty1-tty6)是不能显示中文的,因为Linux的纯字符界面时不能显示中文这么复杂的编码的。如果我们非要在纯字符界面显示中文,那么只能安装中文插件,如zhcon等。 远程连接的显示: 字符终端的显示: 安装有图形界面的Linux,所以,那些乱码就是我的中文目录。 位置参数变量 $@$*都是接收除了命令本身以外的所有参数,接收方式不同: $*:将所有参数当成一个整体(一个值)进行接收 $@:将每一个参数分别接收到自己的变量中 脚本1: · 脚本2: v$*显示所有参数(作为整体接收) v$@显示所有参数(分开接收) v$#显示参数个数 预定义变量 $根据返回值判断上一条命令的执行结果 $$获取当前bash解析器的PID $!获取当前终端最后一条正在后台执行的进行PID号 v$错误数值是非0的,正确的是0 v$$当前进程的PID $!最后一个后台执行的命令的进程 read接收键盘输入 read[选项][变量名] -p“提示信息”:在read等待时输入的信息 -t秒数:read等待的秒数 -n字符数:read最多能接收的字符数(达标即执行) -s:隐藏输入信息 假如因为特殊选项不换行,用echo来实现换行。 变量名定义: ü变量名可以自定义,如果不指定变量名,会把输入保存入默认变量REPLY ü如果只提供了一个变量名,则整个输入行赋予该变量 ü如果提供了一个以上的变量名,则输入行分为若干字,一个接一个地赋予各个变量,而命令行上的最后一个变量取得剩余的所有值 命令:declare[+/-][选项]变量 -:给变量设定类型 +:取消变量的类型 -p:显示指定变量的类型及内容 数组型 数组,其实是多个相同类型的元素组成的集合,用于解决复杂的数据统计和计算,我们在shell中基本不会涉及到太多的算法和计算,所以数组了解下就可以了。数组的名字即变量的名字是同一个变量名,我们在变量名后面加上编号来区分单个变量,数组变量又称下标变量。 注:数组的下标从0开始,调用数组的元素时要使用${数组[下标]}的格式 当我们使用“变量名[下标]”这样的格式定义变量时,自动识别成数组 整数型 shell种如果想进行数值运算,暂时只能先这样了。 declare–x变量名(环境变量的名字尽量大写) 写完后可以使用env命令查看下! 只读变量 只要对变量设置了只读属性,这个变量只能进行调用,不能进行修改和删除,甚至不能进行取消只读选项。坑爹啊。。。 这个流氓,怎么办?。。。 查询变量和取消变量属性 变量属性查询可以使用-p,会列出变量设置时使用的参数;变量属性的取消使用+来实现。 使用expr或let数值运算个工具 expr使用时需要注意的是,在运算符两边要有空格,否则不会正常运算。, let则相对简单易用,原理相同,格式略微变化: let还能进行自增增减,或者指定增加减少多少! 自增&自减 指定增减量 不管是expr还是let都能实现数值运算,看个人使用习惯。 ü使用“$((运算式))”或“$[运算式]”格式进行运算 同样两种格式都能实现数值运算,看个人喜欢,习惯。 以上三种数值运算方式选择哪一种都可以,在脚本中常见的是$((运算式))。 shell常用运算符 运算符的优先级,就是当有多个运算符同时存在时,谁先进行数值计算,但是有时也是有特殊情况的比如: 加减乘除 、 按照表格的优先级是乘除优先于加减,但是由于加减被()调用,所以,括号的优先级高于乘除。 取模运算 取模运算和取余运算绝大部分是重叠的,但是一个是计算机术语,一个是数学概念,区别在于取模运算对负数处理不太一样。 逻辑与 变量的测试与内容置换(作为了解即可) 例1:x=${y-新值} 当没有:时,y不存在时x=新值,y为空时x=空,y有值时x=$y 当有:时,y不存在时x=新值,y为空时x=新值,y有值时x=$y 注:x=${y+新值}与x=${y-新值}相反! 环境变量的配置 source命令 刷新修改过的配置文件使其生效 环境变量配置文件 2/etc/profile 2/etc/profile.d/*.sh 2~/.bash_profile 2~/.bashrc 2/etc/bashrc 文件的调用顺序是: 2LOGNAME变量:根据USER变量的值,给这个变量赋值。 2HOSTNAME变量:更改主机名,给这个变量赋值。 2HISTSIZE变量:定义历史命令的保存条数。 2调用/etc/profile.d/*.sh文件,也就是调用/etc/profile.d/目录下所有以.sh结尾的文件。 由/etc/profile文件调用/etc/profile.d/*.sh文件 2这个目录中所有以.sh结尾的文件都会被/etc/profile文件调用,这里最常用的就是lang.sh文件,而这个文件又会调用/etc/sysconfig/i18n文件。/etc/sysconfig/i18n这个文件眼熟吗?就是我们前面讲过的默认语系配置文件。 由/etc/profile文件调用~/.bash_profile文件。~/.bash_profile文件就没有那么复杂了,这个文件主要实现了两个功能: 2调用了~/.bashrc文件。 2在PATH变量后面加入了“:$HOME/bin”这个目录。那也就是说,如果我们在自己的家目录中建立bin目录,然后把自己的脚本放入“~/bin”目录,就可以直接执行脚本,而不用通过目录执行了。 由~/.bash_profile文件调用~/.bashrc文件 在~/.bashrc文件中主要实现了: 2定义默认别名,所以我们把自己定义的别名也放入了这个文件。 2调用/etc/bashrc 由~/.bashrc调用了/etc/bashrc文件在/etc/bashrc文件中主要定义了这些内容: 2PS1变量:也就是用户的提示符,如果我们想要永久修改提示符,就要在这个文件中修改 这样这五个环境变量配置文件会被依次调用,那么如果是我们自己定义的环境变量应该放入哪个文件呢?如果你的修改是打算对所有用户生效的,那么可以放入/etc/profile环境变量配置文件;如果你的修改只是给自己使用的,那么可以放入~/.bash_profile或~/.bashrc这两个配置文件中的任一个。 可是如果我们误删除了这些环境变量,比如删除了/etc/bashrc文件,或删除了~/.bashrc文件,那么这些文件中配置就会失效(~/.bashrc文件会调用/etc/bashrc文件)。那么我们的提示符就会变成: 注销时生效的环境变量配置文件 其他配置文件 还有一些环节变量配置文件,最常见的就是~/.bash_history文件,也就是历史命令保存文件。这个文件已经讲过了,这里我们只是把它归入环境变量配置文件小节而已。 /etc/issue \r\m等是支持的转义符,查询可用managetty \s:显示操作系统名称 \m:显示硬件体系结构,如i386、i686等 \n:显示主机名 \o:显示域名 \r:显示内核版本 /etc/issue.net 然后定义/etc/issue.net后就能显示欢迎信息了。 /etc/motd 定义bash快捷键 查看所有已存在的快捷键 修改快捷键 stty关键词快捷键 shell高级 正则表达式 概述 在上一章说过正则表达式和通配符的区别(正则表达式用来在文件中匹配符合条件的字符串,通配符用来匹配符合条件的文件名)吗?其实这种区别只在Shell当中适用,因为用来在文件当中搜索字符串的命令,如grep、awk、sed等命令可以支持正则表达式,而在系统当中搜索文件的命令,如ls、find、cp这些命令不支持正则表达式,所以只能使用shell自己的通配符来进行匹配了。 基础正则表达式(grep命令) v匹配练习 *:前一个字符匹配0次或任意多次(连续) 如果正则表达式写成“aa*”代表匹配至少包含有一个a的行 .:匹配换行符以外的任意一个字符 正则表达式“.”只能匹配一个字符,可以是任意字符 ^:匹配行首, $:匹配行尾 用“^$”匹配空白行 []:会匹配中括号中指定任意一个字符,注意只能匹配一个字符。比如[ao]要不匹配一个a字符,要不匹配一个o字符 [0-9][a-z][A-Z]类似这样的都可以,指定匹配的范围 [^0-9]匹配除了数字以外的任意一个字符 ^[^a-zA-Z]这个代表啥呢?? \:转义符 将特殊符号转义成普通符号,比如我们的. \{n\}表示前面的字符恰好出现n次 \{n,\}表示其前面的字符出现不小于n次 \{n,m\}匹配其前面的字符出现不小于n次,最多出现m次 扩展正则表达式(egrep命令或grep-E) 熟悉正则表达式的童鞋应该很疑惑,在正则表达式中应该还可以支持一些元字符,比如“+”“?”“|”“()”。其实Linux是支持这些元字符的,只是grep命令默认不支持而已。如果要想支持这些元字符,必须使命令或grep-E选项,所以我们又把这些元字符称作扩展元字符。 如果查询grep的帮助,对egrep的说明就是和grep-E选项一样的命令,所以我们可以把两个命令当做别名来对待。通过下面表格来看看Shell中支持的扩展元字符: 使用egrep或grep–E时,不需要转义符 cut列提取命令 cut[选项]文件名 -f列号:提取第几列 -d分隔符:按照指定的分割符进行分割 -c字符范围:不依赖分割符来分割,而是通过字符范围进行字段提取(“-m”表示从第一个字符提取到第m个,“n-m”表示从第n提取到第m个字符,“n-”表示从第n个字符开始提取到结尾。) 注意:空格被默认为字符,所有不支持,只能使用(Tab键) 手动创建文本,添加内容列之间用制表符分割 #假如用空格隔开,那么可能会别认定为是同一列。 我们可以使用-d指定分割符号,比如/etc/passwd cut可以按照字符数进行截取,按照我们上面的格式写就OK了 now,我们来截取下df–h命令的结果! cut命令默认的分割符是制表符,即tab键,对于空格的支持比较差 printf格式化输出 print和printf的主要区别在有printf是标准的格式化输出,必须手动指定换行和tab。 输出格式类型: printf和print的区别 #查看df的真实分区的使用情况,不看光盘和虚拟磁盘 使用printf输出下我们的表格文件 printf输出下 printf‘%s’$(catbg.sh) printf命令,如果不指定输出格式,则会把所有输出内容连在一起输出。其实文本的输出本身就是这样的,cat等文本输出命令之所以可以按照格式漂亮的输出,那是因为cat命令已经设定了输出格式。那么为了用printf输出合理的格式,应该这样做: printf‘%s\t%s\t%s\t%s\t\n‘$(catbg.sh) 我们要按照整数型和浮点型输出,则需要修改为: printf‘%i\t%s\t%8.2f\t%s\t\n‘$(catbg.sh|grep–vID) awk命令 awk是一种编程语言,用于在linux/unix下对文本和数据进行处理。数据可以来自标准输入(stdin)、一个或多个文件,或其它命令的输出。 awk基本使用 awk‘条件1{动作1}条件2{动作2}……’文件名 条件:一般使用关系表达式作为条件 x>10判断x变量是否大于10 x==y判断变量x是否等于变量y A~B判断字符串A中是否包含能匹配B表达式的字符串 A!~B判断字符串A中是否不包含能匹配B表达式的字符串 动作:格式化输出 显示bg.sh中的第二和第三列信息 还记的cut来截取df–h的结果吗?用我们的awk试试吧! awk的条件 BEGIN:处理文件之前执行 BEGIN是awk的保留字,是一种特殊的条件类型。BEGIN的执行时机是“在awk程序一开始时,尚未读取任何数据之前执行”。一旦BEGIN后的动作执行一次,当awk开始从文件中读入数据,BEGIN的条件就不再成立,所以BEGIN定义的动作只能被执行一次。例如: 整个动作定义了两个动作,先打印“thisisatranscript”,然后输出过滤后的2和4列 END:处理文件之后执行 END也是awk保留字,不过刚好和BEGIN相反。END是在awk程序处理完所有数据,即将结束时执行。END后的动作只在程序结束时执行一次。例如 其实就是和BEGIN正好相反! 关系运算符 设定条件,符合条件的才会进行相应动作,不满足不运行 设定条件为>=30岁的列出。 uawk是列提取命令,第一步的动作却是先读入第一行,整个执行步骤: 如果有BEGIN条件,则先执行BEGIN定义动作 如果没有BEGIN条件,则先读入第一行,把第一行的数据依次赋成$0$1$2$3…等变量,$0代表整行数据,$1则为第一个字段,依次类推。 读入下一行,重复赋值变量 正则表达式、刚才看到了,我们识别字符串用的是//这是awk的正则 awk内置变量 注意: #BEGIN的作用,不写的时候直接输出$0即第一行。 #将上述命令中的grep“/bin/bash”去掉,sshd是伪用户。 awk流程控制 先准备好操作文档,如下 在awk中定义和调用变量 在awk编程中,因为命令语句非常长,输入格式时需要注意以下内容: 2多个条件{动作}可以用空格分割,也可以用回车分割。 2在一个动作中,如果需要执行多个命令,需要用“;”分割,或用回车分割。 2在awk中,变量的赋值与调用都不需要加入“$”符。 2条件中判断两个值是否相同,请使用“==”,以便和变量赋值进行区分。 假如年龄小于25岁,则输出$2isyoungman 按照成绩来过滤,并显示相应信息。 awk函数 awk在编程时允许使用函数,函数定义方法: function函数名(参数列表){ 函数体 } 通过定义的函数格式,去匹配并传递参数。 awk中调用脚本 对于小的单行程序来说,将脚本作为命令行自变量传递给awk是非常简单的,而对于多行程序就比较难处理。当程序是多行的时候,使用外部脚本是很适合的。首先在外部文件中写好脚本,然后可以使用awk的-f选项,使其读入脚本并且执 awk–fpass.awk/etc/passwd 有BEGIN,先指定BEGIN对应的动作,再读取指定文本进行处 当读取要处理的数据时,按照一行一行的方式进行顺序读取,根据默认的或指定的分割符进行分割赋值 根据条件进行判断,将符合条件的对象按照指定格式输出(printf) 所有数据都处理完成后,最终执行END对用的动作,结束 第一个sort的目的是重新排序,为uniq-c做准备,sort-rn的目的是按访问量从大到小进行排序 sed命令 sed主要是来进行数据选取,替换,删除,新增的命令 非交互式文本处理器 Sed会把所有输出默认定向到屏幕 用-i才能保存文件 u-n:一般sed命令会把所有数据都输出到屏幕,如果加入此选择,则只会把经过sed命令处理的行输出到屏幕。 u-e:允许对输入数据应用多条sed命令编辑。 u-f脚本文件名:从sed脚本中读入sed操作。和awk命令的-f非常类似。 u-r:在sed中支持扩展正则表达式。 一般使用在进行匹配是要求使用正则表达式时加入 基础正则表达式可以直接使用,不加-r u-i:用sed的修改结果直接修改读取数据的文件,而不是由屏幕输出 动作: up:打印,输出指定的行。 ua\:追加,在当前行后添加一行或多行。添加多行时,除最后一行外,每行末尾需要用“\”代表数据未完结。 ui\:插入,在当期行前插入一行或多行。插入多行时,除最后一行外,每行末尾需要用“\”代表数据未完结。 uc\:整行替换,用c后面的字符串替换原数据行,替换多行时,除最后一行外,每行末尾需用“\”代表数据未完结。 ud:删除,删除指定的行。 us:字串替换,用一个字符串替换另外一个字符串。格式为“行范围s/旧字串/新字串/g”(和vim中的替换格式类似) 对sed命令我们要知道的是,它所有的修改都不会直接修改文件的内容,而是在内存中进行处理然后打印到屏幕上,使用-i选项才会保存到文本中。 实例: 行数据操作 显示某行的信息 sed‘2p’文件 -n显示时只显示指定的行进行显示 删除数据 sed‘2,4d’文件 用sed删除掉的文件内容并没有真的修改文件 追加、插入数据 sed‘2[a|i]’文件名 a在指定行后面追加,i在指定行前面插入 假如要追加多行,则需要用\作为一行的结束,最后一行不需要。 -n的作用是只显示追加部分! 整行替换数据 sed‘2cNosuchperson’ 上面我们做了很多操作,但是所有的操作都没有保存到源文件中,假如你确定你就是要修改此文档,请在sed后面跟上-i选项,但请一定要小心,(最好是先不带i预先设置看下结果,然后再加上i选项) 字符串替换 c进行整行替换,假如想进行关键词替换(一行中的一部分),我们需要用s来进行替换,格式: sed‘ns/old/new/g’文件名#n代表第几行 顺便把sc的成绩注销掉,让他补考去吧! 将指定内容替换成空 sed要进行多行操作时,只能通过-e写多条操作语句,用;或回车分隔。 sort字符处理命令 sort排序命令 sort选项文件名 -f忽略大小写 -b忽略每行前的空白部分 -n以数值型进行排序,默认使用字符串类型排序 -r反向排序 按照关键词前的统计结果进行排序(-n用数值型排序) -u删除重复行(=下面的uniq) -t指定分隔符,默认分割符是制表符 -kn[,m]按照指定字段范围排序,从n字段开始到m字段结束。 sort将每一行当做一个整体,多行之间进行对比,对比方式:逐个字符比较,按照ASCII编码升序进行排列 若要按照标准的英语ASCII编码进行排序,需要取消掉当前的语系类型(unsetLANG;sort-f/test/b>>a.txt) sortb.txt|uniq-c|sort-rn sort为了将重复行排列到一起 uniq-c统计重复行出现的次数 sort命令默认使用每行开头第一个字符进行排序 假如要进行反向排序则需要加-r选项 按照指定的排序字段进行排序,使用-t指定分割符,并且使用-k指定段号 #有问题!排序并不是0123。。。 oh,好了,看来之前的排序方式是字符排序,而加上-n之后成为了数值排序。 指定范围时我们可以写–k3,5也可以写3,3== uniq取消重复行 必先sort在uniq,因重复行不连续时uniq不处理!!! uniq用来取消重复行,与sort–u是一样的,格式: uniq选项文件名 -i忽略大小写 -c显示输出中,在每行行首加上本行在文件中出现的次数。它可取代-u和-d选项。 统计连续的重复行出现次数(将统计结果标记在关键词前) -d只显示重复行。 -u只显示文件中不重复的各行。 -n前n个字段与每个字段前的空白一起被忽略。一个字段是一个非空格、非制表符的字符串,彼此由制表符和空格隔开(字段从0开始编号)。 +n前n个字符被忽略,之前的字符被跳过(字符从0开始编号)。 -fn与-n相同,这里n是字段数。 -sn与+n相同,这里n是字符数。 需要注意的是,当重复行不连续时,uniq是不生效的,需要先排序,再执行 统计命令WC wc[选项]文件 c统计字节数。 -l统计行数。 -m统计字符数。这个标志不能与-c标志一起使用。 -w统计字数。一个字被定义为由空白、跳格或换行字符分隔的字符串。 -L打印最长行的长度。 -help显示帮助信息 --version显示版本信息 统计指定文件中的字节数、字数、行数,并将统计结果显示输出。该命令统计指定文件中的字节数、字数、行数。如果没有给出文件名,则从标准输入读取。wc同时也给出所指定文件的总统计数 sleep1:睡眠1秒 sleep1s:睡眠1秒 sleep1m:睡眠1分 sleep1h:睡眠1小时 #!/bin/bash b='' for((i=0;$i<=100;i++)) do printf"Progress:[%-100s]%d%%\r"$b$i sleep0.1s b=#$b done 按照文件类型进行判断 使用[]括号来进行判断,利用$来检测判断结果 #注意[]中内容和括号之间有空格 #我们可以结合之前所学的&&和||实现 按照文件权限进行判断 测试: 两个文件之间进行比较 判断下我们的硬链接 两个整数之间进行比较 测试 字符串的判断 上面是判断字符串,若是要判断变量,就要加双引号 判断变量是否为空要用双引号“”, #字符为空和没有赋值都为空 多重条件判断 测试:逻辑与 逻辑非 -n变量不为空,则为真 !加入后,判断取反,所以变量为空才是真 if条件判断 单分支if条件语句 单分支条件语句比较简单,只需要一个判断条件,符合则执行,不符合则直接退出。 if[条件判断式];then 程序 fi if[条件判断式] then 统计根分区使用率? 双分支if条件语句 条件成立,执行的程序 else 条件不成立,执行的程序 多分支if分支语句 if[条件判断式1] 条件判断式1成立,执行程序1 elif[条件判断式2] 条件判断式2成立,执行程序2 更多……… 都不成立,则执行此程序 练习:判断文件是什么类型的文件的脚本! case分支语句 case语句和if...elif...else语句一样都是多分支条件语句,不过和if多分支条件语句不同的是,case语句只能判断一种条件关系,而if语句可以判断多种条件关系。 case语句语法如下: case$变量名in “值1”) 变量的值等于值1,则执行程序1 ;; “值2”) 变量的值等于2,则执行程序2 省略多个分支………… *) 变量的值都不匹配上面的值,则执行此程序 esac 练习:写一个源码apache的启动管理脚本 for循环 for循环是固定循环,循环次数是有限的次数,也叫计数循环。 语法一: for变量in值1值2值3…… 注:这种语法中for循环的次数,取决于in后面值的个数(空格分隔),有几个值就循环几次,并且每次循环都把值赋予变量。也就是说,假设in后面有三个值,for会循环三次,第一次循环会把值1赋予变量,第二次循环会把值2赋予变量,依次类推。 练习:计算1+2+3+..+10的结果? 语法二: for((初始值;循环控制条件;变量变化)) 练习:计算1+2+3+..+100的值? while循环 只要条件判断式成立,循环就会一直继续,直到条件判断式不成立,循环才会停止。 语法: while[条件判断式] 练习:还是1+2+3+..+100=? until循环 until循环和while循环相反,只要条件判断式不成立,则一直循环,什么时候成立,什么时候结束循环 until[条件判断式] 函数 function函数名(){ 练习:将1+2+3+..+n写成函数! 注意:function在shell中可以不用输 特殊流程控制语句 exit退出脚本 exit[值] exit退出时如果定义好了返回值,那么我们可以通过“$”来查看 break退出循环 当程序执行到break语句时,会结束当前的循环,直接退出。 continue跳出循环 continue只会结束当前的单次循环,将本次跳出继续下次循环。 true跟false true:什么都不做,只设置退出码为0 false:什么都不做,只设置退出码为1 在Linux底下,每个程序执行完毕都会返回一个退出码给调用者,一般情况下0表示成功,其他值表明有问题 引导装载程序设备 a)虽然系统安装到了硬盘,但引导文件还在u盘上,拔走u盘后开机还会显示无法加载,需引导 head–3/etc/passwd|awk-F":"'{printf$(NF=5)"\n"}' head–n3/etc/passwd|awk-F":"'{printf$(NF=5)"\n"}' 或 head–3/etc/passwd|awk-F":"'{printf$(NF-2)"\n"}' head–n3/etc/passwd|awk-F":"'{printf$(NF-2)"\n"}' awk–F:‘{printf$wf-2“\n”}’/etc/passwd echo`seq110` 取1-10范围内的整数(可直接应用于for的循环结构中) echo‘seq110’ 可把1-10输出至一行 seq10-0.5-5 也可以实现 seq-f“3g”110 3g:指定数字的位数为3 seq-f“03g”110 03g:指定数字位数为3,不足用0补 seq-w510 指定输出宽度一致,与最大数位数保持一致,不足用0补 不能与-f同时用 seq-f“s*r9003g”510 90前制定字符串,输出: s*005 s*006---s*010 seq-s“”510 指定分隔符与空格默认为换行 echo可以把\n设为空格,需要外加\t c=$(echo"5.01-4*2.0"|bc) echo$c -2.99 c=$(awk'BEGIN{print7.01*5-4.01}') 31.04 BEGIN必须要用,不然会等待输入文件名 declare-aabc:可有可无 abc[0]=1,abc[1]=2 unsetabc:删除整个数组所有信息 unsetabc[1]:只删除单个数据,其它数据下标不变 a、abc=(123)47 b、a="123" abc=($a) echo${abc[*]} echo${abc[@]} 相等 $(#abc{@})等同于${#abc[*]} echo${abc[1]}|wc-L echo-n${abc[1]}|wc-L #去掉换行符再统计 abc=(123) a=0 foriin${abc[@]} echo"第$a个元素的值为:$(i)" leta++ abc[3]=10 bcd=(${abc}[*]4) echo$(bcd[*]) abc=(1234567) ${abc[@]}等于${abc[*]} ${abc[@]:1} #从下标为1的位置开启取值,直到结尾 并且哪怕开了“set-u”,使用下标超界也不会报错 关键没有任何提示!!!危险 ${abc[@]::3} #从下标为0的位置连续取3个值 ${abc[@]:2:3} #从下标为2的位置连续取3个值 ${abc[@]:(-2):2} #从倒数第二个下标位连续取2个值 只显示2个值,因第3值不存在,但无任何报错!!! bcd=(${abc[@]:(-2):2}) #将之前的处理结果赋值给新的数组变量 切片后赋值新数组 abc=(zhangsanlisilaowanglaosong) ${abc[0]} ##取第一个元素的所有字符 ${abc[0]:1} #从第一个元素的下标为1位置开始,取剩余所有字符 ${abc[0]::3} #从第一个元素的下标为0位置开始,连续取三个字符串 ${abc[0]:2:3} #从第一个元素的下标为2位置开始,连续取三个字符串 abc=(onetwothreefour) ${abc[@]/e/E} #每个被匹配元素只替换一次 每个元素中只替换匹配到的第一个字符“e”换为“E” ${abc[@]//e/E} #每个被匹配元素替换多次 每个元素中替换所有匹配到的“e”换为“E” ${abc[@]/e/} #每个被匹配元素只删除一个字符 每个元素中删除第一个匹配到的字符“e” #每个被匹配元素删除多个字符 每个元素中删除所有匹配到的字符“e” ${abc[0]/#z/Z} #将数组内第一个元素的首字符z替换成Z ${abc[0]/%n/N} #将数组内第一个元素的尾字符n替换成N #若想实现每一个都智能替换,要使用很复杂的循环,暂不建议现在编写 a=`echo2018-04-28_12:15:30_ABC.log|awk-F"."'{printf$1}'|sed-r's/[-_:]//g'|tr-d"[a-zA-Z]"` abc=(${a}) echo$i echo2018-04-28_12:15:30_ABC.log|sed-r's/[-_:]//g'|grep-v“[a-Z]” echo2018-04-28_12:15:30_ABC.log|sed“[a-Z]//g”|sed-r's/[-_:]//g' a=(34783956259100) max=${a[0]} len=${#a[@]} for((i=1;i<$len;i++)) if[[${a[i]}-gt${max}]] max=${a[i]} echo"数组中最大值为:$max" 1.单中括号的test(?)命令才会对变量进行单词分离 a=”ab”[$a=“ab”]&&echoyes(需用”$a”) 2.双中括号的test(?)命令不会对变量进行单词分离 a=”ab”[[$a=“ab”]]&&echoyes shell注意事项 Linux启动管理 启动流程自解 如果电脑不支持虚拟器,重启本机电脑,打开BIOS,把物理CPU是否支持虚拟化的开头(打开) 加电自检 引导程序加载(bootloader) 加载内核(kernel) 所有硬件设备的驱动 系统所需的功能模块(*.ko) 确认系统启动的默认级别(/etc/inittab) 守护进程(内核启动只会加载守护进程) 系统的守护进程(init) 内核启动只加载守护进程 内核3.*前:init 大多自动启动受init管理 内核3.*和3.*以后:systemd 几乎所有的手动或自动启动都受到systemd管理 加载需要开机自启的服务 依靠系统的守护进程init启动各类服务进程 根据系统启动级别确认哪些软件开机自启(/etc/rc.d/rcN.d)(k开头不自启;s开头开机自启) 启动流程详细 按下电源键 插电后第一个设备通电的就是主板BIOS BIOS自检 BIOS程序加载(从内存里加载) 第一阶段:POST(Power-on-selftest),主要检测主机硬件设备如:CPU、内存、硬盘、显卡等是否正常; 在第一阶段完成后会按BIOS中设置的系统启动顺序来搜索可启动的磁盘设备。如:光盘、硬盘、U盘等;搜到第一个可启动的设备后就读取该设备的第一个扇区的内容并执行。到此为止BIOS的任务就完成了。 检查所有硬件是否正常工作 通过BIOS程序可以调整硬件的工作模式 如果主板有二个频率不一致的CPU,默认是按低频率的CPU 系统引导 MBR(MasterBootRecord):硬盘的0柱面、0磁头、1扇区称为主引导扇区。它由三个部分组成,主引导程序(Bootloader)、硬盘分区表DPT(DiskPartitiontable)和硬盘有效标志(55AA) 加载引导菜单,提供选择操作的系统的选项 选择进入操作系统时,进入模式(7种)也是启动级别 Linux内核启动。 Bootloader为引导加载程序,它的主要功能为: 1、提供菜单,允许用户选择要启动的系统或不同的内核版本; 2、加载选定的内核到内存中,解压、展开,而后把系统的控制权交给内核;目前Linux中最常用的Bootloader为GRUB; GRUB引导 主要有三个阶段: stage1:作用很简单就是把第一个扇区读取到内存中,但注意stage1是没有识别文件系统的能力的。 stage1.5:作为stage1和stage2的中间桥梁,stage1.5是有识别文件系统的能力的,此后grub才能去访问/boot/grub目录下的stage2文件,并将stage2载入内存中执行。 初始化系统 内核被加载到内存中并且取得了系统的控制权,在取得控制权后内核会立即初始化系统中的设备,包括CPU、I/O、存储等; 守护进程 关于Linux的设备驱动程序的加载,可能会需要initrd(ramdisk)。因为有一部分驱动程序会被直接编译进内核文件中,另一部分会被以模块的形式放在initrd中;在初始化硬件及加载各硬件驱动程序后,内核会以只读的方式挂载根文件系统,并且运行第一个程序/sbin/init。此后系统的控制权就交给了/sbin/init进程了。 /sbin/init进程是系统第一个启动的程序,它是其他所有进程的父进程。当它接管了系统的控制权先之后,它首先会去读取/etc/inittab文件来执行相应的脚本进行系统初始化,如设置键盘、字体,装载模块,设置网络等。 在niittab中有一个很重要的设置选项runlevel。根据runlevel的不同启动不同的服务,让Linux的使用环境不同。 基本上runlevel分为0-6,7个等级: 0:关机,shutdown 1:单用户模式(sigleuser),root用户,无须认证;维护模式;。 2:多用户模式(multiuser),会启动网络功能,但不会启动NFS;维护模式; 3:多用户模式(multiuser),完全功能模式;文本字符界面; 4:预留级别:目前无特别使用目的,但习惯同3级别使用; 5:多用户模式(multiuser),完全功能模式,图形界面; 6:重启模式, 系统启动脚本配置文件 系统初始化的过程主要是执行一些脚本配置文件来完成的: 1、执行系统初始化脚本(/etc/rc.d/rc.sysinit),对系统进行基本的配置,以读写方式挂载根文件系统及其它文件系统,到此系统算是基本运行起来了,后面需要进行运行级别的确定及相应服务的启动。 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下的文件。 最后一步输入用户名及密码就可以登入系统了。 如果看不清楚请看附件 grub.conf grub.conf是grub的主配置文件,通过这个配置文件,grub才能找到kernel,系统才能正常启动。 default default:定义默认启动的操作系统 timeout splashimage splashimage:指定我们选择kernel或操作系统菜单后面那张图片。如果定义,这张图片需要用linux自带的软件xmp制作,在图形界面可以打开。图片的特点为: 1,必须是xpm的格式 2,必须用gzip压缩 3,最多使用14位的颜色位数 4,分辨率640*480 hiddenmenu hiddenmenu:表示隐藏选择k操作系统的菜单,只有出现等待界面后按下enter键才会出现。如果没有这个字段,则每次系统启动都会出现这个选择菜单。 titleidentify:指定一个操作系统,linux中可以有多个title;identify是这个操作系统的识别符,可以随意写。 root:用于指定grub所能识别的根,而不是根文件系统。 kernel:用于指定系统的内核文件的位置 initrd:帮助kernel完成系统的启动,例如加载根文件系统所在分区的驱动等。如果kernel本身有相应强大的功能,则不需要initrd password 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这个目录,再找到这个图片文件作为背景. 修改背景图片: 生成所需的xpm格式的图片文件 使用ImageMagick命令将普通的.jpg.bmp等生成xpm文件 grub加密: password--md5$1$UrprW0$UzN7ozenwICzcPCQgiFts1 表示要想进入kernel的编辑菜单,需要输入密码。这个密码可以通过命令grub-md5-crypt生成。 密码添加在title前面 将密码放在这个位置时,在选择grub菜单时就需要输入密码了。 密码添加在title后面 密码在这个位置时,选择完操作系统后,在进入系统引导时才需要输入密码。 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中 depmod -a扫描所有,并写入*.dep -A扫描新模块,并写入*.dep -n显示到屏幕,不写入*.dep 查看内核模块 lsmod查询所有模块的信息 modinfo查询某模块的简单信息 添加删除内核模块 modprobe[选项]模块 a.下载到相应的模块 b.复制到指定位置,一般/ib/modules/2.6******/kernel/ c.用depmod进行扫描,将新模块写入modules.dep文件中 d.用modprobe进行安装 Linux服务管理 服务分类 二进制包 1.快速安装、卸载、升级和管理软件 2.安装简洁、速度快 3.经过封装,无法直接获取源代码 4.功能选择性差,功能定制不灵活 源码包 1.获得最新的软件版本,及时修复bug 2.根据用户需要,灵活定制软件功能 RPM包的服务管理 RPM包所安装的软件有特定的管理命令,管理方式分为两种: 独立服务: 所谓的独立启动,就是可以自行管理启动,和其他的软件的启动与否没有关系,不依赖其他软件的启动,此类软件当被调用时会直接响应,处理请求的速度快。目前Linux中绝大多数服务为独立服务。 手动启动: 2.service服务管理工具 service服务名start|stop|restart|reload|...... /etc/init.d/脚本名start|stop|restart|reload|...... 注:服务名=脚本名 自动启动: 1.使用chkconfig服务自启动工具管理 查看软件的自启动: chkconfig–list|grep服务名 chkconfig--list服务名 设置某服务的自启动: chkconfig[--level级别][独立服务名][on|off]chkconfig--list|2345服务名on-off 2.使用ntsysv工具设置自启动软件 netsysv--level级别 设置某级别下软件是否自启动 F1:显示服务的说明信息 在脚本中添加两行信息: chkconfig:23454555 注:两个数字不得大于99 chkconfig--add脚本名将脚本添加到自启动管理序列中 chkconfig--del脚本名将脚本删除到自启动管理序列中 基于xinetd的服务: 此类服务无法独立启动,必须依赖某一管理服务来启动或者关闭,这个管理服务就是我们xinetd服务了,此服务是Linux的超级守护进程,专门用来管理那些无法自行启动的服务,当客户端请求服务启动时,请求会先被xinetd服务接受,然后xinetd去唤醒对应的服务,打到启动某服务的目的。这类服务不会一直处于开启状态,只有在xinetd服务接受到请求的时候才会唤醒对应服务,处理完后服务关闭,这样大大节省了服务器的资源,但是对应的软件的反应速度没有独立服务反应快。 基于xinetd服务的—telnet rpm中集中管理模式 一个大服务:管理多个小服务 此处我们用telnet服务来举栗子!telnet是远程管理命令,但由于传输过程是明文,so…我们不选用他,我们使用更安全的ssh,telnet的端口是23,我们借助xinetd来启动下我们的telnet。 手动启动xinetd中的某服务 vim/etc/xinetd.d/telnet 此处我们只需要将disable=yes修改成no即可! 然后重新启动xinetd服务(注意我们现在是借助xinetd来管理的telnet) 设置xinetd内的服务自启动 同样借助chkconfig和ntsysv来实现自启动,但是这个地方我们需要注意的是,我们不是设置某个具体服务的自启动,而是设置的xinetd的自启动。 telnet 服务端包装包名:telnet-server 客户端包装包名:telnet 源码包的服务管理 手动启动源码包服务—指定路径启动 eg./usr/local/apache2/bin/apachectlstart|stop|restart………… 绝对路径: /usr/local/apache2/bin/apachectlstart|stop....... 自动启动源码包服务 借助/etc/rc.d/rc.local或者/etc/rc.local实现开机自启 写入手动启动命令即可 借助/etc/rc.local,实现开机自启 vim/etc/rc.local /usr/local/apache2/bin/apachectlstart& 自己编写管理脚本 /etc/init.d/ service+chkconfig 让系统识别源码包 注意:脚本中有两句话必须存在!作用让chkconfig识别此脚本,并能执行。 tcpdump命令 tcpdump(选项) -a:尝试将网络和广播地址转换成名称; -c<数据包数目>:收到指定的数据包数目后,就停止进行倾倒操作; -d:把编译过的数据包编码转换成可阅读的格式,并倾倒到标准输出; -ddd:把编译过的数据包编码转换成十进制数字的格式,并倾倒到标准输出; -e:在每列倾倒资料上显示连接层级的文件头; -f:用数字显示网际网络地址; -F<表达文件>:指定内含表达方式的文件; -i<网络界面>:使用指定的网络截面送出数据包; -l:使用标准输出列的缓冲区; -n:不把主机的网络地址转换成名字; -N:不列出域名; -O:不将数据包编码最佳化; -p:不让网络界面进入混杂模式; -q:快速输出,仅列出少数的传输协议信息; -r<数据包文件>:从指定的文件读取数据包数据; -s<数据包大小>:设置每个数据包的大小; -S:用绝对而非相对数值列出TCP关联数; -T<数据包类型>:强制将表达方式所指定的数据包转译成设置的数据包类型; -v:详细显示指令执行过程; -vv:更详细显示指令执行过程; -x:用十六进制字码列出数据包资料; -w<数据包文件>:把数据包数据写入指定的文件。 实例 直接启动tcpdump将监视第一个网络接口上所有流过的数据包 tcpdump 监视指定网络接口的数据包 tcpdump-ieth1 如果不指定网卡,默认tcpdump只会监视第一个网络接口,一般是eth0,下面的例子都没有指定网络接口。 监视指定主机的数据包 打印所有进入或离开sundown的数据包。 tcpdumphost210.27.48.1 打印helios与hot或者与ace之间通信的数据包 tcpdumphostheliosand\(hotorace\) 截获主机210.27.48.1和主机210.27.48.2或210.27.48.3的通信 tcpdumphost210.27.48.1and\(210.27.48.2or210.27.48.3\) 打印ace与任何其他主机之间通信的IP数据包,但不包括与helios之间的数据包. tcpdumpiphostaceandnothelios 如果想要获取主机210.27.48.1除了和主机210.27.48.2之外所有主机通信的ip包,使用命令: tcpdumpiphost210.27.48.1and!210.27.48.2 tcpdump-ieth0srchosthostname 监视所有送到主机hostname的数据包 tcpdump-ieth0dsthosthostname 监视指定主机和端口的数据包 tcpdumptcpport23host210.27.48.1 对本机的udp123端口进行监视123为ntp的服务端口 tcpdumpudpport123 监视指定网络的数据包 打印本地主机与Berkeley网络上的主机之间的所有通信数据包 tcpdumpnetucb-ether ucb-ether此处可理解为“Berkeley网络”的网络地址,此表达式最原始的含义可表达为:打印网络地址为ucb-ether的所有数据包 tcpdump'gatewaysnupand(portftporftp-data)' 注意:表达式被单引号括起来了,这可以防止shell对其中的括号进行错误解析 打印所有源地址或目标地址是本地主机的IP数据包 tcpdumpipandnotnetlocalne Linux系统管理 进程管理 什么是程序? 代替人管理操作系统,完成特定任务,解决特定问题的一段代码集合。 一个看得到,摸得着的代码集合体 什么是进程? 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动。 进程由程序打开后产生的载体 什么是线程? 线程是进程中的一个实体,被称为轻量级进程,是程序执行流的最小单元。 一个线程只能处理一个请求,多个线程可以同时处理多个请求 进程是载体,线程才是负责干活的 进程的作用 进程的查看 ps命令(aux跟-le)查看当前一瞬间的进程的状态信息 ps命令(aux,-le) 静态查看系统中的进程,查询的是命令执行一瞬间的进程的状态。 aux以BSD操作系统的格式输出 -le以Linux标准格式输出 选项详解: a显示一个终端的所有进程 u显示进程的归属用户及内存的使用情况 x显示没有控制终端的进程 l长格式显示,更加详细的信息 e显示所有进程与a的作用一致 psaux:结果分析 USER:该进程的运行用户,或者理解为产生进程的用户 PID:进程的PID号 %CPU:进程占用的cpu的百分比 %MEM:进程占用物理内存的百分比 VSZ:占用的虚拟内存的大小(KB) RSS:占用物理内存的大小(KB) STAT: D无法中断的休眠状态(通常IO的进程) R正在运行的进程 S处于休眠状态 T停止或被追踪 W进入内存交换(从内核2.6开始无效) X死掉的进程(基本很少见) Z僵尸进程 <优先级高的进程 N优先级较低的进程 L被锁进内存的进程 s进程的领导者(在它之下有子进程) l多进程的 +位于后台的进程组 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号排序 k:按照PID号给予某一个进程信发送指令,可用于杀 死进程 r:按照PID给某个进程重设优先级(Nice)值 q:退出交互模式 top结果分析 第一行信息: 第二行信息: 第三行信息: 第四行信息: 第五行信息: 剩下的选项基本和我们的PS是相同的。 htop 需要安装命令,命令整体跟top差不多,比top智能 拓展:pstree进程树 -p显示PID -u显示运行用户 进程处理命令: Kill 1.kill进程号 kill-l#查看kill所支持的信号 常用的信号: HUP(1):复位,重新加载配置 INT(2):中断(同Ctrl+C) TERM(15):终止(正常退出) KILL(9):强制终止 CONT(18):继续(与STOP相反) STOP(19):暂停(同Ctrl+Z) psaux|grep“vi”|grep-v“grep” kill-125606 重新加载配置文件,但不重启进程(保证进程号不改变,保证进程持续工作)软重启平滑重启 killall 2.killall进程名 killall-i#交互式,询问是否杀死 killall-I(大)#忽略大小写 pkill 3.pkill终端号 进程优先级(ps–le) ps–le可以查看到进程的优先级 PRI代表的是Priority,NI代表nice两个都是优先级,但是PRI不能修改,因为这是内核内定义的,无法人为修改,但是我们能修改NI。 公式: PRI(最终值)=PRI(初始值)+NI值 76=80+(-4) 我们可以通过这样的方式改变优先级,但是NI也有限制。 NI值总范围 NI值总范围:-20到19 普通用户的NI值:0到19,普通用户只能调高NI值,不能降低;root可以随意调整,包含其他用户的进程 nice跟renice用于修改NI值的命令 nice命令 nice命令(只能在启动或重启时) renice renice命令(修改启动状态进程的NI值) renice-10PID 工作管理 工作类型: 前台:当前终端正在进行标准输出到显示器上的工作 当前终端的工作只能当前终端管理,其它终端不能管理 后台:不用将命令执行过程标准输出到显示器的工作 放入后台的工作必须是能持续运行的,否则程序会被暂停。 bg恢复到后台运行 fg恢复到前台运行 详细请看下面的:后台工作的管理 如何将工作放到后台 1.命令&:将工作到到后台,并持续执行 2.ctrl+z:将工作放到后台,并暂停执行 后台工作的管理: 查看:jobs -l:显示工作进程PID 将后台暂停的工作恢复到前台继续执行 fg%工作号:%可省略,主要是却别PID的 将后台暂停的工作恢复到后台继续执行 bg%工作号 让后台的工作脱离终端进行运行 a./etc/rc.local文件 b.定时计划任务(下边) 系统资源查看 vmstat:监控系统资源 结果分析: Procs(进程): r:运行队列中进程数量 b:阻塞的进程 Memory(内存): swpd:虚拟内存已使用的大小 free:空闲的物理内存的大小 buff:用作缓冲的内存大小(系统) cache:用作缓存的内存大小(被调用资源) Swap: si:每秒从磁盘读入虚拟内存的大小 so:每秒虚拟内存写入磁盘的大小 注:如果这个值大于0,表示物理内存不够用 IO:(现在的Linux版本块的大小为1024bytes) bi:每秒读取的块数 bo:每秒写入的块数 系统: in:每秒CPU中断数,包括时钟中断。 cs:每秒上下文切换数(资源调用的次数,如:函 数)。 CPU(以百分比表示): 机所调用) dmesg:内核的检测信息 查看开始是内核的检测信息(/var/log/dmesg) free:查看内存使用情况 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反映的是空闲的内存总数。 第三行:swap的前面有! 虚拟内存:就是把一些硬盘空间转化为虚拟内存空间 查看cpu信息 逻辑CPU个数 cat/proc/cpuinfo|grep"processor"|wc–l 物理CPU个数: cat/proc/cpuinfo|grep"physicalid"|sort-u|wc–l 每个物理CPU中Core的个数: cat/proc/cpuinfo|grep"cpucores"|uniq|awk-F:'{print$2}' 查看coreid的数量,即为所有物理CPU上的core的个数 cat/proc/cpuinfo|grep"coreid"|uniq|wc–l -r查看内核版本 -s查看内核名称 lsb_release-a查看当前发行版 lsof:列出进程打开或正在使用的文件信息 lsof-p进程号:查看某进程运行所调用的资源 lsof-u:查看用户运行的进程调用了哪些文件 系统定时任务 at:单次计划任务命令 at命令的执行需要依托atd服务 serviceatdstart chkconfigatdon 限制用户使用at命令 /etc/at.allow#白名单 /etc/at.deny#黑名单 白名单的优先级大于黑名单 假如黑白名单都不存在,只有root能使用at命令 at命令 -m:执行结束发送通知邮件(执行此命令的用户) atq:查看计划任务 atrm:删除计划任务 -c工作号:查看对应工作号的详细信息 [HH:MM][yyyy-mm-dd](now+2minutes) 写完后用ctrl+d结束并保存任务 crontab循环计划任务命令 编辑:crontab-e:添加循环计划任务 查看:crontab-l:查看已存在的计划任务 删除:crontab-r:删除已存在的计划任务 017**1-5:周一到周五每天17:00 308**1,3,5:每周一、三、五的8点30分 08-18/2***:8点到18点之间每隔2小时 0**/3**:每隔3天 Kdump:内核崩溃转储机制 kdump是LinuxKernel崩溃时的转储机制,简单理解就是在系统启动过程中如果Kernel因为某些原因崩溃了,kdump就会负责记录日志以便排查原因。在CentOS6等Linux发行版中,即便采用最小化安装,kdump也会作为服务安装到系统中 详细请看: Linux日志管理 Linux系统内核和许多程序会产生各种错误信息、警告信息和其他的提示信息,这些信息对管理员了解系统的运行状态是非常有用的,所以应该把它们写到日志文件中去。完成这个过程的程序就是syslog。syslog可以根据日志的类别和优先级将日志保存到不同的文件中。例如,为了方便查阅,可以把内核信息与其他信息分开,单独保存到一个独立的日志文件中。默认配置下,日志文件通常都保存在“/var/log”目录下。 日志管理 管理哪些日志: 目的:根据产生的日志类型,进行分析,日志类型,日志等级 将指定的日志类型和日志等级根据rsyslog.conf配置文件记录的方式位置保存 /var/log/:被rsyslog所管理 rpm和源码安装的第三方服务 根据服务的配置文件 以apache做比如 rpm: /var/log/服务名/ 源码: /PREFIX/logs/ 如何收集到的日志信息: rsyslog的日志管理服务(日子分析,分类存放) /etc/rsyslog.conf(根据此配置文件的规则进行分类存放) 规则: 日志的类型.等级存放位置 如何管理日志 rsyslog rsyslog.conf 客户端:修改配置文件,修改日志存放位置为:@@192.168.88.20:514 服务端:修改配置文件,开启TCP协议514端口,用于接收来自于客户端的日志 防止日志文件过大 a)logrotate b)logrotate.conf(规则配置文件) a)周期,保留的备份数量,创建新的日志文件 b)是否要压缩,修改文件的后缀 a)针对某些特定的日志(wtm/btmp) 避免日志文件过大: 轮替: 提前防止避免日志文件过大 logrotate /etc/logrotate.conf weekly每周对日志进行依次轮替 rotate保存日志的数量 create在轮替过程中,自动创建新的文件 dateext使用日期作为日志文件的后缀 compress是否压缩进行轮替的日志 rotatelogs的命令进行轮替 切割: 用于日志文件过大时的解决方案 split -b按照指定大小切割 -l按照指定行数切割 主机名修改 主机名修改:内核2.6.32前 临时:hostnamebj-xdl-y26(www.linuxlc.com) 永久:/etc/sysconfig/network HOSTNAME=www.linuxlc.com CentOS6.X以后日志的管理服务从syslog升级成为了rsyslog,增强了部分功能。 基于TCP网络协议传输日志信息 更安全的网络传输方式 有日志消息的及时分析框架 后台数据库 配置文件可以写一些简单的逻辑判断 兼容syslog配置文件 常见的日志文件 这些都是系统默认的日志,以及存放位置,那么除此之外我们还有一些RPM或者源码的软件安装产生的日志。 那么源码的日志则存放在了指定安装的位置下。 rsyslog服务 日志的格式: 只要是通过rsyslog记录的日志,格式是相同的,包含以下内容: 服务器的主机名 服务名或者程序名 事件具体信息 rsyslog配置文件: /etc/rsyslog.conf 第一列为日志类型和日志优先级的组合,每个类型和优先级的组合称为一个选择器; 后面一列为保存日志的文件、服务器,或输出日志的终端。syslog进程根据选择器决定如何操作日志。 对配置文件的几点说明: u日志类型和优先级由点号(.)分开,例如kern.debug表示由内核产生的调试信息。 ukern.debug的优先级大于debug。 u星号(*)表示所有,例如*.debug表示所有类型的调试信息,kern.*表示由内核产生的所有消息。 u可以使用逗号(,)分隔多个日志类型,使用分号(;)分隔多个选择器。 对日志的操作包括: u将日志输出到文件,例如/var/log/maillog或/dev/console。 u将消息发送给用户,多个用户用逗号(,)分隔,例如root,amrood。 u通过管道将消息发送给用户程序,注意程序要放在管道符(|)后面。 u将消息发送给其他主机上的syslog进程,这时/etc/syslog.conf文件后面一列为以@开头的主机名(IP)例:@192.168.88.30 rsyslog识别的服务才能写到配置文件中 连接符号: 日志服务[连接符号]日志等级日志记录位置 “.”:代表只要比后面的等级高的(包含该等级)日志都记录下来。比如:“cron.info”代表cron服务产生的日志,只要日志等级大于等于info级别,就记录 “.=”代表只记录所需等级的日志,其他等级的都不记录。比如:“*.=emerg”代表人和日志服务产生的日志,只要等级是emerg等级就记录。这种用法及少见,了解就好 “.!”代表不等于,也就是除了该等级的日志外,其他等级的日志都记录。 日志等级: 特殊等级:none不记录任何等级,相当于忽略该服务 日志记录位置: 系统设备文件。如“/dev/lp0”代表第一台打印机,如果日志保存位置是打印机设备的话,当有日志时就会在打印机打印(不太符合可持续发展战略哦-_-!)。 转发给远程主机。因为可以选择使用TCP协议和UDP协议传输日志信息,所以有两种发送格式。如使用 “@192.168.0.210:514”,就会把日志内容使用UDP协议发送到192.168.0.210的UDP514端口上;如果使用 “@@192.168.0.210:514”就会把日志内容使用TCP协议发送192.168.0.210的TCP514端口上,其中514是日志服务默认端口。当然只要192.168.0.210同意接收此日志,就可以把日志内容保存在日志服务器上。 用户名。如“root”,就会把日志发送给root用户,当然root要在在线,否则就收不到日志信息了。发送日志给用户时,可以使用“*”代表发送给所有在线用户,如“mail.**”就会把mail服务产生的所有级别的日志发送给所 有在线用户。如果需要把日志发送给多个在线用户,用户名之间用“,”分隔。忽略或丢弃日志。如果接受日志的对象是“”,代表这个日志不会记录,而被直接丢弃。如“local3.*~”代表忽略local3服务类型所有的日志都不记录。 自定义日志记录: vi/etc/rsyslog.conf *.crit/var/log/alert.log 将所有临界点以上的错误都记录到alert日志中 修改完成,重启rsyslog服务,检查下有没有生成文件。 日志服务器搭建: 接收端: 配置文件:(有UDP和TCP) 取消后二行注释,让接受端口生效。 重启服务,然后查看端口是否生成 发送端: 修改配置文件: 添加: *.*@192.168.110.111:514 注意:可以使用UDP用一个@;也可以使用TCP要用两个@@ 重启服务,OK 在发送端,创建用户,然后检查接收端,查看日志/var/log/secure 注意事项:都知道Linux不依靠主机名识别,但是日志服务器需要根据主机来识别,so。。。我们如果一台记录多台的日志信息,需要修改主机名。 日志轮替 主要目的防止单个日志文件过大,按照我们的规则对日志进行相应处理 主要依赖/etc/logrotate.conf配置文件中的dateext参数实现日志的处理。 主要参数解释: 系统自动定期进行日志轮替的原因: /etc/cron.daily/有一个脚本,每天都会运行,查看是否有符合轮替的日志,然后进行相应处理 我们尝试在rsyslog配置文件中添加自己的日志记录,然后并且强制执行轮替,看会不会产生轮替文件 1.先在配置文件中写入自己的日志轮替规则(参照原文中的) logrotate–vf/etc/logrotate.conf Linux备份管理 Linux中哪些数据需要备份? 1.Linux系统重要数据 v/home/目录:/home/目录是普通用户的家目录,如果是生产服务器,这个目录中也会保存大量的重要数据,应该备份。 v/etc/目录:系统重要的配置文件保存目录,当然需要备份。 v其他目录:更具你的系统的具体情况,备份自己认为的重要目录。比如我们的系统中有重要的日志,或者安装了RPM包的mysql服务器(RPM包安装的mysql,数据库保存在/var/lib/mysql/目录中),那么/var/目录就需要备份。如果我们服务器中安装了多个操作系统,或编译过新的内核,那么/boot/目录就需要备份。 2.安装服务和软件的数据 apache需要备份如下内容: 网页存放路径 v网页主目录。RPM包安装的apache,需要备份/var/www/html/目录中所有数据;源码包安装的apache需要备份/usr/local/apache2/htdocs/目录中所有数据。 mysql服务需要备份如下内容: 数据库文件的保存位置 vmysql需要备份的内容就没有apache多了,主要需要备份的就是数据库内容。 v源码包安装的mysql,数据库安装/usr/local/mysql/data/目录中,只要备份此目录即可 vRPM包安装的mysql,数据库默认安装到了/var/lib/mysql/目录中,如果需要备份则需要备份这个目录。 ftp:服务 ftp:用户上传文件的目录 常见备份策略 完整备份 增量备份 假设我们第一天时,进行一次完全备份。第二天增量备份时,只会备份第二天和第一天之间的差异数据,但是第二天的总备份数据是完全备份加第第一次增量备份的数据。第三天增量备份,只会备份第三天和第二天之间的差异数据,第三天的总备份数据是完全备份,加第一次增量备份的数据,再加第二次增量备份的数据。当然第四天增量备份时,只会备份第四天和第三天的差异数据,数据时完全备份加第一次增量备份加第二次增量备份加第三次增量备份的数据。这种备份的好处是每次备份需要备份的数据较少,耗时较少,占用的空间较少。坏处是数据恢复比较麻烦,如果是上图的例子,那么当数据恢复时,就要先恢复完全备份的数据,再依次恢复第一次增量备份的数据,第二次增量备份的数据和第三次增量备份的数据,最终才能恢复所有的数据。 差异备份 备份策略: 地点: 同端备份:复制恢复快、不安全 多端备份:移动硬盘、光盘、其他机器安全性较高 异地备份:不同地点(容灾)安全性很高 云端备份:对象存储空间安全有隐患 备份类型: 冷备份:完全停止数据的更新,进行备份 温备份:保证数据的正常读取,但无法写入,进行备份 热备份:保证数据正常读取的同时,进行数据备份 压缩: 1.空间小 2.传输快 策略监控执行: 检查备份策略是否执行 检查备份的文件是否可用: 尝试恢复备份 备份与恢复工具:dump和restore dump(备份) dump支持0-9十个备份级别,0指完整备份,1-9指增量备份 我们备份一个数据时,第一次备份应该使用0级别,会把所有数据完全备份一次。第二次备份时就可以使用1级别了,它会和0级别比较,把0级别备份之后变化的数据进行备份。第三次备份时,使用2级别,2级别是和1级别比较,把1级别备份之后变化的数据进行备份,以此类推。需要注意的是,只有备份整个分区或整块硬盘时,才能支持1-9的增量备份级别。而如果只是备份某个文件或不是分区的目录,则只能使用0级别进行完全备份。 dump[选项]备份之后的文件名源文件名 例:dump-0uj-f/root/boot.bak.bz2/boot 级别: 0-9十个备份级别 0完整备份 1-9增量1到增量9 -f文件名:指定备份后的文件名(.dump) /etc/dumpdates中 -j:调用bzlib库压缩备份文件,(.bz2)压缩等级2 备份时,进行压缩(bz2) 注:备份目录时,则不能写-u选项,否则无法正常备份 备份分区: df–h查询当前能进行备份的分区信息 dump-0uj-f/root/boot.bak.bz2/boot cat/etc/dumpdates 修改/boot/分区内的信息,进行第二次备份 dump-1uj-f/root/boot.bak1.bz2/boot/ #进行第二次备份,使用1级别,即增量备份 dump-W 注意:目录的备份只能使用完整备份,无法使用增量备份。 restore(恢复) restore[模式选择][选项] 例:restore-r-f*.dump.bz2#完全恢复 restore-i-f*.dump.bz2#交互式部分恢复 模式: -C:比较备份数据和实际数据的变化。如果实际数据中的现有数据发生了变化,这个选项能够检测这个变化。但是如果实际数据新增了数据,这个选项是不能检测到变化的。 对比现实中的目录是否比备份时的数据减少了,若减少,则提示哪个文件丢失了,但现实中增加的数据不会被检查到 -r:还原模式,还原数据 -i:交互模式,一般进行恢复时文件选择 add文件名:标记 delete文件名:取消标记 extract仅恢复标记的文件 1确认恢复 n不重设恢复文件的所属和权限 quit退出 -t:查看模式,查看备份文档中的内容 -f:指定备份文件的名称 比较备份数据和实际数据的区别,根据刚才我们的备份,进行对比 首先创建新的文件 touch/boot/a.txt 进行数据的比对 restore-C-f/root/boot.bak.bz2 注意:这样的比较无法比较出新增的信息,只能比对出减少的和修改的。