Linux基础

目录结构

树状目录结构,最上层是根目录/

  • /bin,binary,存放常用命令
  • /sbin,super user binary,存放管理员使用的管理程序
  • /home,存放普通用户主目录
  • /root,系统管理员的主目录
  • /lib,存放动态链接库
  • /etc,存放配置文件
  • /proc,系统内存映射,数字命名的都是一个进程
  • /sys,系统内核的驱动结构
  • /srv,service,存放服务启动后需要提取的信息
  • /tmp,存放临时文件
  • /dev,管理设备
  • /mnt,用于临时挂载文件
  • /opt,额外安装软件
  • /usr/local,安装软件,一般以编译源码方式安装
  • /var,存放不断扩充的东西,包括日志
  • /selinux,安全子系统

基本操作

vim

分为一般模式(默认),插入模式,命令行模式

  • 在一般模式通过i等进入插入模式
  • 在插入模式按Esc退出插入模式,进入一般模式
  • 在一般模式输入:或/进入命令行模式

常用快捷键:

  • yy,拷贝当前行,5yy拷贝当前行向下的五行
  • p,粘贴
  • dd,删除当前行
  • gg,定位到最首行
  • G,定位到最末行

常用命令:

  • :wq,保存并退出,:wp!,强制保存退出
  • :q,退出
  • 查找:/进入命令行模式后直接输入要查找的关键词,输入n查找下一个,N查找上一个
  • set nu,设置行号
  • set nonu,取消行号

关机&重启

  • sync,同步内存中的数据到磁盘,关机或重启前要做的
  • shutdown -h now,立即关机
  • shutdown -r now,立即重启
  • shutdown -h 1,1分钟后关机
  • halt,关机
  • reboot,重启

找回root密码

  1. 进入Linux,按e
  2. 再linux16开头的行,行尾输入init=bin/sh
  3. 按Ctrl+X进入运行级别1(单用户模式)
  4. 输入mount -o remount,rw /,回车
  5. 输入passwd,回车
  6. 修改密码
  7. 输入touch /.autorelabel,回车
  8. 输入exec /sbin/init,回车,然后系统自动重启

用户管理

用户

添加用户后会自动生成对应的家目录

  • useradd 用户名,添加用户
  • useradd -d 主目录 用户名,添加用户并指定主目录
  • useradd -g 用户组 用户名,添加用户并指定用户组
  • usermod -g 用户组 用户名,修改用户所在组
  • usermod -d 主目录 用户名,修改用户的主目录
  • passwd 用户名,设置密码
  • userdel 用户名,删除用户
  • userdel -r 用户名,删除用户及其主目录
  • id 用户名,查询用户信息
  • su - 用户名,切换用户
  • logout/eixt,回到原来的用户,logout在运行级别3下有效
  • whoami,查看当前用户

用户组

  • groupadd 组名:添加组
  • groupmod -g 用户组 用户名:修改用户的用户组
  • groupdel 组名:删除组

相关配置文件

  • /etc/passwd文件,用户的配置文件,每行:用户名:口令:用户id:组id:描述:主目录:登录 Shell
  • /etc/group文件,用户组的配置文件,每行:组名:口令:组id:组内用户列表
  • /etc/shadow文件,口令配置文件,每行:登录名:加密口令:最后一次修改时间:最小时间间隔:最大时间间隔:警告时间:不活动时间:失效时间:标志

运行级别

  • 0:关机
  • 1:单用户,可以找回密码
  • 2:多用户,没有网络服务
  • 3:多用户,有网络服务
  • 4:系统未使用,保留给用户
  • 5:图形界面
  • 6:重启

切换运行级别:

  • init 运行级别,运行级别为数字

  • systemctl isolate <target>

  • multi-user.target:运行级别3

  • graphical.target:运行级别5

  • systemctl get-default,查看默认运行级别

  • systemctl set-default TARGET.target,设置默认运行级别,比如multi-user.target

常用命令

  • man [选项] 命令或函数等:手册
    • 1:用户命令
    • 2:系统调用
    • 3:C库函数
    • 4:设备和特殊文件
    • 5:文件格式和约定
    • 6:游戏和演示
    • 7:杂项
    • 8:系统管理命令

