[Linux]Linux 基础知识常用命令和 Shell 脚本

Posted Spring-_-Bear

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[Linux]Linux 基础知识常用命令和 Shell 脚本相关的知识,希望对你有一定的参考价值。

一、Linux

1. Linux 的应用领域及介绍

  1. 应用领域:Linux 运维工程师、Linux 嵌入式工程师、Linux 下项目开发;个人桌面领域(Ubuntu、Fedora)、服务器领域、嵌入式领域
  2. 上世纪 70 年代贝尔实验室的 Ken tompsonDennis richres 共同发明了 Unix 操作系统
  3. 80 年代 Richard Stallman 提出了 GUN 计划,后由 Linus 在 Minix 操作系统的基础上发明编写了 Linux 内核

2. 网络连接的三种方式

  1. 桥接模式:虚拟系统与母机 IP 地址必须处于同一网段,如母机:192.168.0.10,则虚拟系统 IP 地址网段必须为:192.168.0.*
  2. NAT 模式(网络地址转换模式):虚拟系统有自己的网段,如 192.168.100,仍然可以与外部主机系统通信
  3. 主机模式:独立系统,不与外界发生联系

3. Linux 目录介绍

目录名描述
/bin(binaries)(/usr/bin、/usr/local/bin)存放常用指令
/boot存放启动 Linux 时使用的一些核心文件,如一些链接文件以及镜像文件
/dev(device)类似 windows 的设备管理器,把所有的硬件用文件形式进行映射
/etc(etcetera)所有系统管理所需要的配置文件和子目录,如 mysql 的 my.conf 配置文件
/home存放普通用户的目录
/lib(library)系统开机时所需要的最基本的动态链接库,类似 windows 下的 .dll 文件,几乎所有的应用程序都会使用到这些共享库
/mediaLinux 系统会自动识别一些设备,如 U 盘、光驱等,当识别成功后,Linux 会把识别的设备挂载到此
/mnt临时挂载别的文件系统,可以将外部的存储挂载到 /mnt/ 上,如共享文件夹
/opt(optional)额外安装的软件包的存放位置,如 oracle 数据库包文件
/proc(process)虚拟的目录,它是系统内存的映射,访问此目录可以获取系统相关信息
/root超级权限者的主目录
/run是一个临时文件系统,存储系统启动以来的信息。当系统重启时,这个目录下的文件应该被删掉或清除
/sbin(superuser binaries)(/usr/sbin、/usr/local/sbin)存放系统管理员使用的系统管理程序
/srv存放一些服务启动之后需要提取的数据
/sys这是 Linux 2.6 内核的一个很大的变化,该目录下安装了 2.6 内核中新出现的一个文件系统 sysfs
/tmp(temporary)存放临时文件
/usr(unix shared resources)存放用户的应用程序和文件,类似 windows 下的 program files 目录
/var(variable)存放着不断扩充的东西,如系统日志
/lost + found此目录一般情况下内容为空,当系统非法关机后,自动存放一些文件
/usr/local软件安装的目标目录,一般是通过源码编译方式安装的程序
/selinuxsecurity-enhanced linux,这个目录是 Redhat/CentOS 所特有的目录,Selinux 是一个安全机制,类似于 windows 的防火墙,但是这套机制比较复杂,这个目录就是存放 selinux 相关的文件的

4. vi 和 vim

  1. 拷贝当前行 yy ,拷贝当前行向下的连续 5 行 5yy
  2. 删除当前行 dd ,删除当前行向下的连续 5 行 5dd
  3. 查找单词 bear ,/bear 回车查找,输入 n 查看下一个
  4. 显示行号 :set nu ,取消显示行号 :set nonu
  5. 跳转到行尾 G ,跳转到行头 gg
  6. 撤销 u
  7. 将光标移动到第 22 行 22 shift + g

5. 开机、关机、登录、注销

  1. 立刻关机 shutdown -h now
  2. 5 分钟后关机 shutdown -h 5
  3. 立刻重启 shutdown -r now
  4. 关机 halt
  5. 重启 reboot
  6. 同步内存数据到磁盘 sync
  7. 切换用户 su - root
  8. 用户注销 logout (在图形化界面下无效,在运行级别 3 下有效)

6. 用户管理

  1. 添加 spring 用户 useradd spring
  2. 添加 spring 时指定 spring 的根目录 useradd -d /home/temp spring
  3. 给 spring 设置密码 passwd spring
  4. 删除用户但保留用户主目录 userdel spring
  5. 删除用户且删除用户主目录 userdel -r spring
  6. 查询用户信息 id root
  7. 猜猜我是谁 who am i (显示的是登入系统时的用户信息)
  8. 新增组 groupadd groupname
  9. 删除组 groupdel groupname
  10. 添加用户时指定组 useradd -g groupname username
  11. 修改用户所在组 usermod -g groupname username

