Linux
1.Vi和Vim的介绍
- 所有的Linux系统都会内建vi文本编辑器。
- vim具有程序编辑的能力,可以看做事vi的增强版本,可以主动的以字体颜色辨别语法的正确性,方便程序设计。代码补全等。
2.Vi和Vim三种常见模式
-
正常模式
-
插入模式/编辑模式
-
命令行模式
-
相互转换图:
3.Vim的实际操作
- 拷贝当前一行,在正常模式下输入(n代表拷贝当前行下的n行)yy,并粘粘。
- 删除当前行 (n同上)dd,删除当前行下的n行 =>
ndd。 - 在文件中查找某个单词 => 在命令行下 输入
/关键字,输入n就是查找下一个查询的结果。 - 设置文件的行号,取消文件的行号 => 命令行下 输入
:set nu设置行号,set nonu取消行号。 - 编辑 /etc/profile 文件,使用快捷见到文档的最末行[G]和最首行[gg],这些都是在正常模式下进行的。
- 在正常模式下输入
u,可撤销刚刚输入的内容。 - 正常模式下输入对应行号的数字,加上
shift + g即可跳转到该行。
4.Linux常见命令
-
shutdown:shutdown -h now:表示立即关机。shutdown -h 1: 表示1分钟后关机。shutdown -r now: 立即重启。
-
halt:- 直接使用,等价于关机。
-
reboot:- 重启系统。
-
sync:- 把内存数据同步到磁盘
-
细节:关机或重启时,都应该执行一下sync指令,将数据同步到磁盘。
Linux实操篇
用户管理
-
基本介绍:
-
添加一个用户:
useradd lc:添加用户lc到 /home/*下面。useradd -d /home/qq lc:添加用户lc到home/qq/*目录下面。useradd -g 用户组 用户名:增加一个用户,将其添加到组里面去。
-
给用户指定或者修改密码:
passwd username: -
删除用户:
userdel username:删除用户保存目录userdel -r username:删除用户以及对应的主目录: 查询用户:id username=>返回 uid=1001(xm) gid=1001(xm) 组=1001(xm) (当用户不存在时,返回’无此用户‘).
-
切换用户:
su username.- 从权限高的用户切换到权限低的用户,不需要输入密码,反之则需要。
- 当需要返回到原来用户时,使用
exit指令。
用户组
-
类似与角色,系统可以对有共性的多个用户进行统一的管理。
-
groupadd groupname:添加组 -
groupdel groupname:删除组 -
usermod -g 用户组 用户名:将用户修改到对应组。 -
useradd -g 用户组 用户名:将用户添加到对应组。 -
groups:查看当前所属组 -
cat /etc/passwd:查看所有的用户信息 -
cat /etc/group:查看所有组信息 -
用户与组的相关文件:
-
用户配置文件(用户信息): /etc/passwd.
- 用户的配置文件,记录用户的各种信息。
- 每行的含义: 用户名 密码 用户标识号 组标识号 注释性描述 主目录 登录shell。
-
组配置文件(组信息): /etc/shadow.
- 口令的配置文件。
- 每行的含义: 登录名 加密口令 最后一次修改时间 最小时间间隔 最大时间间隔 警告时间 不活动时间 失效时间 标志
-
口令配置文件(密码和登录信息): /etc/group.
- 每组的配置文件,记录Linux包含的组的信息。
- 每行含义:组名 组标识号 组内用户列表.
-
实用指令
-
linux系统运行级别的示意图:
-
-
切换到指定运行级别的指令:
init number:切换到对应级别 -
帮助类指令:
- 当对某个指令不熟悉时,可以使用Linux提供的指令的使用方法。
man ls:显示ls指令帮助语句。help cd:改变shell的工作目录。- 建议: 之间百度搜索。
-
文件目录类指令:
-
pwd:显示当前工作目录的绝对路径。 -
ls指令-
基本语法:
ls[选项] [目录或是文件]。 -
常用选项:
-a:表示当前目录所有的文件和目录,包括隐藏的。-l:一列表的方式显示信息。
-
应用实例:
- 查看当前目录的所有内容信息。
-
-
相对路径与绝对路径: 开头有
/表示绝对目录(以根目录为起始点),否则代表相对目录,表示当前目录下。 -
mkdir指令mkdir [选项] 要创建的目录.-p:创建多级目录.mkdir -p /animal/tiger
-
rmdir指令rmdir[选项] 要删除的空目录.只能删除空目录.rm -rf /home/dog:可删除非空的目录.
-
touch指令touch 文件名:创建空文件。rm file:删除文件加上-f代表强制。
-
cat filename:查看文件 。 -
more filename:分页查看文件。 -
less filename: 懒加载文件内容。 -
head filename or tail filename:查看首位位置的文件内容。 -
> and >>:代表覆盖和追加 =>hello.txt > pig.txtor ls -l > pig.txt:将查到的列表数据覆盖到文件pig当中如果没有,则自动创建(touch pig.txt).
-
cp指令:复制文件。cp -r /home /root/:将home目录下的文件拷贝到root目录下. -
history指令:查看历史指令 后面加上 数字 代表显示多少个。输入
!number表示执行第number个指令。 -
date指令:date显示日期date "+%Y %m %d"只显示年月日date "+%Y年%m月%d日 %H:%M:%S"只显示年月日 时分秒
-
-
解压与压缩命令:
-
gzip filename or unzip filename:压缩与解压文件。 -
tar 指令:tar -zcvf a.tar.gz dog(file1) tom(file2):解压当前目录的两个文件为a.tar.gz。tar -zcvf a.tar.gz /home:将home目录下的文件解压为a.tar.gz.tar -zxvf a.tar.gz -C(表示更换目录) /opt/:将a.tar.gz解压到opt目录下(该目录需要存在,否则报错).
-
组管理和权限管理(重难点)
-
修改文件所有者
chown -R 用户名 文件名。
-
修改文件所在组
chgrp 组名 文件名。
-
修改用户所在组
usermod -g 组名 用户名usermod -d 目录名 用户名:改变用户登录的初始目录。
-
Linux下文件的类型
-
-rwxrw-r-- 1 root root 1213 Feb 2 09:39 abcw:写操作,可读取,ls查看内容(作用到目录)r:读操作,可以修改,目录内创建+删除+重命名目录(作用于目录),可以修改,不可以删除(作用到文件,删除前提是拥有写操作x)x:可执行,可以进入该目录(作用到目录)
-
第0位:
-:普通文件d:目录l:软连接c:字符设备【键盘,鼠标】b:块文件,硬盘
-
1~3:该文件的所有者拥有该文件的权限 -User
-
4~6:同用户组的用户拥有的权限 -Group
-
7~9:确定其他用户拥有该文件的权限 -Other
-
-
修改文件或目录的权限(u:所有者 g:所以组 o:其他人 a:所有人(u g o 总和))
-
通过
+ - =变更权限chmod u=rwx,g=rx,o=x 文件目录名chmod o+w 文件目录名chmod a-x 文件目录名
-
通过数字变更权
- 规则:r=4, w=2 x=1 rwx=4+2+1=7
chmod u=rwx,g=rx,o=x 文件目录名等于chmod 751 文件目录名
-
任务调度
-
任务调度是指系统在某个时间执行的特定的命令或程序。
-
分类:1.系统工作,如病毒扫描。2.个别用户工作,个别用户可能希望执行某些程序,比如对mysql数据库的备份。
-
基本语法:
crontab -ecron -e*/1 * * * * ls -l /etc >> /tmp/to.txt- save and exit
- automatically excute the order per minutes.
-
参数细节说明
- 第一个*:一天当中的第几分钟。
- 第二:一天当中的第几小时。
- 三:一个月当中的第几天。
- 四:一年当中的第几月。
- 五:一周当中的星期几。
-
特殊符号的说明:
*:代表任何事件,如第一个*代表一个小时中的每分钟都执行的意思。,:代表不连续的事件。如0 8,12,16 * * *代表在每天8,12,16点整执行一次命令。-:代表连续的时间,如0 5 * * 1-6:代表周一到周六的凌晨5点整执行命令。*/n:代表每隔多久执行一次,比如*/10 * * * *表示每隔10分钟执行一次。
磁盘分区与挂载
-
mbr分区:
- 最多支持四个主分区
- 系统只能安装在主分区
- 拓展分区要占一个主分区
- MBR最大只支持2TB,但拥有最好的兼容性。
-
gtp分区:
- 支持无限多个主分区(但操作系统可能限制,比如windows下最多128个分区)。
- 最大支持18EB的大容量(1EB = 1024PB 1PB = 1024TB)
- windows7 64位以后支持gtp
-
Linux分区:
- Linux中万物皆文件,无论有几个分区,分给哪一目录使用,归根结底只有一个更目录,一个独立且唯一的文件结构,Linux中每个分区都是用来组成整个文件系统的一部分。
- Linux中采用一种叫"载入"的处理方法,他的整个文件系统中包含了一整套的文件和目录,且将一个分区和一个目录联系起来,这时要载入的一个分区将使它的存储空间在一个目录下获取。
-
增加一个硬盘:
-
虚拟机添加硬盘。
-
分区
fdisk /dev/sdb -
格式化
mkfs -r ext4 /dev/sdb1 -
挂载 先创建一个 /home/newdisk , 挂载
mount /dev/sdb1 /home/newdisk卸载umount /dev/sdb1 -
设置可以自动挂载(重启后也可以生效)
vim /etc/fstab- 编辑一行
/dev/sdb1 /home/newdisk ext4 default 0 0
-
-
查询系统整体磁盘使用情况:
df -h(-s指定目录占用大小 -h 带计量单位 -a 含文件 -max-depth=1 子目录深度) -c 列出明细的同时,增加汇总值- 统计/home文件夹下文件的个数:
ls -l /home | grep "^-" | wc -l - 统计/home文件夹下目录的个数:
ls -l /home | grep "^d" | wc -l - 统计/home文件夹下(包括子文件夹)文件的个数:
ls -lR /home | grep "^-" | wc -l(注意R要大写) - 统计/home文件夹下(包括子文件夹)目录的个数:
ls -lR /home | grep "^-" | wc -l(注意R要大写)
-
安装指令:
yum install tree:安装tree指令
网络配置
-
NAT模式(网络环境):
-
Linux网络环境配置:
- 自动获取
- 指定固定的ip(修改文件) 编辑
vi /etc/sysconfig/network-scripts/ifcfg-eth0修改网关,ip,静态,Browse-only=Yes.
进程管理
-
在LINUX中,每个执行的程序(代码)都称为一个进程。每一个进程都分配一个ID号。
-
每一个进程,都会对于一个父进程,而这个父进程可以复制多个子进程,例如www服务器。
-
进程分为前台和后台。
-
系统服务以后台一般,且常驻,直到关机。
-
显示系统执行的进程
ps -a:显示当前终端的所有进程信息。ps -u:以用户的格式显示进程信息。ps -x:显示后台进程运行的参数。
-
终止进程kill和killall
kill [选项] 进程号:通过进程号杀死进程(常用选项-9表示强迫进程立即停止)killall 进程名称
服务管理
-
本质进程,运行在后台,作用监听端口,等待程序请求,又名守护进程
-
[systemctl | service] [start | stop | restart | reload | status] 服务名 -
chkconfig指令可以给各个运行级别设置自启动/关闭systemctl list-unit-files | grep xxxsystemctl 服务名 --listsystemctl --level 5 服务吗 on/off
-
进程监控指令
-
top [选项]-d:秒-i:使top不显示任何闲置或者僵死进程-p:通过指定监控进程ID来仅仅监控某个进程的状态。
-
k=> Pid.终止指定的进程 -
交互操作 :
P:以CPU使用率排序M:以内存等待使用率排序N:以PID排序q:退出
-
-
查看网络情况
netstat-
netstat [选项]-an:按一定顺序排序-p:显示哪个进程在调用netstat -anp | grep sshd:显示sshd相关网络状态
-
-
RPM与YUM管理
-
RPM
rpm -qa | grep tomcat4查看 tomcat4 是否被安装rpm -ql 软件包查询软件包的安装位置rpm -qf 安装包查询文件属于哪个软件包rpm -e 软件包:卸载软件包 加上--nodeps强制删除rpm -i(安装) | -v(提示) | -h(进度条)| ivh 软件包:安装软件包
-
YUM
yum list | grep xx软件列表yum linstall xxx:下载安装
-
Shell编程
-
shell是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用Shell来启动,挂起,停止甚至使编写一些程序。
graph 应用程序-->Shell命令解释器 --> 内核Linux --> 硬件
-
脚本的常用执行方式
-
方式一(输入脚本的绝对路径或相对路径)
- 先创建一个xxx.sh文件,并且赋予其x权限。
- 执行脚本(
./myShell.sh| /root/..../myShell.sh ).
-
方式二(
sh + 脚本) 不用赋予脚本+x权限,直接执行即可。
-
-
Shell的变量的介绍
-
Linux Shell中的变量分为系统变量和用户自定义变量。
-
#系统变量 $HOME,$PWD,$SHELL,$USER echo $HOME #显示当前shell中所有变量: set -
shell变量的定义
-
基本语法
- 定义变量: 变量 = 值
- 撤销变量:unset 变量
- 声明静态变量:readonly变量,注意,不能unset
-
定义变量规则
- 由字母,数字,下划线,不能以数字开头。
- 等号两侧不能有空格。
- 变量名称习惯大写
-
-
将命令的返回值赋给变量(重点)
- A =
ls -la反引号,表示运行里面的命令,并把结果返回给变量A。 A=$(ls -la)等价与反引号。
- A =
-
设置环境变量
export 变量名=变量值:将shell变量输出为环境变量source 配置文件:让修改后的配置信息立即生效echo $变量名:查询环境变量的值-
#单行注释 :<<!多行注释!
-
位置参数变量
-
编写一个shell脚本postionPara.sh,在脚本中获取到命令行的各个参数信息。
-
基本语法
#n为数字,$0代表命令本身,$1~9代表第一到第九个参数,十以上的参数使用${n} $n #代表命令行所有参数 $* #也代表命令行所有参数,不过$@把每个参数区分对待 $@ #代表命令行所有参数的个数 $#
-
-
预定义变量
- 在shell脚本中已经定义好的变量,可以直接使用
-
$$ #显示当前进程的进程好(PID) $! #后台运行的最后一个进程的进程号(PID) $? #最后一次执行的命令的返回状态,如果这个变量的值为0,证明正确执行,否则不正确
-
-
运算符
-
1. $((运算式)) $[运算式] 2. expr m + n 运算符之间要有空格 3. expr m - n 4. expr *,/,% 乘法符号带斜杠表示转义 -
#!/bin/bash RESULT1=$(((3+4)*5)) RESULT2=$[(3+4)*5] RESULT3=expr 3 + 4 RESULT4=expr $RESULT3 /* 5 #计算两个数之和 SUM=$[$1+$2] echo "sum=$SUM"
-
-
条件判断
-
[ condition ]:注意前后要有空格。 -
[ shuaijing ] 返回true [] 返回false [ condition ] && echo OK || ECHO notok 条件满足,执行后面的语句 -
常用判断条件
#!/bin/bash 1.两个整数的比较 2.按照文件权限进行判断 = 字符串比较 -r 有读的权限 -lt 小于 -w 有写的权限 -le 大于等于 -x 有执行的权限 -eq 等于 3.按照文件类型进行判断 -gt 大于 -f 文件存在并且是一个常规的文件 -ge 大于等于 -e 文件存在 -ne 不等于 -d 文件存在并且是一个目录
-
-
流程控制
-
#!/bin/bash if [ 条件判断式 ]; then 程序 fi #或者 if [ 条件判断式 ] then 程序 elif [ 条件判断式 ] then 程序 fi # 编写一个shell程序,>=60,输出及格了,否则输出不及格 if [ $1 -ge 60 ] then echo "及格了" else echo "不及格" -
#!/bin/bash case $变量名 in case $1 in "1") echo "周一" ;; "2") echo "周二" ;; *) echo "ohter" ;; esac -
#基础语法1 for 变量 in 值1 值2 值3.... do 程序 done #基础语法2 for((初始值;循环控制条件;变量变化)) do 程序 done #!/bin/bash # 打印命令行输入的参数 for var in $* do echo "the number is $i" done # 打印从1到100的值输出显示 SUM=0 for ((i=1;i<=100;i++)) do SUM=$[$SUM+$i] done echo "sum=$SUM" -
#while循环 while[ 条件表达式 ](左右两边要有空格) do 程序 done #打印从1到n的值输出 #!/bin/bash SUM=0 i=0 while [ $i -le $1 ] do SUM=$[$SUM+$i] i=$[$i+1] done echo "sum=$SUM" -
read读取控制台输入
# read [选项][参数] 选项 -p:指定读取时的提示符 -t:指定读取值时等待的时间(秒)如果没有在指定时间输入,则不再等待 #!/bin/bash #读取控制台输入一个num值 #read -p "请输入一个数num" NUM1 #读取控制台输入一个num值,在10秒内输入 read -t 10 -p "请输入一个数num2=" NUM2 echo "你输入的值时num2=$NUM2"
-
-
函数
-
系统函数
-
basename [pathname][suffix] -
basename [string][suffix] -
返回
/home/aaa/test.txt的"test.txt"部分#basename /home/aaa/text.txt #输出 text.txt #basename /home/aaa/text.txt .txt #输出 text 无后缀 -
dirname-
返回完整路径最后
/的前面的部分,常用于返回路径部分 -
dirname 文件绝对uilu
-
返回
/home/aaa/test.txt的/home/aaadirname /home/aaa/test.txt
-
-
-
自定义函数
-
#基本语法 [function] funname[()] { Action; [return int;] } 调用直接写函数名:funname #计算输入两个参数的和 getSum #!/bin/bash function getSum() { SUM=$[$n1+$n2] echo "和是=$SUM" } read -p "请输入第一个数n1" n1 read -p "请输入第二个数n2" n2 #调用getSum getSum $n1 $n2
-
-
-
综合案例
- 每天凌晨2:10备份数据库db
- 备份开始和结束能够给出相应等待提示信息
- 备份后的文件要求以备份时间为文件名,并打包成.tar.gz的形式,比如
2021-10-15_xxxx.tar.gz - 在备份的同时,检查是否有10天前备份的数据库文件,如果有就将其删除
#!/bin/bash #完成数据库的定时备份 #备份的路径 BACKUP=/data/backup/db #当前的时间作为文件名 DATETIME=$(date +%Y_%m_%d_%H%M%S) echo "=================开始备份=================" echo "=================备份的路径是 $BACKUP/$DATETIME.tar/gz" #主机 HOST=localhost #用户名 DB_USER=root #密码 DB_PWD=root #备份数据库名 DATABASE=mysql #创建备份的路径 if [ ! -d "$BACKUP/$DATETIME" ] then mkdir -p "$BACKUP/$DATETIME fi #执行mysql的备份数据库的指令 mysqldump -u${DB_USER} -p${DB_PWD} --host=$HOST $DATABASE | gzip > $BACKUP/$DATETIME/$DATETIME.sql.gz #打包备份文件 cd $BACKUP tar -zcvf $DATETIME.tar.gz $DATETIME #删除临时目录 rm -rf $BACKUP/$DATETIME #删除10天前的备份文件 find $BACKUP -mtime +10 -name "*.tar.gz" -exec rm -rf {} ; echo "===============备份成功===============" -
crontab -e10 2 * * * /usr/sbin/mysql_db_backup.sh