文件相关

  • ls [选项] [目录或文件]:显示文件
    • -a:显示所有,包括隐藏文件
    • -l:以列表方式显示
    • -lh:以人类理解的方式显示文件大小
    • -li:查看inode号
  • cd 目录:切换工作目录
    • 可以是相对目录或绝对目录,~家目录,..上一级目录
  • mkdir [选项] 目录:创建目录
    • -p创建多级目录
  • rmdir [选项] 目录:删除空目录
    • 删除非空目录用rm -rf 目录
  • touch 文件名:创建空文件
  • cp [选项] 源文件或目录 目标:拷贝
    • -r递归拷贝
    • \cp强制覆盖不警告
  • rm [选项] 文件或目录:移除
    • -r递归删除
    • -f强制删除不提示
  • mv 源文件或目录 目标文件或目录:移动,可以实现重命名
  • cat [选项] 文件名:查看文件内容
    -n显示行号,一般配合more用cat 文件名 | more
  • more:文本过滤器
    • 空格键:向下翻页
    • Enter:向下一行
    • =:输出当前行号
    • q:退出more
  • less:文本过滤器,但不一次加载完所有文件,更强大
    • 空格键:向下翻页
    • pagedown:向下翻页
    • pageup:向上翻页
    • /关键字:查找
    • q:退出less
  • head 文件名:输出文件前10行内容
    • head -n 6 文件名:输出文件前6行内容
  • tail 文件名:输出文件后10行内容
    • tail -n 5 文件名:输出文件后5行内容
    • tail -f 文件名:实时跟踪文件的所有更新
  • > 目标文件名输出重定向:将内容覆盖到目标文件名中
    • ls -l > 文件名
    • cat 文件名 > 文件名
    • echo 内容 > 文件名
  • >> 目标文件名:覆盖写入
  • ln [选项] 原文件或目录 目标链接名:创建链接,默认是硬链接,inode号相同,即文件正文相同
    • -s:软链接,符号链接,文件正文存储目标文件的路径信息,原文件改名后软连接会失效
  • scp [选项] 源文件 目标路径:基于ssh登录的远程拷贝数据
    • 目标路径:用户名@主机ip:目标主机下的路径
  • wc [选项] [文件]:计数,不指定文件默认从标准输入读取
    • -l:行数
    • -c:字节数
    • -w:字数

控制台相关

  • echo 内容,输出内容到控制台
  • history,查看历史命令
    • history 10,查看最近使用的10个命令
    • !6,执行编号为6的历史命令

时间相关

  • date:显示当前时间
    • date +%Y:显示当前年份
    • date +%m:显示当前月份
    • date +%d:显示当前日期
    • date "+%Y-%m-%d %H:%M:%S":按格式显示当前时间
    • date -s "2026-6-20 21:15:10":设置系统时间
  • cal:显示本月日历
    • cal 2026:显示2026年日历

查找相关

  • find [搜索目录] [选项]:沿指定目录递归向下查找
    • -name 文件名:按指定文件名查找
    • -user 用户名:按指定所有者查找
    • -size 文件大小:按文件文件大小查找,+大于-小于,-size +200M大于200M的文件
  • locate 文件名:根据locate数据库快速定位文件路径
    • updatedb:更新locate数据库,管理员需要定期更新,第一次运行前需要更新
  • |:管道符,将前一个命令的处理结果输出传递给后面的命令处理
  • grep [选项] 查找内容 源文件:过滤查找
    • -n:显示行号
    • -i:忽略字母大小写
    • -v:反向匹配
    • cat ./hello.txt | grep "mofei"

压缩&解压类

  • gzip和gunzip
    • gzip 文件名:将文件压缩为.gz文件
    • gunzip 前缀.gz:解压文件
  • zip和unzip
    • zip [选项] 前缀.zip 压缩目标:将文件或目录压缩为.zip文件
      • -r:递归压缩,压缩目录
    • unzip [选项] 前缀.zip:解压
      • -d 目录:指定解压后存放的目录
  • tar [选项] 前缀.tar.gz|前缀.tar 打包目标:将目标打包(可以同时压缩),目标可以是多个
    • -c:产生.tar打包文件
    • -v:显示详细信息
    • -f:指定包文件名,必须放在选项列表最后
    • -z:使用gzip方式压缩/解压
    • -x:解包.tar文件