7. 用户、组相关的配置文件

  1. /etc/passwd 用户配置文件

    每行含义:用户名:口令:用户标识号:组标识号:注释性信息:主目录:登录Shell

  2. /etc/shadow 口令配置文件

    每行含义:登录名:加密口令:最后一次修改时间:最小时间间隔:最大时间间隔:警告时间:不活动时间:失效时间:标志

  3. /ect/group 组的配置文件

    每行含义:组名:口令:组标识号:组内用户列表

8. 运行级别

  1. 切换运行级别 init 6
  2. 查看当前系统的默认运行级别 systemctl get-default
  3. 设置当前系统的默认运行级别 systemctl set-default multi-user.target
级别功能
0关机
1单用户(找回丢失密码)
2多用户无网络服务
3多用户有网络服务
4系统未使用保留给用户
5图形界面
6重启

9. 帮助指令

  1. 获得 ls 命令的帮助信息 man ls
  2. 获得 shell 内置命令的帮助信息 help cd

10. 文件目录指令

  1. 回到自己的家目录 cd ~
  2. 创建多级目录 mkdir -p /home/spring/bear
  3. 删除空目录 rmdir /home/spring/bear
  4. 创建一个空文件 touch temp.java
  5. 递归拷贝当前文件夹到指定目录 cp -r srcdirectory dstdirectory
  6. 以覆盖方式递归拷贝当前文件夹到指定目录 \\cp -r srcdirectory dstdirectory
  7. 重命名 mv oldfilename newfilename
  8. 查看文件并显示行号 cat -n filename
  9. more 指令
键位功能
space下翻一页
enter下翻一行
q退出
ctrl + f下滚一屏
ctrl + b上滚一屏
=输出当前行号
:f输出文件名和当前行号
  1. less 用于分屏查看文件内容,优点是根据需要显示的内容动态加载文件,对于显示大型文件具有较高的效率
键位功能
space下翻一页
pagedown下翻一页
pageup上翻一页
/字串向下搜索字串,n:向下查找 N:向上查找
?字串向上搜索字串,n:向上查找 N:向下查找
q退出
  1. 输出内容到控制台 echo $HOSTNAME
  2. 查看文件的头 5 行内容 head -n 5 /ect/profile (默认查看 10 行)
  3. 查看文件的尾 5 行内容 head -n 5 /ect/profile (默认查看 10 行)
  4. 实时监控文件内容的更新 tail -f filename (ctrl + c 退出)
  5. 覆盖重定向 > ,追加重定向 >>
  6. 为文件或目录创建软链接(快捷方式)ln -s srcfile linkname
  7. 查看最近使用的十个命令 history 10
  8. 执行曾经执行过的编号为 5 的指令 !5

11. 日期时间指令

  1. 显示当前时间 date
  2. 按指定格式显示时间 date "+%Y-%m-%d %H:%M:%S"
  3. 设置系统当前时间 date -s "2022-02-02 22:22:22"
  4. 查看指定年指定月的日历 cal 5 2050

12. 查找指令

  1. 在指定目录下按文件名检索文件 find /home -name hello.txt
  2. 在指定目录下按用户名过滤文件 find /home -user root
  3. 在指定目录下按文件大小过滤文件 find /home -size +200M+ 大于 - 小于)
  4. locate 指令可以快速定位文件路径,因其无需遍历整个文件系统,基于自定义的数据库进行检索,速度较快,第一次使用该指令前,需使用 updatedb 指令生成 locate 数据库
  5. 查看某个指令存放的目录 which ls
  6. | 管道符:表示将前一个命令的处理结果输出传递给后面的命令处理 cat hello.t | grep -n -i "yes"
  7. 显示行号且忽略大小写方式从文件中查找内容 grep -n -i "yes" hello.txt

13. 压缩和解压

  1. 将指定目录下的文件压缩为 .gz 格式 gzip /home/hello.txt
  2. 解压指定目录下的 .gz 文件 gunzip /home/hello.txt.gz
  3. 压缩指定目录 zip -r myhome.zip /home
  4. 解压文件到指定目录 unzip -d /opt myhome.zip
  5. 压缩多个文件 tar -zcvf pc.tar.gz pig.txt cat.txt
  6. 解压到指定目录 tar -zxvf pc.tar.gz -C /opt/temp
参数功能
-c产生 .tar 打包文件
-v显示详细信息
-f指定压缩后的文件名
-z打包同时压缩
-x解包 .tar 文件

14. 组管理

Linux 中每个用户必须属于一个组,不能独立于组外;Linux 中每个文件有所有者、所在组和其它组的概念

  1. 查看文件的所有者 ls -ahl
  2. 修改文件的所有者 chown username filename
  3. 修改文件所在组 chgrp groupname filename
  4. 修改用户登入系统的初始目录 usermod -d directoryname username (用户需要拥有进入新目录的权限)

