=========Linux运行级别===========
六种运行级别:
0、关机
1、单用户(可用来找回密码)
2、多用户无网络
3、多用户有网络(多用于工作环境)
4、预留
5、图形界面(多用于学习环境)
6、重启
相关命令:
a、切换当前运行级别:【init 3】(仅当前环境下生效,重启后失效)
b、得到当前运行级别:【systemctl get-default】
c、设置默认运行级别:【systemctl set-default graphical.target/multi-user.target】{永久生效}
【注】可以在/etc/inittab中查看相关信息
=========vim命令说明===========
vim三种模式
1.1 正常模式:按【ESC】键进入该模式,可以对文档进行复制、粘贴、删除等操作。
1.1.1 复制当前行:yy (y-yank)
1.1.2 复制当前n行:nyy (如5yy,从光标所在行开始数5行进行复制,包括当前行)
1.1.3 粘贴到指定行或具体位置:p (如果复制的是整行则粘贴到光标所在行的下一行,若复制的是某段内容则粘贴到光标所在位置的后面)
1.1.4 删除/剪切当前行:dd
1.1.5 删除/剪切当前n行:ndd
1.1.6 可视化块操作:v (移动左右方向键选中相应内容,按y复制选中内容,移动光标到指定位置按p粘贴)
1.1.7 取消上次动作:u (u-undo)
1.1.8 将光标移动到第一行:gg
1.1.9 将光标移动到最后一行:G
1.2 插入模式:按【i】键进入该模式。
1.3 命令模式:按【:】键进入该模式。可以对文档进行存盘、查找、退出、显示行号等操作。
1.3.1 保存并退出:【:wq】 (w-write,q-quit)
1.3.2 退出不保存:【:q!] (q-quit)
1.3.3 查找指定条件:【/要查找内容】 (n-查找下一个,N-查找上一个)
1.3.4 替换【:[替换范围]s/被替换内容/新内容/flags】
替换范围:无->当前行;m->第m行;m,n->第m到n行;%->整个文件
flags:g(global)->替换一行中出现的所有匹配,否则只替换一行中的第一次配置内容;c(confirm)->替换前需要确认;i->忽略大小写
s:s是substitute的缩写
1.3.5 显示行号:【:set nu】 (nu-number)
1.3.6 取消行号:【:set nonu】 (nu-number)
1.3.7 取消高亮显示:【:set noh】
1.3.8 将光标移动到指定行:【:行号】
1.4 个性化配置
配置文件:/etc/vimrc
内容:增加如下内容
set nu " 设置显示行号
set tabstop = 4 " 设置制表符的宽度为4个空格
set shiftwidth=4 " 设置缩进时使用4个空格
set autoindent " 启用自动缩进
set smartindent " 启用智能缩进
=========Linux命令说明===========
一、开关机
1.1 关机:
1.1.1 shutdown -h now 参数:h->halt,now->马上,now可以改为具体数字表示n分钟后关机。
1.1.2 halt 关机,但不关闭电源,尽量不用该命令
1.2 重启:
1.2.1 shutdown -r now 参数:r->reboot,now->马上,now可以改为具体数字表示n分钟后重启。
1.2.2 reboot
二、用户
2.1 切换用户:su - 用户名 (su-switch user,- 前后有空格的啊)
2.2 注销用户:logout/exit
2.3 新建用户:useradd 用户 (默认将该用户放入与该用户名相同的组中)
useradd -g 用户 (将该用户放入到指定组中)
2.4 设置密码:passwd 用户
2.5 删除用户:userdel 用户 (仅删除用户,不删除该用户的家目录及邮件目录等信息)
userdel -r 用户 (r-remove,将该用户的所有信息都删除)
2.6 修改用户所在组:usermod -g 组 用户
2.7 显示用户信息:id 用户
2.8 查看当前用户:whoami (该用户可能是后切换的)
2.9 查看首次登录用户:who am i
2.10 用户所在文件:/etc/passwd (每行含义->用户名:口令:用户标识号:组标识号:注释性描述:主目录:登录Shell)
2.11 密码所在文件:/etc/shadow
2.12 sudo命令:模拟root来执行某些系统命令(/sbin),比如关机、重启、添加用户等
root把某些系统命令赋给普通用户或组:visudo(实际上是修改/etc/sudoers)
格式如下:
root/#组 ALL=(ALL) ALL
用户名 IP地址【用户可在该IP的机器上执行命令】=(可使用身份) 具体命令
如:lag ALL= /sbin/shutdown -h now =>lag用户可以执行关闭linux命令
sudo -l 可以查看root都赋予它哪些权限
三、组
3.1 新建组:groupadd 组
3.2 删除组:groupdel 组
3.3 组所在文件:/etc/group (每行含义->组名:口令:组标识号:组内用户列表)
四、文件/目录
4.1 显示当前目录:pwd (pwd->print working directory)
4.2 显示目录内容:ls -al (a->all,l->list,可省略写ll)
4.3 切换目录:cd (cd ~ ->切换到当前用户的家目录,cd .. ->切换到上级目录)
4.4 新建目录:mkdir -p 目录 (p->parents,有参数p可以新建多级目录,无参数p则只能建1级目录)
4.5 删除空目录:rmdir 目录 (仅删除1级空目录,不实用)
4.6 删除目录/文件:rm -rf 目录/文件 (rm->remove,r->recursion递归,f->force直接删除不显示是否删除等提示信息,连目录带里面的文件一起删除,慎用啊)
4.7 创建空文件:touch 文件
4.8 拷贝目录/文件:cp -r 源目录/文件 目标目录 (r->recursion递归)
覆盖拷贝不提示:\cp -rf 源目录/文件 目标目录 (r->recursion递归,f-force强制覆盖不提示,因为cp默认使用的是别名【cp -i】,覆盖是要提示的,用\cp则不使用别名)
4.9 移动或重命名目录/文件:mv 源目录/文件 新目录/文件
4.10 查看文件内容:cat 文件 (参数n->带行号显示,|more 多屏显示,空格与ctrl+b翻屏)
4.11 查看文件内容:less 文件 (PgUp/PgDn翻页,/查找内容,q退出,适合显示较大文件)
4.12 查看文件内容:head -n 5 文件 (显示头5行文件内容,默认10行)
4.13 查看文件内容:tail -n 5 文件 (显示尾5行文件内容,默认10行,多用于查看日志)
tail -f 文件 (监控文件变化,ctrl+c退出)
4.14 输出内容到控制台:echo "内容" (echo $PATH/HOSTNAME)
4.15 输出重定向:> (用新内容替换旧内容)
>> (用新内容追加旧内容,如echo "hello" >> /root/111.txt)
4.16 软链接:ln -s 源目录/文件 链接名 (ln->link,类似windows中快捷键方式,存放链接文件的路径)
4.17 硬链接:ln 源文件 链接名 (类似C语言中指向某内存地址的2个指针,源文件与链接名的内容是一样的,任何一个修改另一个也跟着变化)
4.18 删除软链接:rm 链接名 (千万不要加参数-r来删除软链接,因为该参数会删除软链接对应的目录/文件内容而不是删除软链接)
4.19 删除硬链接:rm 链接名 (删除硬链接并不会影响另一个文件)
4.20 查看历史命令:history 10 (查看最近执行的10个命令)
4.21 执行历史命令:!10 (执行编号为10的历史命令)
4.22 字符相关命令:
4.22.1 cut [选项] 文件名 (d 分隔符->按指定分隔符来分割列delimiter;f 列号->提取第几列field。若2列之间用不固定的空格分隔的话该命令就不能用了)
如:cat /etc/passwd|grep /bin/bash|grep -v root|cut -d ':' -f 1 => lag zs 查询所有普通用户
4.22.2 printf '输出类型输出格式' 输出内容
输出类型:
%ns (输出字符串,n-输出几个字符)
%ni (输出正数,n-输出几个数字)
%m.nf (输出浮点数,如%8.2f,输出8位数,其中6位整数2位小数)
输出格式:
\n (换行)
\r (回车)
\t (TAB键)
4.22.3 awk '条件1{动作1} 条件2{动作2} ...' 文件名
如:df -h | awk '{printf $1 "\t" $5 "\t" $6 "\n"}'
df -h|grep sda2|awk '{printf $5}'|cut -d '%' -f 1
df -h|awk 'BEGIN{FS=" "}{printf $1 "\t" $2 "\n"}' (FS="分割符",前面的BEGIN是在读取内容时先做点什么)
五、日期
5.1 显示当前时间:date "+%Y-%m-%d %H:%M:%S"
5.2 设置当前时间:date -s "2024-03-20 20:23:18" (重启失效)
5.3 显示日历:cal 2024 (显示2024年的日历)
六、搜索查找
6.1 查找文件:find 搜索范围 -name 文件名 (从指定目录递归查找指定名称的文件,如:find /root -name hello*)
6.2 快速定位:locate 文件名 (该命令自己建立数据库并在其中查找而不是遍历目录查找,因此要先执行updatedb建立/更新数据库。文件不能匹配通配符)
如: updatedb
locate hello.c
6.3 过滤查找:grep [选项] 要查找内容 源文件 (n->显示行号,i->忽略大小写,v->反向匹配。在某文件或管道中查找内容)
如: grep -n "prin" /root/test/hello.c
cat /root/test/hello.c | grep -n "prin"
6.4 查找命令所在位置:which 命令
七、压缩解压
7.1 内部命令
7.1.1 压缩:gzip 文件 (该命令只能压缩文件,不能压缩目录,要想压缩目录必须与tar联合使用,该命令默认不保留源文件)
7.1.2 解压:gunzip 文件
7.1.3 打包:tar [选项] xxx.tar.gz 打包内容 (tar将某目录下所有内容归档成一个.tar文件,然后用gzip将该文件压缩成.tar.gz文件来实现压缩目录)
如:tar -zcvf home.tar.gz /home (z-用gzip压缩,c-建立新.tar文件,v-显示详细信息,f-指定压缩后文件名该参数一定要放到最后一个)
7.1.4 拆包:tar [选项] xxx.tar.gz -C 拆包后存放路径
如:tar -zxvf home.tar.gz -C /root (x-释放,C-指定释放路径,无则默认当前目录)
7.2 外部命令
7.2.1 压缩:zip [-r] xxx.zip file1 file2... (该压缩格式与windows通用,若要压缩目录则加参数r。但该命令不是linux内部命令,需要安装)
7.2.2 解压:unzip [-d] 解压后存放路径 xxx.zip (默认解压到当前目录,该命令需安装)
八、权限管理(重点)
8.1 修改文件所有者:chown 用户 文件1 文件2... (仅修改文件的所有者而不会修改文件的所在组,目录可以加参数-R来递归把目录下所有文件一起修改)
8.2 修改文件所在组:chgrp 组 文件1 文件2... (仅修改文件所在组)
8.3 权限符号:drwxr-xr-x (共10位)
第0位:文件类型(-文件,d目录,l软链接,c字符设备文件如鼠标键盘,b块设备如硬盘)
第1~3位:文件所有者的权限 (r可读,w可写,x可执行)
第4~6位:文件所在组的权限
第7~9位:文件其他组的权限
针对目录的权限符号含义:
r-可以读取查看目录内容,如ls
w-可以修改目录,如重命名目录,在目录内创建或删除文件
x-可以进入目录,如cd (这个非常重要,若无该权限则目录就进不去,进不去目录就无法对目录内的文件做任何操作)
针对文件的权限符号含义: (该文件所在目录必须拥有x权限,否则无意义。连目录都进不去又如何能操作文件呢)
r-可以读取查看文件,如cat less head tail
w-可以修改文件,但但但不代表可以删除文件,想删除文件的前提是对该文件所在目录有w权限
x-可以执行文件
修改权限:chmod
第一种方式:用[+][-][=]来变更文件/目录权限 (u-所有者,g-所在组,o-其他组,a-所有人{包括ugo})
1)chmod u=rwx,g=rx,o=r 文件/目录 (-rwxr-xr--)
2)chmod o+w 文件/目录 (其他组增加w权限)
3)chmod a-x 文件/目录 (所有人都取消执行权限)
第二种方式:用数字来变更文件/目录权限 (r=4,w=2,x=1;{数字1=x,2=w,3=wx,4=r,5=rx,6=rw,7=rwx}【记住:二进制000,2^2,2^1,2^0】)
chmod 751 文件/目录 (-rwxr-x--x)
8.4 文件系统属性权限:chattr (change file arrtibutes)
语法:chattr [+-=] [选项]
+ 增加权限; - 删除权限 = 等于某权限
i -> 文件:锁定该文件,只能看,其他什么也做不了。(针对root也生效)
目录:只能修改该目录下的文件数据,不能建立或删除文件。
举例:chattr +i /root/test/aaa.txt (锁定该文件,root也改不了)
lsattr /root/test/aaa.txt (查看该文件的系统属性)
chattr -i /root/test/aaa.txt (恢复正常)
a -> 文件:可增加文件内容,但不能删除或修改。
目录:可以在该目录下新建或修改文件,但不能删除。
九、任务调度(计划任务)
9.1 语法: crontab [选项] (e->编辑定时任务{edit},l-查询定时任务{list},r-删除定时任务{remove})
9.2 说明:*/1 * * * * date "+\%F \%T" >> /tmp/mydate.txt (五星上将,由于命令中有%,因此要用\转义,用#注释)
第1颗星:分钟 取值范围0-59
第2颗星:小时 取值范围0-23
第3颗星:天数 取值范围1-31
第4颗星:月份 取值范围1-12
第5颗星:星期 取值范围0-7 (0与7都代表周日)
符号解析:* 任何时间。
, 不连续时间。如[10 8,12,16 * * * 命令]代表每天的8点10分,12点10分,16点10分都执行一次命令
- 连续时间。如[0 5 * * 1-5 命令]代表每周一到周五早上5点0分执行一次命令
*/n 每隔多久执行一次。如[*/10 * * * * 命令]代表每隔10分钟执行一次命令
符号举例:45 22 * * * (每天22点45分执行)
0 17 * * 1 (每周一的17点0分执行)
0 5 1,15 * * (每月1号与15号的5点0分执行)
40 4 * * 1-5 (每周1到周五的4点40分执行)
*/10 4 * * * (每天4点,每隔10分钟执行一次,即4:10,4:20,4:30,4:40,4:50,5点以后就不算了)
0 0 1,15 * 1 (每月的1号与15号还必须得是周一才在0点0分执行)
十、磁盘管理
10.1 常识:主引导记录MBR{master boot record},位于硬盘的0柱面0磁头1扇区位置(主引导扇区),共512字节。
分三部分。主引导程序、硬盘分区表DPT(disk partition table)与分区有效标识(55AA)。
主引导程序占446字节,分区表占64字节(每个分区占16字节,因此最多可以分4区),分区有效标识占2字节(固定是55AA)。
由上述得知分区表的划分,一块硬盘最多可以分为4个分区,就像windows中的C、D、E、F盘,我们称之为主分区。那如果我们想多划分几个分区怎么办呢?
只要把某个主分区改为扩展分区就行了。即我们可以建立n个主分区(n<=3)+1个扩展分区。
扩展分区是不能直接使用的,也无法格式化,我们将该扩展分区再划分为多个逻辑分区就绕过MBR的限制了。
10.2 硬盘起名:在linux中一切皆文件。硬盘起名也是固定的。
IDE硬盘:默认文件名为hdx(hd->hard disk,x是用字母来代表硬盘数。如第一块硬盘hda,第二块为hdb...)。
硬盘划分的分区文件名hdxn(n-分区号,如第一块硬盘第1分区为hda1,第一块硬盘第2分区为hda2)。
SCSI硬盘:默认文件名为sdx(sd->scsi disk,x是用字母来代表硬盘数。如第一块硬盘sda,第二块为sdb...)。
硬盘划分的分区文件名sdxn(n-分区号,如第一块硬盘第1分区为sda1,第一块硬盘第2分区为sda2)。
10.3 增加硬盘:新增加一个10G硬盘,则该文件名为sdb,将该硬盘划分为1个主分区2G和1个扩展分区8G,再将扩展分区划分为2个逻辑分区,各4G。
10.3.1 显示块设备信息:lsblk [选项] (lsblk->list block devices,参数f->显示文件系统相关信息,如类型、标签、UUID等)。
通过该命令【lsblk】我们可以看到新增加的硬盘名称为sdb,但还没有分区,暂时不能使用。
10.3.2 分区:fdisk 设备名 (fdisk /dev/sdb)
10.3.2.1 输入n,创建新分区。再输入p创建主分区,分区号为1,起始扇区2048,默认回车,截止扇区要改为【+2G】,这第一个分区大小就固定了。
分区大小=(截止扇区-起始扇区)* 512 / 1024 / 1024 / 1024 = 2G。可以输入p来查看该分区的详细信息。
10.3.2.2 输入n,再输入e,创建扩展分区,分区号为2,一路默认回车,把硬盘剩余的8G空间都给它。
10.3.2.3 输入n,再输入l,将扩展分区再划分为逻辑分区,默认分区号5,因为前4个号是给主分区与扩展分区预留的,逻辑分区必须从5开始。截止扇区改为【+4G】
10.3.2.4 输入n,再输入l,创建逻辑分区,默认分区号为6,一路默认回车,将剩余空间都给它。
10.3.2.5 输入w,将以上修改写入到硬盘中。
[注]如果输入错误时按退格键是不好用的,得按ctrl+Backspace才行。
这时我们用lsblk -f查看就可以看到新增加的硬盘已经分好区了。但还没有UUID与挂载。
UUID是某分区的唯一识别码,只有格式化后才有。
10.3.3 格式化:mkfs -t 文件系统类型 分区块 (mkfs->make file system。文件系统类型用ext4)
10.3.3.1 mkfs -t ext4 /dev/sdb1 (该命令执行完后用lsblk -f就可以查看到UUID了)
10.3.3.2 mkfs -t ext4 /dev/sdb2 (出错了,因为sdb2是扩展分区,不能格式化)
10.3.3.3 mkfs -t ext4 /dev/sdb5 (格式化逻辑分区)
10.3.3.4 mkfs -t ext4 /dev/sdb6 (格式化逻辑分区)
格式化完毕,只要与目录挂载就可以使用了。
10.3.4 挂载:mount 设备文件 挂载目录
10.3.4.1 mount /dev/sdb1 /newdisk1 (先建立目录/newdisk1,再挂载)
10.3.4.2 mount /dev/sdb5 /newdisk5
10.3.4.3 在挂载sdb6前先做个小实验。在目录/newdisk6中新建1个文件old.txt,由于此时该目录还未被挂载,所以该文件被存放在与/挂载的sda2中,
回退到根目录下开始挂载。 mount /dev/sdb6 /newdisk6,此时再进入到newedisk6中查看,刚才新建的old.txt已经不存在了。
我们再新建一个文件new.txt。
10.3.5 卸载:umount 设备文件/挂载目录
10.3.5.1 卸载sdb6:umount /dev/sdb6,卸载后我们进入newdisk6中发现new.txt文件不存在了,而old.txt文件回来了。哈哈
10.3.6 永久挂载:用命令行挂载的方式在linux重启后会失效,只有修改配置文件才会永久生效。
10.3.6.1 修改配置文件/etc/fstab (fstab->file system table)
vim /etc/fstab (如UUID=477771fc-7c21-4fce-a137-37ec34c1c0f5 /boot ext4 defaults 1 2)
该配置文件挂载行分6部分。
10.3.6.1.1 分区设备文件或UUID,建议使用UUID(可以用lsblk -f查看)而不是设备文件,因为设备文件的顺序可以人为修改,比如把sdb1改为sdb3,
而配置表却没有同步修改则可能会导致系统崩溃。
10.3.6.1.2 硬盘挂载点
10.3.6.1.3 文件系统名称类型
10.3.6.1.4 挂载参数
10.3.6.1.5 分区是否被dump备份(0-不备份,1-每天备份,2-不定期备份)
10.3.6.1.6 分区是否被fsck检测(0-不检测,其他数字代表检测优先级,1最高)
如:/dev/sdb5 newdisk5 ext4 defaults 0 0
10.3.6.2 自动生效:mount -a (根据/etc/fstab内容自动挂载,永久生效,不用重启)
该命令非常重要,必须执行,可以查看挂载是否正确,有错误可以马上修改,否则有错误重启后会导致系统崩溃。
10.3.6.3 挂载配置文件出错导致系统崩溃:
输入root密码进入系统,修改/etc/fstab配置文件即可。若该文件只读无法修改则执行命令【mount -o remount,rw /】重新把/对应分区挂载,有rw权限啊。
10.4 磁盘情况查询:df -h (df->disk free,h-human)
10.5 目录情况查询:du [选项] 目录 (du-disk usage,h-human,a-包含目录内文件,c-显示汇总信息)
如du -hac /root
10.6 统计文件行数、字数、字节数:wc [选项] 文件名 (wc-word count,l-行数,w-字数,c-字节数)
如 wc aaa.txt (92 228 5744 aaa.txt,即92行,228个单词,5744字节大小)
利用该命令也可以查看某目录有多少个文件或有多少个子目录。
10.6.1 统计/opt下文件数:【ls -l /opt | grep "^-" | wc -l】 (其中"^-"正则表达式,表示过滤以-开头的内容)
10.6.2 统计/opt下目录数:【ls -l /opt | grep "^d" | wc -l】
10.6.3 统计/opt下文件数(包括子目录):【ls -lR /opt | grep "^-" | wc -l】 (参数R-递归查询子目录)
10.6.4 统计/opt下目录数(包括子目录):【ls -lR /opt | grep "^d" | wc -l】
10.6.5 以树状来显示目录结构:tree 目录 (tree是外部命令,得用yum install tree来安装才行)
十一、网络配置
11.1 linux网络连接方式与虚拟网卡对应关系:VMnet1对应linux的仅主机模式,VMnet8对应linux的NAT模式。
11.2 查看并配置网络接口:ifconfig [选项] (可用来查看linux的IP)
11.3 测试网络是否畅通:ping 网址 (如果从linux虚拟机 ping windows主机不通有可能是因为windows的防火墙开着呢)
11.4 固定IP (先用ifconfig查看IP,假设为192.168.126.130,现要改为固定IP为192.168.126.188)
11.4.1 编辑网络配置文件/etc/sysconfig/network-scripts/ifcfg-ens33
11.4.1.1 取消DHCP自动分配IP服务,改为静态分配 (BOOTPROTO="dhcp" => BOOTPROTO="static")
11.4.1.2 增加固定IP (IPADDR=192.168.126.188)
11.4.1.3 增加掩码 (NETMASK=255.255.255.0)
11.4.1.4 增加网关 (GATEWAY=192.168.126.2,与VMnet8中的配置一样)
11.4.1.5 增加DNS域名解析(首选为1) (DNS1=192.168.126.2)
11.4.1.6 生效
11.4.1.6.1 即时生效 service network restart (不用重启)
11.4.1.6.2 重启生效 reboot
11.5 查看主机名:hostname (linux的主机名为lhw)
11.6 修改主机名:/etc/hostname (重启生效)
11.7 关联主机名与IP
11.7.1 windows中关联文件:c:\Windows\System32\drivers\etc\hosts (增加linux的主机名与IP对应关系:192.168.126.188 lhw)
这时在windows的dos窗口中ping linux的命令为:ping lhw,实际上是ping 192.168.126.188
11.7.2 linux中关联文件:/etc/hosts (增加windows主机名与IP对应关系:192.168.126.1 lag,lag是windows主机名,ip是VMnet8IP)
这时在linux终端中ping windows命令为:ping lag,实际上是ping 192.168.126.1
十二、进程管理
12.1 进程含义:程序运行后会加载到内存中,这就是进程。进程名以d结尾表示这是守护进程,即后台进程(daemon)。
12.2 查看进程:
12.2.1 ps -ef (e-显示所有进程,f-全格式,ps-process status)
12.2.2 ps -aux (a-显示所有进程,u-以用户格式显示,x-显示后台进程运行参数)
12.2.3 进程显示内容
USER - 用户名称
UID - 用户ID
PID - 进程ID
PPID - 进程的父进程ID
C - CPU用来计算执行优先级的因子
%CPU - 占CPU百分比
%MEM - 占内存百分比
VSZ - 占虚拟内存大小(单位字节)
RSS - 占物理内存大小(单位字节)
TTY - 终端名称
STAT - 进程状态(S-睡眠,R-运行中,Z-僵尸进程)
START - 进程启动时间
STIME - 进程启动时间
TIME - 进程占用CPU时间
COMMAND - 进程启动所需的命令与参数
12.3 目录树显示进程:pstree [选项] (p-显示进程的PID,u-显示进程所属用户)
12.4 杀死进程
12.4.1 kill [-9] 进程ID (-9强制杀死进程,该命令不会杀死该进程的子进程)
12.4.2 killall 进程名 (杀死该进程及其所有子进程)
十三、服务管理
13.1 服务含义:服务本质就是进程,运行在后台,通常监听某个端口,等待客户端请求(如mysqld、sshd、防火墙),因此又称为守护进程。
13.2 服务命令:systemctl [选项] 服务名 (start-启动,stop-停止,restart-重启,status-状态)
如:systemctl restart network.service (重新启动linux的网络服务)
systemctl能管理的服务在/usr/lib/systemd/system目录下
13.3 自启动服务:
13.3.1 查看所有服务自启动状态:systemctl list-unit-files
如:systemctl list_unit-files | grep firewalld.service (查看防火墙是否自启动)
13.3.2 设置服务自启动:systemctl enable 服务名
13.3.3 关闭服务自启动:systemctl disable 服务名
13.3.4 查看某服务是否自启动:systemctl is-enabled 服务名
[注]以上自启动都是针对3与5这2个级别的,其他级别也没啥用。
13.4 举例:
查看当前防火墙状态,关闭防火墙,再重启防火墙。
13.4.1 systemctl status firewalld
13.4.2 systemctl stop firewalld
13.4.3 systemctl start firewalld
13.5 打开或关闭端口
13.5.1 打开端口:firewall-cmd --permanent --add-port=端口号/协议
13.5.2 关闭端口:firewall-cmd --permanent --remove-port=端口号/协议
13.5.3 重新载入:firewall-cmd --reload
13.5.4 查询端口:firewall-cmd --query-port=端口号/协议
十四、动态监控进程
14.1 top [选项] (d-刷新秒数默认3秒,i-不显示闲置或僵尸进程,p-指定某进程ID并对其进行监控)
14.1.1 交互操作
14.1.1.1 P (根据CPU使用率排序)
14.1.1.2 M (根据内存使用率排序)
14.1.1.3 N (根据PID排序)
14.1.1.4 u (仅显示某用户进程,输入u,然后再输入用户名。取消则输入u,再输入空格)
14.1.1.5 k (杀死进程,输入PID,然后输入参数9,强制杀死进程)
14.1.1.6 q (退出)
十五、监控网络情况
15.1 netstat [-anp] (an-按一定顺序排列,p-显示PID。anp-一个苹果)
十六、软件包管理
16.1 RPM:RedHat Package Manager的缩写,类似Windows中的setup.exe。
16.1.1 查询指定包:rpm -q 软件包名 (rpm -qa | grep 软件包)
如:rpm -q firefox (firefox-60.2.2-1.el7.centos.x86_64)
名称:firefox
版本:60.2.2
系统:1.el7.centos.x86_64 (1-发布次数,e17.centos-linux平台[这里指RHel7与centOS],x86_64硬件平台64位系统[i686、i386表示32位,noarch表示通用])
16.1.2 查询包详细信息:rpm -qi 软件包名
16.1.3 查询包中文件:rpm -ql 软件包名
16.1.4 查询某文件归属于哪个包:rpm -qf 文件
16.1.5 安装包:rpm -ivh 带路径的软件包全名 (i-install,v-verbose提示,h-hash进度条,记不住就记hiv-艾滋病,U-升级)
16.1.5 依赖性:有些包需要先安装依赖的包或某些依赖的文件,如安装httpd时需要/etc/mime.types,我们不知道该文件在哪个包里,可以到www.rpmfind.net网站查。
16.1.6 卸载包:rpm -e [--nodeps] 软件包 (e-erase,nodeps-强制删除,不考虑是否有依赖关系,就是卸啊)
16.1.7 包名与包全名的区别:未安装前要使用带路径的全包名,安装后可以使用简略的包名了。
16.2 YUM:Yellow dog Updater,Modified的缩写,yum是在网上的yum应用商店里下载软件。
16.2.1 网络地址配置文件:/etc/yum.repos.d/目录下 (repository-仓库)
内容:以CentOS-Base.repo为例
[base] (容器名称)
name=CentOS-$releasever - Base (容器说明)
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os&infra=$infra (镜像站点)
#baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/ (yum服务器源地址,与镜像网站二选一即可)
gpgcheck=1 (1-RPM数字证书生效,0-RPM数字证书不生效)
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 (数字证书公钥文件保存地址,不用动)
enabled=1 (0-该容器不生效,其他-生效)
光盘yum源:
将/etc/yum.repos.d/下的所有文件的扩展名都改名或将他们移动到备份目录下,只保留CentOS-Media.repo。修改其内容
将baseurl改为本地光盘挂载目录,其他2个地址注释掉,同时将enabled=0改为1。
16.2.1 查询包:yum list/search 软件包
16.2.2 安装包:yum [-y] install 软件包
16.2.3 卸载包:yum [-y] remove 软件包 (yum卸载时会将相关依赖包都卸载,而这些依赖包可能有别的程序要使用,这有可能导致系统崩溃出问题)
十七、shell
17.1 shell定义:命令行解释器。
17.2 编写shell:
17.2.1 以#!/bin/bash开头
举例:vim hello.sh,内容如下
#!/bin/bash
echo "hello,world!"
17.2.2 执行方式
17.2.2.1 sh ./hello.sh
17.2.2.2 ./hello.sh (该文件有可执行权限,一定要带路径)
17.2.3 变量
17.2.3.1 系统变量:$HOME $PWD $SHELL $USER等,可用set来显示shell中的所有变量。
17.2.3.2 自定义变量:
17.2.3.2.1 定义变量:变量名=值 (不能有空格)
17.2.3.2.2 撤销变量:unset 变量名
17.2.3.2.3 静态变量:readonly 变量名(不能unset)
17.2.4 将命令的返回值赋给变量
如:a=`date` 等价于 a=$(date) (反引号表示先运行里面的命令,并把结果返回给变量)
17.2.5 环境变量
17.2.5.1 export 变量名=变量值 (将shell变量输出为环境变量即全局变量)
17.2.5.2 source 配置文件 (让修改后的配置文件马上生效)
17.2.5.3 echo $变量名 (查询环境变量值)
17.2.5.4 举例:
17.2.5.4.1 在配置文件/etc/profile中增加环境变量,内容:export LAG_HOME=/home/lag
17.2.5.4.2 source /etc/profils (让刚才新增加的变量马上生效)
17.2.5.4.3 echo $LAG_HOME
17.2.6 位置参数变量 (./my.sh 100 200 这里的100与200就是位置参数变量)
17.2.6.1 基本语法:
17.2.6.1.1 $n (n为数字,$0命令本身,$1-$9为前9个参数,10以上用${10},${11}...)
17.2.6.1.2 $* (代表所有参数,$*把所有参数当做一个整体,类似字符串)
17.2.6.1.3 $@ (代表所有参数,$@把每个参数分别对待,类似数组)
17.2.6.1.4 $# (代表所有参数的个数)
17.2.7 预定义变量
17.2.7.1 $$ (当前进程的进程号(PID))
17.2.7.2 $! (后台运行的最后一个进程的进程号(PID))
17.2.7.3 $? (最后一次执行命令的返回状态,0-正确执行)
17.2.8 运算符
17.2.8.1 语法:$((运算式)) 或 $[运算式] 或 expr m + n (用(())它里面的内容的语法类似C语言,如> >= == <= !=,但有些特殊表达式用不了)
17.2.8.2 使用expr表达式的符号:+ - \* / % (加、减、乘、除、取余)
17.2.8.3 举例:计算(2+3)*4的值:echo "(2+3)*4=$[(2+3)*4]" (这种方式空格无所谓)
17.2.9 条件判断
17.2.9.1 语法:[ 条件 ] (注:条件的前后必须有空格),返回:非空-true,也可使用$?验证0-true,>1-false
17.2.9.2 判断:
17.2.9.2.1 两个字符串比较:= ([ "ok" = "ok" ]注意一定要有空格啊)
17.2.9.2.2 两个整数比较:
17.2.9.2.2.1 小于 -lt (lt-less than,[ 23 -lt 33 ])
17.2.9.2.2.2 小于等于 -le (le-less equal])
17.2.9.2.2.3 等于 -eq (eq-equal,[ 34 -eq 34 ])
17.2.9.2.2.4 大于 -gt (gt-great than)
17.2.9.2.2.5 大于等于 -ge (ge-great equal)
17.2.9.2.2.1 不等于 -ne (ne-not equal)
17.2.9.2.3 文件权限判断:
17.2.9.2.3.1 -r 有读的权限
17.2.9.2.3.2 -w 有写的权限
17.2.9.2.3.3 -x 有执行的权限
17.2.9.2.4 文件类型判断:
17.2.9.2.4.1 -f 文件存在,且是常规文件 (if [ -f /root/test.txt ])
17.2.9.2.4.2 -e 文件存在
17.2.9.2.4.3 -d 文件存在,且是目录
17.2.10 if语句:
if [ 条件判断式 ] 或 if ((条件判断式))
then
代码
elif [ 条件判断式 ]
then
代码
else
代码
fi
17.2.11 case语句:
case $变量名 in
"值1")
代码
;;
"值2")
代码
;;
*)
其他代码
;;
esac
17.2.12 for语句:
17.2.12.1 语法1:
for 变量 in 值1 值2 值3 ...
do
代码
done
17.2.12.2 语法2:
for((初始值;循环条件;变量变化)) 【空格不重要,因为用了(()),因此里面语法类似C语言】
do
代码
done
举例:1加到100
SUM=0
for((i=1;i<=100;i++))
do
SUM=$((SUM+i))
# SUM=$[$SUM+$i]
done
echo "1加到100等于$SUM"
17.2.13 while语句:
while((条件))
do
代码
done
17.2.14 控制台输入:
read 选项 变量 (p-读取时的提示,t-等待时间)
举例:
read -p "请输入年龄:" AGE
echo $AGE
17.2.15 函数:
17.2.15.1 系统函数:
17.2.15.1.1 basename [路径名] [后缀] (返回完整路径最后/部分,常用于获取文件名。若带有后缀参数则返回不带后缀的文件名)
如:basename /root/test/aaa.txt => aaa.txt
17.2.15.1.2 dirname [路径名] (返回完整路径最后/的前面部分,常用于获取路径部分。)
如:dirname /root/test/aaa.txt => /root/test
17.2.15.2 自定义函数:
17.2.15.2.1 语法:
# 函数定义时没有形参与实参的概念,默认用 $* $@ $1 $2 ...来得到参数
# 返回值取值范围0~255,0-成功。可以用个$?得到该值,因此一般情况下都不需要有返回值。
# 可以用一个变量来接收想要返回的值,在调用该函数后将其显示出来即可实现返回值的功能。
# 调用该函数时也没有括号,有参数则用空格隔开
[function] 函数名[()]
{
代码
[return 0]
}
【注】[]内是可以省略不写的,但不建议省略。
17.2.15.2.2 举例:
# 函数定义
function getSum()
{
SUM=$(($1+$2))
}
# 调用函数
read -p "请输入第一个数值:" VAL1
read -p "请输入第二个数值:" VAL2
getSum $VAL1 $VAL2
echo "相加结果等于:%SUM"
十八、日志管理
18.1:日志文件位置:/var/log/目录下
18.2:重要的日志:
18.2.1 boot.log: 系统启动日志
18.2.3 cron: 定时任务日志
18.2.4 lastlog: 记录所有用户最后一次登录时间(该文件内容为二进制,得用命令lastlog查看内容)
18.2.5 maillog: 邮件信息日志
18.2.6 message: 系统重要信息日志,如果系统出现问题首先就要检查该日志。
18.2.7 secure: 验证与授权信息日志,只要涉及到账号与密码都记录到此日志中。
18.3:日志服务:
18.3.1 服务名:rsyslogd
18.3.2 服务配置文件:/etc/rsyslog.conf (该文件配置了哪些动作记录到哪个日志文件中)
18.3.2.1 配置文件格式 *.* 存放日志文件(mail.* -/var/log/maillog)
18.3.2.1.1 第一个*含义:日志类型
18.3.2.1.1.1 auth pam产生的日志
18.3.2.1.1.2 authpriv ssh、ftp登录信息的验证信息产生的日志
18.3.2.1.1.3 cron 定时任务产生的日志
18.3.2.1.1.4 kern 内核产生的日志
18.3.2.1.1.5 lpr 打印产生的日志
18.3.2.1.1.6 mail 邮件产生的日志
18.3.2.1.1.7 user 用户程序产生的日志
18.3.2.1.1.8 local 1-7 自定义的日志设备
18.3.2.1.2 第二个*含义:日志级别
18.3.2.1.2.1 debug 调试
18.3.2.1.2.2 info 信息
18.3.2.1.2.3 notice 最具有重要性的普通条件信息
18.3.2.1.2.4 warning 警告
18.3.2.1.2.5 err 错误
18.3.2.1.2.6 crit 严重
18.3.2.1.2.7 alert 需要立刻修改
18.3.2.1.2.8 emerg 内核崩溃
18.3.2.1.2.9 none 什么都不记录
18.3.3 日志文件格式:
事件产生时间 产生事件服务器主机名 产生事件的服务名或程序名 事件具体信息
18.3.4 举例:将ssh登录信息记录到日志/var/log/myssh.log中
18.3.4.1:编辑/etc/rsyslog.conf,增加一下内容
authpriv.* /var/log/myssh.log
18.3.4.2:重启linux,登录,查看/var/log/myssh.log
18.4 日志轮替:
18.4.1 日志轮替文件命名:
18.4.1.1 日志轮替配置文件(/etc/logrotate.conf)中参数为dateext,则以日期作为日志文件扩展名。
18.4.1.2 若无dateext参数则以xxx.n(n>0)的方式来轮替日志。
18.4.2 日志轮替配置文件:
18.4.2.1 配置文件内容(/etc/logrotate.conf)
18.4.2.1.1 daily 每天对日志进行一次轮替
18.4.2.1.2 weekly 每周对日志进行一次轮替
18.4.2.1.3 monthly 每月对日志进行一次轮替
18.4.2.1.4 rotate n 保存n份日志文件,超过n时删除旧的
18.4.2.1.5 create 日志轮替后创建新的空日志文件
18.4.2.1.6 dateext 以日期作为日志轮替文件扩展名
18.4.2.1.7 size 4M 日志大于4M才轮替
18.4.2.1.8 compress 日志文件是否压缩
18.4.2.1.9 单独为某个日志配置
18.4.2.1.9.1 直接写入到配置文件/etc/logrotate.conf
/var/log/myssh.log{
monthly
minsize 10M
rotat 2
}
18.4.2.1.9.2 将某个单独的日志配置文件放到/etc/logrotate.d目录中
18.5 日志轮替机制:
在/etc/cron.daily/目录下有个logrotate的shell,cron定时任务会每天都执行一次这个shell来完成日志轮替工作。
18.6 查看内存日志:journalctl