网络类

  • ifconfig:查看ip地址
  • ip addr:查看ip地址
  • ping 地址:测试网络连接
  • netstat [选项]:查看系统网络情况,可以用grep过滤
    • -an:按一定顺序排列输出
    • -p:显示哪个进程在调用
    • netstat -ltnp | grep mysqld:查找mysql的端口号
    • Proto:连接协议
    • Local Address:主机ip地址以及端口号
    • Foreign Address:外部ip地址以及端口号
  • telnet 主机 端口:远程终端,可用作TCP连接测试客户端,连接后输出请求报文并按两次回车可以发送请求
  • nc [选项] 主机 端口:建立TCP/UDP连接,监听端口,传输数据等,连接后输出请求报文并按两次回车可以发送请求
    • -v:只显示连接结果
    • -z:只检查连接,不发送数据
    • -u:对于UDP
  • lsof [选项] [路径或条件]:列出进程打开的文件
    • +D:递归检查目录
    • -p pid:查看某个进程打开的文件
    • -u user:查看某个用户打开的文件
    • -iTCP:查看TCP连接
    • -iUDP:查看UDP连接
  • curl [选项] url:向url发送请求并接收响应
  • tcpdump [选项] [过滤表达式]:抓包工具
    • -D:列出可用的接口
    • -i 接口名:指定接口实时抓包
    • host 主机ip:按主机过滤
    • tcp:只抓TCP的包
    • port 端口号:按端口号过滤

权限管理

每个用户必须属于一个组,每个文件有所有者,所在组,其他组

  • 所有者就是创建文件的用户
  • 用户创建文件后文件的所在组默认是所有者的所在组

文件信息

  • 0位:文件类型

    • l:软链接,相当于快捷方式
    • d:目录
    • c:字符设备文件
    • b:块设备文件,如硬盘
    • -:普通文件
    • s:套接字文件
    • p:管道文件
  • 1-3位:所有者权限,user

  • 4-6位:所在组权限,group

  • 7-9位:其他用户权限,other

  • 硬链接:文件名到磁盘正文区的映射关系(inode号),多个文件名可以有同一个inode号

  • 软链接:独立的文件,文件正文是一个字符串,表示目标文件的路径信息,目标路径信息改变了软连接就失效

rwx权限

数字表示:
r=4,w=2,x=1

作用到文件

  • r:可读取
  • w:可修改,不一定可以删除文件,删除前提是对该文件所在目录有写权限
  • x:可执行

作用到目录

  • r:可以读取,ls查看目录内容
  • w:可修改,对目录内创建,删除,重命名目录
  • x:可以进入该目录

修改权限

  • chmod:修改权限,u所有者,g所在组,o其他人,a所有人
    • chmod u=rwx,g=rx,o=x 目标
    • chmod o+w 目标:所有者增加读权限
    • chmod a-x 目标:所有用户删除执行权限
    • chmod 751 目标

修改所有者

  • chown 用户 目标:修改所有者
    • chown 用户:组 目标:修改所有者和所在组
    • chown -R 用户 目标:递归修改,对于目录

修改所在组

  • chgrp 组 目标:修改所在组
    • chgrp -R 组 目标:递归修改,对于目录

定时任务调度

任务调度:系统在某个时间执行的特定的命令或程序
分类:

  1. 系统工作,如病毒扫描
  2. 用户工作,如mysql数据库备份

crond任务调度

需要保证文件有足够的权限

  • crontab [选项]
    • -e:编辑contab定时任务
    • -l:查询contab定时任务
    • -r:删除当前用户所有的contab任务
  • systemctl restart crond:重启任务调度

设置crontab:

  • */1 * * * * 命令:每分钟执行一次命令
    • 第一个参数:一小时中的第几分钟
    • 第二个参数:一天中的第几小时
    • 第三个参数:一个月中的第几天
    • 第四个参数:一年中的第几个月
    • 第五个参数:一周中的第几天
    • *:任何时间
    • ,:不连续的时间
    • -:连续的时间段
    • */n:每n个单位时间