15. 权限管理

  1. 第 0 位确定文件类型
  2. 第 1 - 3 位确定文件所有者拥有的权限
  3. 第 4 - 6 位确定文件所在组拥有的权限
  4. 第 7 - 9 位确定其它用户对该文件拥有的权限
  5. 第二列表示文件数加目录数,第三列表示所有者,第四列表示所在组,第五列表示大小

字符说明
-普通文件
d目录
l链接(快捷方式)
c字符设备文件,如鼠标、键盘
b块设备,如硬盘
  1. rwx 权限作用到文件:r:可读 - 可以读取、查看;w:可写 - 可以修改,但不代表可以删除该文件,可以删除一个文件的前提是对该文件所在的目录拥有写权限;x:可执行 - 文件可以被执行
  2. rwx 权限作用到目录:r:可读 - 可以查看该目录内容;w:可写 - 可重命名目录,可在目录创建、删除文件;x:可执行 - 可以进入该目录
  3. rwx 也可用数字表示依次对应 4、2、1
  4. u - 所有者,g - 所在组,o - 其他用户,a - 所有人
  5. 依次赋予权限 chmod u=rwx,g=rx,o=x filenameordirectoryname <=> chmod 751 filenameordirectoryname
  6. 增加指定权限 chmod o+w filenameordirectoryname
  7. 回收指定权限 chmod a-x filenameordirectoryname
  8. 修改文件或目录所有者 chown newowner filenameordirectoryname
  9. 修改文件的所有者和所在组 chown newowner:newgroup filenameordirectoryname
  10. 修改某个目录下的所有文件或目录的所有者和所在组 chown -R newowner:newgroup filenameordirectoryname

16. 定时任务调度 crond

  1. 任务调度:系统在某个指定的事件执行特定的命令或程序
  2. 任务调度分类:系统工作:有些重要的工作必须周而复始地执行,如病毒扫描;用户工作:用户希望执行某些程序,如对 MySQL 数据库的备份
  3. crontab [params]
参数功能
-e编辑 crontab 定时任务
-l查询 crontab 定时任务
-r删除当前用户的所有 crontab 任务
  1. 重启任务调度 service crond restart
  2. 每分钟执行一次 ls -l /ect/ > tmp/to.txt 指令 */1 * * * * ls -l /etc/ > /tmp/to.txt
占位符含义范围
第一个一个小时当中第几分钟0 - 59
第二个一天当中的第几小时0 - 23
第三个一个月当中的第几天1 - 31
第四个一年当中的第几个月1 - 12
第五个一周当中的星期几0 - 7(0 和 7 都表示周日)
符号含义
*代表任何时间。如第一个占位符为 * 代表一小时中的每分钟都执行一次命令
,代表不连续的时间。如 “0 8,12,16 * * *” 代表每天的 8、12、16 点整执行一次命令
-代表连续的时间范围。如 “0 5 * * 1-6” 代表周一至周六的 5 点整执行一次命令
*/n代表每隔多久执行一次。如 “*/10 * * * *” 代表每隔 10 分钟执行一次命令

17. 定时任务调度 at

  1. at 命令是一次性定时计划任务,at 的守护进程 atd 会在后台运行。默认情况下 atd 守护进程每隔 60s 检查一次作业队列,若有作业存在且作业运行时间与当前时间匹配,则运行此作业
  2. 在使用 at 命令时必须保证其守护进程 atd 处于运行状态,可以使用 ps -ef |grep atd 指令查看
  3. at 命令格式 at [params] [time] ,可以使用 ctrl + d 结束 at 命令的输入
参数含义
-m当指定的任务完成后,就给用户发送邮件,即使没有标准输出
-Iatq 的别名
-datrm 的别名
-v显示任务将要被执行的时间
-c打印任务的内容到标准输出
-V显示版本信息
-q<队列>使用指定的队列
-f<文件>从指定文件读入任务而不是从标准输入读入
-t<时间参数>以时间参数的形式提交要运行的任务
  1. 以 hh:mm(小时:分钟)指定,若该时间已过,则第二天执行
  2. 使用 midniging、noon、teatime 等比较模糊的词语来指定
  3. 采用 12 小时计时制来指定,如 12pm
  4. 使用具体的时间来指定,如 month day、mm/dd/yy、dd.mm.yy,例如 04:00 2021-03-01
  5. 使用相对计时法 now + count time-units,单位可以是 minutes、hours、days、weeks
  6. 直接使用 today、tomorrow 来指定时间
  7. 两天后的下午 5 点执行命令 at 5pm + 2 days/bin/ls /home<EOT>,输入结束按两次 ctrl + d 结束 at 命令的输入
  8. 查看工作队列中的任务 atq <=> at -l
  9. 删除已经存在的第 1 号任务 atrm 1