at定时任务

  • at命令是一次性定时任务,at的守护进程atd在后台运行,检查作业队列
  • atd默认每60秒检查作业队列,如果有作业且时间匹配,运行该作业
  • 使用at命令需要保证atd运行
    • ps -ef | grep atd:检查atd是否正在运行

设置at:

  • at [选项] 时间:在某个时间设置命令,按Ctrl+D结束输入
  • atq:查看作业队列
  • atrm 编号:删除编号对应的作业

指定时间:

  • 小时:分钟,如果当天该时间已过去,第二天执行
  • midnight,noon,teatime等模糊时间
  • 年-月-日,日期必须在时间后面
  • now + n 时间单位:从现在开始n个时间单位,比如minutes,hours,days,weeks等
  • today,tomorrow

磁盘分区

  • Linux只有一个根目录,每个分区组成文件系统中的一部分
  • 通过挂载将一个硬盘分区映射到一个目录下

硬盘

  • Linux硬盘分为IDE硬盘和SCSI硬盘等
  • 硬盘表示符硬盘类型+盘号+分区
    • 硬盘类型:hd表示IDE硬盘,sd表示SCSI硬盘
    • 盘号:a基本盘,b从属盘,c辅助盘,d辅助从属盘
    • 分区:1-4表示主分区或扩展分区,5开始是逻辑分区
  • lsblk -f:查看所有设备

挂载

分区

  • 通过lsblk -f找到新添加的硬盘名称,即/dev下的对应目录名,fdisk -l查看磁盘详细信息
  • fdisk 目录:对目录对应的硬盘分区
    • m:显示命令列表
    • p:显示硬盘分区
    • n:新增分区
    • d:删除分区
    • w:写入并退出
    • q:不保存退出

格式化分区

注意是给分区格式化不是给硬盘格式化

  • mkfs -t ext4 /dev/目标:以ext4方式格式化分区

挂载

将硬盘分区挂载到目录下

  • mount 设备名称 挂载目录:挂载,用命令挂载重启后会失效
  • umount 设备名称 挂载目录:取消挂载
  • 永久挂载:修改/etc/fstab,添加/dev/目标 挂载目录 其他参数,保存后执行mount -a生效

硬盘情况查询

  • df -h:查询系统整体磁盘使用情况
  • du [选项] 目录:查询指定目录的磁盘占用情况,默认为工作目录
    • -h:以人类理解的方式显示文件大小
    • -a:含文件
    • -s:汇总
    • --max-depth=n:设置子目录深度为n
    • -c:显示汇总值
  • ls -l /opt | grep "^-" | wc -l:统计/opt下文件的个数
  • ls -l /opt | grep "^d" | wc -l:统计/opt下目录的个数
  • ls -lR /opt | grep "^-" | wc -l:统计/opt下文件的个数,包括子目录里的
  • ls -lR /opt | grep "^d" | wc -l:统计/opt下目录的个数,包括子目录里的
  • tree:以树状结构显示目录

NAT网络配置

原理

  • 桥接模式:虚拟器和主机有相同的地位,可以访问外网
  • NAT模式:虚拟机隐藏在主机后面,通过虚拟网卡(vmnet8)连接主机,通过主机访问外网,主机不需要有无线网卡和有线网卡
  • 主机模式:和主机通过纯虚拟封闭网络(vmnet1)连接,不能访问外网

指定ip

设置ip地址需要和虚拟网卡保持在同一网段且不超过设置的范围

  • 编辑/etc/sysconfig/network-scripts/ifcfg-ens33文件
    • DEVICE:接口名(设备,网卡)
    • HWADDR:MAC地址
    • TYPE:网络类型
    • ONBOOT:设备启动时网络接口是否有效
    • BOOTPROTO:网络配置方法
      • none:引导时不使用协议
      • static:静态分配ip
      • bootp:BOOTP协议
      • dhcp:DHCP协议
    • IPADDR:ip地址
    • GATEWAY:网关
    • DNS1:域名解析器
    • NETMASK:子网掩码
    1. 设置BOOTPROTO为static
    2. 设置ip地址
    3. 设置子网掩码
    4. 设置网关
    5. 设置DNS地址
  • systemctl restart NetworkManager:重启服务生效

设置主机名和host映射

  • 主机ip地址 主机名
  • Linux:在/etc/hosts设置主机名和host映射,hosts文件记录ip和主机名的映射关系
  • Windows:在C:\Windows\System32\drivers\etc\hosts设置主机名和host映射

进程管理

  • 每个执行的程序都为一个进程,每个进程分配一个pid进程号
  • 每个进程以前台和后台两种方式存在,一般系统的服务以后台形式存在

操作

ps

  • ps -aux:System V风格显示所有(含其他用户)的进程
    • ps -aux | grep "sshd":查看sshs服务是否在运行
    • USER:用户名
    • PID:进程号
    • %CPU:CPU占用百分比
    • %MEM:内存占用百分比
    • VSZ:占用虚拟内存大小(KB)
    • RSS:占用物理内存大小(KB)
    • TTY:终端名称,若是?表示不依赖终端而存在
    • STAT:进程状态
      • S:睡眠
      • s:会话的先导进程
      • N:比普通优先级低
      • R:正在运行
      • R+:正在前台运行
      • D:短期等待
      • Z:僵尸进程
      • T:被追踪或停止等待
    • START:启动时间
    • TIME:使用CPU时间
    • COMMAND:启动进程所用的命令和参数
  • ps -ajx:BSD显示所有(含其他用户)的进程
    • PGID:进程组id
    • SID:会话组id
  • ps -ef:BSD风格显示所有(含其他用户)的进程
    • PPID:父进程id
    • C:CPU 用于计算执行优先级的因子,数值越大,表明进程是 CPU 密集型运算,执行优先级会降低;数值越小,表明进程是 I/O 密集型运算,执行优先级会提高
    • STIME:启动时间
    • CMD:启动进程所用的命令和参数
  • pstree [选项]:树状显示进程信息
    • -p:显示进程号
    • -u:显示进程所属用户

kill

可以向进程发送信号

  • kill [选项] 进程号:杀死进程
    • kill -l:显示可以发送的信号
      • 可以发送62个信号,前32个是稳定信号,后30个是不稳定信号
      • 常用信号:
        • SIGHUP:当进程所在的终端被关闭后,终端会给运行在当前终端的每个进程发送该信号,默认结束进程
        • SIGINT:中断信号,当用户输入Ctrl + C时发送
        • SIGQUIT:退出信号,当用户输入Ctrl + /时发送,退出进程
        • SIGKILL:强制杀死指定的进程
        • SIGSEGV:当指针出现越界访问时发送,表示段错误
        • SIGPIPE:当管道破裂时发送该信号
        • SIGALRM:当定时器超时后发送该信号
        • SIGSTOP:暂停进程,当用户输入Ctrl+C时发发送
        • SIGTSTP:暂停进程
        • SIGUSR1,SIGUSR2 :留给用户自定义的信号,没有默认操作
        • SIGCHLD:当子进程退出后,会向父进程发送该信号
      • 特殊信号:
        • SIGKILL,SIGSTOP:不能被捕获和忽略
    • kill -信息号 进程号:发送信号到进程
  • killall 进程名称:通过进程名称匹配杀死进程

top

  • top [选项]:动态监控进程
    • -d 秒数:刷新时间间隔,默认3秒
    • -i:不显示僵尸进程和闲置进程
    • -p 进程号:指定监控进程
      交互:
    • load average:三个值的平均值大于0.7说明负载比较大
    • P:以CPU使用率排序,默认
    • M:以内存使用率排序
    • N:以进程号排序
    • u:监视特定用户
    • k:杀死进程
    • q:退出

进程状态切换

  • jobs -l:查看当前终端所有停止的进程的作业号和进程号
  • bg 作业号:将暂停的作业在后台运行
  • fg 作业号:将后台运行的作业切换到前台运行

service服务