18. 磁盘分区、挂载

  1. 查看 Linux 系统硬盘分区挂载情况 lsblk
  2. Linux 硬盘分为 IDE 硬盘和 SCSI 硬盘,目前基本都是 SCSI 硬盘
  3. 对于 IDE 硬盘,驱动器标识符为 “hdx~”,其中 “hd” 表明分区所在设备的类型,这里是指 IDE 硬盘。“x” 为盘号(a 为基本盘、b 为基本从属盘、c 为辅助主盘,d 为辅助从属盘);“~” 代表分区,前四个分区用数字 1 - 4 表示,它们是主分区或扩展分区,从 5 开始就是逻辑分区。例如:hda3 表示第一个 IDE 硬盘上的第三个主分区或扩展分区;hdb2 表示第二个 IDE 硬盘上的第二个主分区或扩展分区
  4. 对于 SCSI 硬盘则标识为 “sdx~”,SCSI 硬盘用 “sd” 来表示分区所在设备的类型,其余则和 IDE 硬盘的表示方法一致
  5. 查看磁盘详细信息 lsblk -f

  1. 通过虚拟机设置为 Linux 系统增加一块硬盘,重启后系统识别到新增的硬盘
  2. 使用 fdisk /dev/sdb 命令对新增的硬盘进行分区,分区结束时输入 w 写入分区并退出,若不想保存在输入 q
  3. 格式化分区,系统为新增的磁盘分区分配唯一的 40 位字符串的 UUID mkfs -t ext4 /dev/sdb1
  4. 分区挂载到目录下 mount /dev/sdb1 /home/bear
  5. 卸载分区挂载关系 umount /dev/sdb1umount /home/bear
  6. 使用命令行挂载重启后会失效,永久挂载需修改 /etc/fstab 配置文件实现,配置文件编辑完成使用 mount -a 指令使挂载立即生效
  7. 查询系统整体磁盘使用情况 df -h
  8. 查询指定目录的磁盘占用情况 du -h