service(守护进程)本质上是后台进程,通常会监听某个窗口,等待其他程序的请求

  • service 服务名 [start|restart|reload|status]
    • CentOS7后常用systemctl
    • service指令管理的服务在/etc/init.d目录下
  • chkconfig --list:列出所有服务
    • chkconfig 服务名 --list
    • chkconfig --level 运行级别 服务名 [on|off]:设置某个服务在某个运行级别下自启动或关闭自启动,需要重启生效
  • systemctl [start|stop|restart|status] 服务名
    • systemctl指令管理的服务在/usr/lib/systemd/system目录下
    • systemctl list-unit-files:查看每个服务开机启动状态,可以用grep过滤
    • systemctl [enable|disable] 服务名:设置或关闭服务开机自启动
    • systemctl is-enabled 服务名:查询服务是否开机自启动

防火墙

  • firewall-cmd --permanent --add-port=端口号或协议:打开端口,需要重建防火墙
  • firewall-cmd --permanent --remove-port=端口号或协议:关闭端口,需要重建防火墙
  • firewall-cmd --query-port=端口号或协议:查询端口打开状态
  • firewall-cmd --list-ports:列出所有打开的端口
  • firewall-cmd --reload:重建防火墙

rpm和yum

包管理工具

rpm

包名格式

  • firefox-60.2.2-1.el7.centos.x86_64
    • firefox:名称
    • 60.2.2:版本号
    • el7.centos.x86_64:适用操作系统
      • i686,i386:32位系统
      • x86_64:64位系统
      • noarch:通用

查询

  • rpm -qa:列出所有rpm软件包
  • rpm -q 包名:查询软件包是否安装
  • rpm -qi 包名:查询软件包信息
  • rpm -ql 包名:查询软件包中的文件
  • rpm -qf 文件全路径名:查询文件所属的软件包

安装&卸载

  • rpm -ivh 包名:安装软件包
    • -i:安装
    • -v:提示
    • -h:显示进度条
  • rpm -e 包名:卸载软件包
    • --nodeps:无视依赖强制卸载

yum

基于rpm的Shell前端软件包管理器,能自动处理依赖关系,自动从指定的服务器下载rpm包并安装

  • yum list:列出可安装软件列表
  • yum list installed:列出已安装软件列表
  • yum install 包名:安装软件包
    • -y:自动应答所有yes
  • yum remove 包名:卸载软件包
  • yum update:升级所有软件包

环境搭建

安装mysql5.7

安装并处理环境

  1. 在/opt目录下载mysql的rpm包
    1. cd /opt
    2. wget rpm链接
      1. 若wget不可用,下载yum -y install wget
      2. rpm链接参考:https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm
  2. 安装mysql的yum源:yum -y localinstall mysql57-community-release-el7-11.noarch.rpm
  3. 安装mysql
    1. rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022
    2. yum -y install mysql-community-serve
  4. 启动mysql服务
    1. systemctl start mysqld
    2. systemctl daemon-reload重载配置
  5. 修改mysql密码,最开始密码为空:ALTER USER 'root'@'localhost' IDENTIFIED BY 'root123';
  6. 允许其他主机登录:在mysql中:
    1. USE mysql;:使用mysql数据库
    2. UPDATE user SET host='%' WHERE user='root';,修改user表中的host字段
    3. FLUSH PRIVILEGES;:刷新配置
  7. 打开3306/tcp端口
    1. firewall-cmd --permanent --add-port=3306/tcp
    2. firewall-cmd --reload
  8. 配置mysql默认编码为utf8,在/etc/my.cnf文件中的[mysqld]下添加配置:
    1. character_set_server=utf8
    2. init_connect='SET NAMES utf8'
  9. 重启mysql:systemctl restart mysqld
  10. 在mysql查看编码:SHOW VARIABLES LIKE '%character%';

修改root密码

  1. 在/etc/my.cnf文件中的[mysqld]下修改配置:skip-grant-tables=1,设置免密登录,设置后密码为空
  2. 重启mysql
  3. 免密登录mysql后修改用户密码为空:
    1. USE mysql;
    2. UPDATE user SET autentication_string='' WHERE user='root';
  4. 将/etc/my.cnf中skip-grant-tables=1注释掉
  5. 重启mysql
  6. 进入mysql后修改root密码:ALTER USER 'root'@'localhost' IDENTIFIED BY 'root123';

Shell编程

Shell 是一个命令行解释器,它为用户提供了一个向 Linux 内核发送请求以便运行程序的界面面系统级程序,用户可以用 Shell 来启动,挂起,停止,编写一些程序

Shell脚本

#!/bin/bash
echo "hello world"

脚本要求:

  • 以#!/bin/bash开头
  • 脚本有可执行权限

脚本执行方式:

  1. 给脚本可执行权限,直接用文件名执行./hello.sh
  2. 不用给可执行权限,直接用sh 文件名执行
  3. 以后台方式运行在最后加&

变量

Shell变量分为系统变量和用户自定义变量

系统中的变量:$HOME,$PWD,$SHELL,$USER等

  • set:显示当前Shell中的所有变量

定义变量

  • 变量名=值:定义变量
    • readonly 变量名=值:定义静态变量,不能撤销
    • 变量名可以由字母,数字,下划线组成,不能以数字开头,一般为大写
    • 赋值的等号两边不能有空格
    • 将命令的返回值赋值给变量:
      • A=`date`
      • A=$(cal)
  • unset 变量名:撤销变量
  • 使用变量在变量名前面加上$

设置环境变量

  • export 变量名=值:将变量输出为环境变量(全局变量)
  • source 配置文件:使配置文件立即生效
  • echo $变量名:查询环境变量的值

位置参数变量

获取命令行的参数信息

  • $n:1-9代表第1到9个参数,0是命令本身,10以上的参数要用大括号${10}
  • $*:命令行中的所有参数,把所有参数看作一个整体
  • $@:命令行中的所有参数,把每个参数区分对待
  • $#:命令行中所有参数个数

预定义变量

可以直接在Shell脚本中使用

  • $$:当前进程的进程号
  • $!:后台运行的最后一个进程的进程号
  • $?:最后一次执行的命令的返回状态
    • 值为 0,说明上一个命令正确执行
    • 值为非 0(具体是哪个数,由命令自己来决定),说明上一个命令执行不正确

运算符

  • $((运算式))或$[运算式]或expr 运算式
    • 使用expr后面的运算式的运算符左右两边要有空格
    • 使用expr方式且要赋值给变量需要加反引号:`expr 运算式`

条件判断

  • [ 条件 ]
    • 条件左右有空格,条件运算符的左右两边也有空格
    • 非空返回true,可以用$?验证(0为true,>1为false)

常用判断条件:

  • =:两个字符串或两个整数比较
  • -lt:小于
  • -le:小于等于
  • -eq:等于
  • -gt:大于
  • -ge:大于等于
  • -ne:不等于
  • -r:有读权限
  • -w:有写权限
  • -x:有可执行权限
  • -f:文件存在且是一个常规文件
  • -e:文件存在
  • -d:目录存在

流程控制

if

if [ 条件 ]
then
	代码
fi
if [ 条件 ]
then
	代码
elif [ 条件 ]
then
	代码
fi

case

case $变量名 in
"值1")
	代码
;;
"值2")
	代码
;;
*)    #默认分支
	代码
;;
esac

for

for 变量名 in 值1 值2 值3
do
	代码
done
for i in $@
do
	echo "para is $i"
done
for((初始值;控制条件;变量变化))
do
	代码
done

while

while [ 条件 ]
do
	代码
done

读取控制台输入

  • read [参数] 变量:将读取到的值赋给变量
    • -p 提示词:指定提示词
    • -t 秒数:指定等待时间,超过等待时间不再等待

函数

系统函数

  • basename 文件完整路径名 [后缀]:删去包括最后一个/的所有前缀并返回
    • 若指定了后缀,也会删掉后缀
  • dirname 文件完整路径名:返回最后一个/前面的前缀

自定义函数

函数名()
{
	代码;
	[return 返回值;]
}
  • 函数名前面可以加function
  • 可以不带返回值,返回值介于0-255
  • 通过位置参数获取函数参数
  • 函数调用:函数名 参数

备份数据库

日志管理

日志是记录重大事件的工具

  • 记录用户登录信息,系统启动信息,系统安全信息,邮件相关信息,各种服务相关信息等
  • 通过日志检查错误发生原因
  • /var/log目录是系统存放日志的位置

常用日志