参数含义
-s指定目录占用大小汇总
-h带计量单位M、K、G
-a包含文件
-c列出明细的同时,增加汇总值
–max-depth=1子目录深度
  1. 统计指定目录下的文件个数 ls -l /opt | grep "^-" | wc -l
  2. 以树状显示目录结构 tree /opt (安装 tree 指令 yum install tree

19. 网络配置

通过修改配置文件指定 Linux 主机的 IP 地址

  1. vim /etc/sysconfig/network-scripts/ifcfg-ens33

  1. 修改虚拟机设置:编辑 -> 虚拟网络编辑器,修改子网 IP 和网关 IP 与 Linux 虚拟机 IP 处于同一网段

  1. 使配置生效 service network restartreboot
  2. 改主机名 vim /etc/hostname
  3. windows:C:\\Windows\\System32\\drivers\\etc\\hosts 中添加 IP 与主机的对应关系 192.168.222.222 machine
  4. Linux:/etc/hosts
  5. Hosts:一个文本文件,用来记录 IP 和 Hostname 的映射关系
  6. DNS:Domain Name System,是互联网上作为域名和 IP 地址相互映射的一个分布式数据库
  7. 主机名解析机制分析:浏览器先检查浏览器缓存中是否存在该域名对应的 IP,有则完成域名解析;否则检查操作系统的 DNS 解析器缓存中是否存在该域名对应的 IP,有则完成域名解析(即先查看本地解析器缓存);如果在本地解析器缓存中没有找到域名与 IP 的对应映射,则检查系统的 hosts 文件,找到映射关系则完成域名解析;如果在 hosts 文件中仍未找到域名与 IP 的映射关系,则到 DNS 服务器中进行查找
  8. 查看本地域名解析器缓存 ipconfig /displaydns
  9. 清除本地域名解析器缓存 ipconfig /flushdns

20. 进程管理

  1. 在 Linux 中,每一个执行的程序都称为一个进程,每一个进程都分配一个 id(pid 进程号)

  2. ps 指令用来查看当前系统中进程的执行情况

参数含义
-a显示当前终端的所有进程信息
-u以用户的格式显示进程信息
-x显示后台进程

名称含义
USER用户名称
PID进程号
%CPU进程占用 CPU 的百分比
%MEM进程占用物理内存的百分比
VSZ进程占用虚拟内存大小(KB)
RSS进程占用物理内存大小(KB)
TT终端名称(缩写)
STAT进程状态
STARTED进程启动时间
TIMECPU 时间
COMMAND启动进程所用的命令和参数
参数含义
S-睡眠
s-该进程是会话的先导进程
N-进程优先级比普通优先级更低
R-正在运行
D-短期等待
Z-僵死进程
T-被跟踪或被停止
  1. 以全格式显示当前所有进程(包括父进程)ps -ef
  2. 通过进程号杀死进程 kill 7940
  3. 重启 sshd 服务 /bin/system start sshd.service
  4. 通过进程名称杀掉进程(包括子进程)killall gedit
  5. 查看本机终端进程 ps -aux | grep bash ,强制杀掉终端进程 kill -9 8963
  6. 以树状形式显示进程信息并显示用户、进程号信息 pstree -p

21. 服务管理

  1. 服务本质是运行在后台的进程,通常会监听某个端口,等待其它程序的请求,又称为守护进程
  2. 服务管理指令 service servicename [start | stop | restart | reload | status]
  3. service 指令可以管理的服务在 init.d 中查看 ls -l /etc/init.d/
  4. 查看服务名 setup
  5. 开机流程:开机 -> Bios -> /boot -> 启动进程 systemd -> 确定运行级别 -> 启动对应服务
  6. 通过 chkconfig 指令服务在各种运行级别下设置是启动或关闭,chkconfig 指令管理的服务在 /etc/init.d 文件中查看
  7. 查看 chkconfig 管理服务在各级别下的状态 chkconfig --list
  8. 设置服务在某个运行级别下的状态 chkconfig --level 5 servicename on/off,重启系统后生效
  9. systemctl 指令管理的服务在 /usr/lib/systemd/system 中查看
  10. 查看开机过程中的服务启动状态 systemctl list-unit-files
  11. 设置服务开机自启 systemctl enable servicename
  12. 关闭服务开机自启 systemctl disable servicename
  13. 查询某个服务是否开机自启 systemctl is-enabled servicename
  14. 临时关闭防火墙 systemctl stop firewalld.service
  15. 查看某台主机的端口是否可访问 telnet 192.168.222.222 22
  16. 打开端口 firewall-cmd --permanent --add-port=端口号/协议
  17. 关闭端口 firewall-cmd --permanent --remove-port=端口号/协议
  18. 打卡或关闭端口,需重载后方生效 firewall-cmd --reload
  19. 查询端口是否开放 firewall-cmd --query-port=端口号/协议
  20. 查看网络端口情况 netstat -an | more
  21. top 与 ps 命令很相似,都是用来显示正在运行的进程,top 与 ps 最大的不同之处在于 top 在执行一段时间后可以更新正在运行的进程
参数功能
-d 秒数指定 top 命令刷新频率,默认为 3s
-i不显示闲置或僵死的进程
-p指定进程号来动态监控某个进程的状态
  1. 以一定顺序并显示进程信息的方式显示网络情况 netstat -anp | more

22. rpm 和 yum

  1. rpm 用于互联网下载包的打包及安装工具,它包含在某些 Linux 发行版中。它生成 .rpm 扩展名的文件。RPM 是 ReadHat Package Manager 的缩写,类似 windows 中的 setup.exe
  2. 查询已安装的 rpm 列表 rpm -qa
  3. 查询软件包是否安装 rpm -q firefox
  4. 查询软件包详细信息 rpm -qi firefox
  5. 查询软件包安装后生成了哪些文件 rpm -ql firefox
  6. 查询文件归属于哪个软件包 rpm -qf /etc/passwd
  7. 强制删除软件包 rpm -e --nodeps firefox
  8. 安装 rpm 包 rpm -ivh rpmurl(i:install、v:verbose(提示)、h:hash(进度条))
  9. yum 是一个 shell 前端软件包管理器。基于 RPM 包管理,能够从指定的服务器自动下载 rpm 包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软件包
  10. 查询 yum 服务器是否存在需要的软件包 yum list | grep packagename
  11. 安装指定的 yum 包 yum install packageurl

23. 搭建 JavaEE 环境

  1. 安装配置 Oracle Java 8

    1. 通过 Xftps6 将 jdk 压缩文件上传到 Linux /opt 目录下
    2. 解压压缩文件 tar -zxvf jdk-8u311-linux-x64.tar.gz
    3. 自定义 jdk 安装目录 mkdir /usr/local/java
    4. 移动解压包到自定义目录 mv /opt/jdk1.8.0_311 /usr/local/java
    5. 配置环境变量 vim /etc/profile
    6. export JAVA_HOME=/usr/local/java/jdk1.8.0_311
    7. export PATH=$JAVA_HOME/bin:$PATH
    8. 使环境变量配置立即生效 source /etc/profile
  2. 安装配置 tomcat8

    1. 上传压缩文件到 /opt 目录下
    2. 解压 tar -zxvf apache-tomcat-8.5.59.tar.gz
    3. 自定义 tomcat 目录 mkdir /usr/local/tomcat
    4. 移动解压包到自定义目录 mv apache-tomcat-8.5.59 /usr/local/tomcat/
    5. 进入 tomcat bin 目录下启动 tomcat cd /usr/local/tomcat/apache-tomcat-8.5.59/bin/ ./startup.sh
    6. 开放 8080 端口 firewall-cmd --permanent --add-port=8080/tcp
    7. 重载即刻开放端口 firewall-cmd --reload
  3. 安装配置 MySQL5.7

    1. 删除 CentOS7.6 自带的数据库类 MySQL 数据库 mariadb
    2. 查询与 mariadb 相关的软件包 rpm -qa | grep mari
    3. 依次移除两个软件包 rpm -e --nodeps mariadb-libs-5.5.60-1.el7_5.x86_64rpm -e --nodeps marisa-0.2.4-4.el7.x86_64
    4. 从网络下载 MySQL 软件压缩包 wget http://dev.mysql.com/get/mysql-5.7.26-1.el7.x86_64.rpm-bundle.tar
    5. 解压压缩包 tar -xvf mysql-5.7.26-1.el7.x86_64.rpm-bundle.tar
    6. 依次安装 MySQL rpm 包
      • rpm -ivh mysql-community-common-5.7.26-1.el7.x86_64.rpm
      • rpm -ivh mysql-community-libs-5.7.26-1.el7.x86_64.rpm
      • rpm -ivh mysql-community-client-5.7.26-1.el7.x86_64.rpm
      • rpm -ivh mysql-community-server-5.7.26-1.el7.x86_64.rpm
    7. 启动 MySQL 服务 systemctl start mysqld.service
    8. 查询 root 密码 grep "password" /var/log/mysqld.log
    9. 登录 MySQL mysql -u root -p
    10. 设置密码设置提示策略 set global validate_password_policy=0;
    11. 重置 root 密码 set password for 'root'@'localhost' =password('yourpassword');
    12. 使密码立即生效 flush privileges;

24. Shell 编程

  1. Shell 是一个命令解释器,它为用户提供了一个向 Linux 内核发送请求以便运行程序的界面系统级程序,用户可以用 Shell 来启动、挂起、停止和编写一些程序
  2. 脚本以 #!/bin/bash 开头,脚本需要有可执行权限

  1. Linux 中 Shell 变量分为系统变量和用户自定义变量,系统变量如 $HOME、$PWD、$SHELL、$USER 等
  2. 定义变量:变量名=值;撤销变量:unset 变量名;声明静态变量:readonly变量,只读指令不支持 unset
  3. 变量定义规则:变量名称可以由字母、数字和下划线组成,不能以数字开头;等号两侧不能有空格;变量名一般大写
  4. 将命令的返回值赋给变量 A=`date` <=> A=$(date)
#!/bin/bash
# 定义变量A
A=100
echo A=$A
# 撤销定义变量A
unset A
echo A=$A
# 定义静态变量B,不可 unset
readonly B=200
echo B=$B
  1. 将 shell 变量输出为环境变量(全局变量)export 变量名=值

  2. 让配置文件立即生效 source 配置文件

  3. 查询环境变量的值 echo $变量名

  4. shell 脚本的多行注释 :<<! content !

  5. $n:n 为数字,$0 代表命令本身,$1-$9 代表第 1 到第 9 个参数,10 以上的参数,10 以上的参数需要用花括号包含,如 $10

  6. $*:命令行中的所有参数,$* 把所有的参数看成一个整体

  7. $@:命令行中的所有参数,$@ 把每个参数区分对待

  8. $#:命令行中所有参数的个数

#!/bin/bash
# 依次输出每一个参数变量
echo args0=$0
echo args1=$1
echo args2=$2
# 整体输出所有参数
echo args=$*
# 区别输出所有参数
echo args_=$@
# 输出参数个数
echo args_nums=$#
  1. $$:当前进程的进程号
  2. $!:后台运行的最后一个进程的进程号
  3. $?:最后一次执行的命令的返回状态。0 - 命令正确执行;!0 - 执行出错
  4. 以后台方式运行脚本 sh /home/var.sh &
  5. $((运算表达式)) <=> $[运算表达式] <=> expr m + n,使用 expr 时运算符间有空格,希望将结果赋值给变量时使用反引号 `
  6. expr \\* / %
符号功能
=字符串比较是否相等
-lt小于
-le小于等于
-eq等于
-gt大于
-ge大于等于
-ne不等于
-r有读权限
-w有写权限
-x有执行权限
-f文件存在并且是一个常规文件
-e文件存在
-d文件存在并且是一个目录
  1. [ condition ],condition 前后需要有空格,非空返回 true,可以用 $? 进行验证,0 为 true,>1 为 false
# 分支格式
#!/bin/bash
if [ "ok" = "ok" ]
then 
    echo "equal"
elif[ "lcx" = "lcx" ]
    echo "not equal"
else
	echo "quit"
fi

# case 语句
#!/bin/bash
case $1 in
"1")
echo "Monday"
;;
"2")
echo "Tuesday"
;;
*)
echo "other"
;;
esac

# for 循环 1
#!/bin/bash
# $* 将命令行参数看作一个整体,所以 for 循环只执行一次
for i in "$*"
do
        echo "args is $i"
done
echo "==========="
# $@ 区别对待各个命令行参数,所以有几个参数 for 循环执行>几次
for j in "$@"
do
        echo "args is $j"
done

# for 循环 2
#!/bin/bash
SUM=0
for(( i=1; i<=$1; i++))
do
        SUM=$[ $SUM+$i ]
done
echo "sum = $SUM"

# while 循环
#!/bin/bash
SUM=0
i=0
while [ $i -le $1 ]
do
        SUM=$[$SUM+$i]
        i=$[ $i+1 ]
done
echo "The result is $SUM"

# read 读取输入
#!/bin/bash
# 读取控制台输入的一个值
read -p "Please input a number:" NUMBER
echo "The number that you entered is $NUMBER"
# 读取用户 10s 内输入的一个值
read -t 10 -p "Please input a number:" NUMBER1
echo "The number you entered is $NUMBER1"
  1. 系统函数:basename:返回文件名;dirname:返回文件路径,不包含文件名
  2. 自定义函数
#!/bin/bash
# Define the funtion
function getSum() 
        SUM=$[$n1+$n2]
        echo "Sum is $SUM"


read -p "Input the first number:" n1
read -p "Input the second number:" n2

# Call the function
getSum $n1 $n2

25. Shell 之定时备份数据库

# 每天凌晨 2:30 定时备份指定的数据库,同时检查 10 天前的备份文件是否存在,存在则删除
DIRECTORY=/data
DATETIME=$(date +%Y%m%d%H%M%S)
DB_HOST=localhost
DB_USER=root
DB_PWD=2020@mywife
DB_NAME=mine

# If the save directory not exists, then create it
[ ! -d "$DIRECTORY/$DATETIME" ] && mkdir -p "$DIRECTORY/$DATETIME"

# Backup the database
mysqldump -h$DB_HOST -u$DB_USER -p$DB_PWD $DB_NAME > $DIRECTORY/$DATETIME/$DB_NAME.sql

# Compress the backup file
cd /$DIRECTORY
tar -zcvf $DIRECTORY/$DATETIME.tar.gz $DATETIME
rm -rf $DIRECTORY/$DATETIME

# Delete the file that existing more than 10 days
find $DIRECTORY -atime +10 -name "*.tar.gz" -exec rm -rf  \\;
echo "Backup databse named $DB_NAME successfully"

# 定时调用脚本
crontab -e
30 2 * * * /home/bash/backup_mysql_mine.sh

26. apt 和 ssh 远程登录

  1. apt 是 Advanced Packaging Tool 的简称,是一款安装包管理工具。在 Ubuntu 下,可以使用 apt 命令进行软件包的安装、删除、清理等,类似于 windows 中的软件管理工具
  2. 查看 apt 配置文件 cat /etc/apt/sources.list
命令功能
sudo apt-get update更新源
sudo apt-get install package安装包
sudo apt-get remove package删除包
sudo apt-cache show package获取包的相关信息
sudo apt-get source package下载该包的源代码
sudo apt-cache search package搜索软件包
sudo apt-get install package --reinstall重新安装软件包
sudo apt-get -f install修复安装
sudo apt-get remove package --purge彻底删除包,包括配置文件等
sudo apt-get build-dep package安装相关的依赖环境
sudo apt-get upgrade更新已安装的包
sudo apt-get dist-upgrade升级系统
sudo apt-cache depends package查询该软件包所依赖的包
sudo apt-cache rdepends package查询该包被那些包依赖
  1. 清华大学开源软件镜像站 https://mirrors.tuna.tsinghua.edu.cn

  2. 备份配置文件 cp /etc/apt/sources.list /etc/apt/sources.list.backup

  3. 将原配置文件置空 echo '' > sources.list

deb http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse

deb http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse

deb http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse

deb http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse

deb http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
  1. 更新源地址 sudo apt-get update
  2. 安装软件 sudo apt-get install vim
  3. 查看软件信息 sudo apt-cache show vim
  4. 删除软件 sudo apt-get remove vim
  5. SSH 为 Secure Shell 的缩写,由 IETF 的网络工作小组所制定,SSH 为建立在应用层与传输层基础上的安全协议
  6. 安装 netstat 指令 sudo apt install net-tools
  7. 在 Ubuntu 上安装 SSH 客户端和服务端 sudo apt-get install openssh-server
  8. 启动 sshd 服务 service sshd restart
  9. 从 Linux 登录到别的 Linux ssh root@192.168.222.222

27. 日志管理

  1. 日志文件是重要的系统信息文件,记录了许多重要的系统事件,包括用户的登录信息、系统的启动信息、系统的安全信息、邮件相关信息、各种服务相关信息等
日志文件说明
/var/log/boot.log系统启动日志
/var/log/cron记录与系统定时任务相关的日志
/var/log/lasllog记录系统中所有用户最后一次的登录事件的日志。二进制文件,需使用 lastlog 命令查看
/var/log/mailog记录邮件信息的日志
/var/log/message记录系统重要消息的日志。系统出现问题时检查首选
/var/log/secure记录验证和授权方面的信息,只要涉及账户和密码的程序都会记录
/var/run/ulmp记录当前已经登陆的用户信息。此文件随用户登录、注销不断变化,只记录当前登录用户的的信息。需使用 w、who、users 等命令查看
/var/log/cups记录打印信息的日志
/var/log/dmesg记录了系统开机时内核自检的信息。可使用 dmesg 命令直接查看内核自检信息
/var/log/btmp记录错误登录的日志。二进制文件,需使用 lastb 命令查看
/var/log/wtmp永久记录所有用户的登录、注销信息,同时记录系统的启动、重启关机事件。二进制文件,需使用 last 命令查看
  1. 查看系统中的 rsyslogd 服务是否启动 ps aux | grep "rsyslog" | grep -v "grep"

  2. 查询 rsyslogd 服务的自启动状态 systemctl list-unit-files | grep rsyslog

  3. /etc/rsyslog.conf 文件内容说明,编辑格式为 *.* ,第一个 * 代表日志类型,第二个 * 代表日志级别

关键字说明
auth##pam产生的日志
authpriv##shh、ftp等登录信息的验证信息
corn##时间任务相关
kern##内核
lpr##打印
mail##邮件
mark(syslog)-rsyslog##服务内部信息,时间标识
news##新闻组
user##用户程序产生的相关信息
uucp##unix to unix copy 主机之间相关的通信
local 1-7自定义的日志设备
关键字说明
debug##有调试信息的,日志通信最多
info##一般信息日志,最常用
notice##最具有重要性的普通条件的信息
warning##警告级别
err##错误级别,阻止某个功能或模块不能正常工作的信息
crit##严重级别,阻止整个系统或整个软件不能正常工作的信息
alert##需要立即修改的信息
emerg##内核崩溃等重要信息
none##什么不记录
  1. 查看日志服务配置文件 cat /etc/rsyslog.conf
  2. 查看日志信息 cat /var/log/secure
  3. 自定义日志服务:在 /etc/rsyslog.conf 中添加规则:当有事件发送时(比如 sshd 服务相关事件),将相关信息保存到 /var/log/custom.log 文件中
  4. 日志轮替:把旧的日志文件移动并改名,同时建立心得空日志文件,当旧日志文件超出保存范围之后,就会进行删除
  5. CentOS7 使用 logrotate 进行日志轮替管理,要想改变日志轮替文件名字,通过 /etc/logrotate.conf 配置文件中的 “dateext” 参数
  6. 如果配置文件中有 “dateext” 参数,那么日志会用日期来作为日志文件的命名,如 “secure-20201010”。这样日志文件名不会重复,只需要指定保存日志文件个数,删除多余的日志文件即可
  7. 如果配置文件中没有 “dateext” 参数,当第一次进行日志轮替时,当前的 “secure” 会重命名为 “secure.1”,然后新建 “secure” 文件来保存新的日志。当第二次进行日子轮替时,“secure.1” 会重命名为 “secure.2”,“secure” 重命名为 “secure.1” 用以保存新的日志,以此类推
  8. 查看日志轮替策略 cat /etc/logrotate.conf
  9. /etc/logrotate.conf 配置文件参数说明
参数含义
daily轮替周期是天
weekly轮替周期是周
monthly轮替周期是月
rotate digit保留的日志文件的个数。0 指没有备份
compress旧的日志文件进行压缩
create mode owner group建立新的日志文件同时指定新日志的权限、所有者、所属组
mail address日志轮替时,发送内容到指定邮件地址
missingok如果日志不存在,则忽略该日志的警告信息
notifempty如果日志为空文件,则不进行日志轮替
minsize size日志轮替的最小值
size 大小大于指定大小才轮替,而不是按照时间轮替
dateext使用日期作为日志轮替文件的后缀
sharedscripts在此关键字之后的脚本只执行一次
prerotate/endscript在日志轮替之前执行脚本命令
postrotate/endscript在日志轮替时候执行脚本命令
  1. 自定义日志轮替:第一种方法是直接在 /etc/logrotate.conf 配置文件中写入该日志的轮替策略;第二种方法是在 /etc/logrotate.d 目录中新建该日志的轮替文件,在该轮替文件中写入正确的轮替策略,因为该目录中的文件都会被 “include” 到主配置文件中
  2. 日志轮替依赖于系统定时任务。在 /etc/cron.daily/logrotate,logrotate.conf 通过这个文件依赖定时任务执行
  3. 查看全部内存日志 journalctl
  4. 查看最新 3 条内存日志 journalctl -n 3
  5. 查看指定时间段间的内存日志 journalctl --since 19:00 --until 19:10:10
  6. 查看报错内存日志 journalctl -p err
  7. 查看日志详细内容 journalctl -o verbose
  8. 查看指定信息日志 以上是关于[Linux]Linux 基础知识常用命令和 Shell 脚本的主要内容,如果未能解决你的问题,请参考以下文章

    Linux中的sh命令的详细解释

    Linux操作系统基础及常用命令

    Linux Jboss下常用命令

    sh 常用的Linux命令

    sh Linux的常用命令

    linux后台运行、关闭、查看后台任务常用命令