日志文件 说明
/var/log/boot.log 系统启动
/var/log/cron 与系统定时任务相关
/var/log/cups/ 打印信息
/var/log/dmesg 系统在开机时内核自检的信息,可以使用dmesg命令直接查看内核自检信息
/var/log/btmp 错误登陆,是二进制文件,要使用lastb命令查看
/var/log/lastlog 系统中所有用户最后一次的登录时间,是二进制文件,要使用lastlog命令查看
/var/log/maillog 邮件信息
/var/log/message 系统重要消息,记录系统的绝大多数重要信息;系统出问题首先要检查的日志
/var/log/secure 验证和授权方面的信息,只要涉及账户和密码的程序都会记录,包括添加用户和修改用户密码
/var/log/wtmp 永久记录所有用户的登陆、注销信息,系统的启动、重启、关机事件,是二进制文件,要使用last命令查看
/var/tun/ulmp 当前已经登录的用户的信息,要使用w、who、users等命令查看

rsyslogd

  • rpm -q rsyslog:检查rsyslog服务是否安装
  • ps -aux | grep "rsyslog" | grep -v "grep":检查服务是否启动
  • systemctl list-unit-files | grep "syslog":查询服务自启动状态
  • /etc/rsyslog.conf:配置文件
    • 格式:*.* 存放日志文件,第一个*是日志类型,第二个*是日志级别,*代表所有类型

日志类型

  • auth :pam 产生的日志
  • authpriv :ssh、ftp 等登录信息的验证信息
  • corn :时间任务相关
  • kern :内核
  • lpr :打印
  • mail :邮件
  • mark(syslog)-rsyslog:服务内部的信息,时间标识
  • news :新闻组
  • user :用户程序产生的相关信息
  • uucp :unix to nuix copy 主机之间相关的通信
  • local数字 :自定义的日志设备,数字为1-7

日志级别

从上到下,级别从低到高,记录的信息越来越少

  • debug:有调试信息的,日志通信最多
  • info:一般信息日志,最常用
  • notice:最具有重要性的普通条件的信息
  • warning:警告级别
  • err:错误级别,阻止某个功能或者模块不能正常工作的信息
  • crit:严重级别,阻止整个系统或者整个软件不能正常工作的信息
  • alert:需要立刻修改的信息
  • emerg:内核崩溃等重要信息
  • none:什么都不记录

自定义日志

  • 在/etc/rsyslog.conf文件中按照格式添加规则
  • 创建存放日志的日志文件

日志轮替

把旧的日志文件移动并改名,建立新的空的日志文件,旧的日志文件超出大小范围就删除

原理:通过可执行文件/etc/cron.daily/logrotate依赖定时任务执行日志轮替

配置

配置文件:全局配置文件/etc/logrotate.conf,子配置文件目录/etc/logrotate.d/,子配置优先级更高

子配置规则也可以写在/etc/logrotate.conf里面

  • include /etc/logrotate.d:表示包含这个目录下的所有子配置文件
存放日志的文件{
	轮替规则
}

参数:

  • daily:每天轮换
  • weekly:每周轮换
  • monthly:每月轮换
  • rotate 数字:备份个数,0表示不备份
  • compress:将旧日志压缩
  • create [权限] [所有者] [所在组]:建立新日志,可以指定权限,所有者,所在组
  • mail 地址:将输出内容发到邮件地址
  • missingok:如果日志不存在,则忽略该日志的警告信息
  • notifempty:如果日志为空文件,则不进行日志轮替
  • minsize 大小:执行日志轮替的日志文件大小的最小值
  • size 大小:日志大于某个大小才轮替,忽略时间轮替
  • dateext:使用日期作为日志轮替文件的后缀
  • sharedscripts:在此关键字之后的脚本只执行一次
  • prerotate 脚本文件 endscript:在日志轮替之前执行脚本
  • postrotate 脚本文件 endscript:在日志轮替之后执行脚本

内存日志

通过journalctl查看内存日志,系统重启会清空

  • journalctl:查看全部内存日志
  • journalctl -n 5:查看最新5条
  • journalctl --since 15:00 --until 17:30:指定时间段
  • journalctl -p err:报错日志
  • journalctl -o verbose:日志详细内容
  • journalctl _PID=1234 _COMM=sshd:在详细内容中指定参数
posted @ 2026-10-07 16:12  mofei1116  阅读(7)  评论(0)    收藏  举报