linux基础内容,掌握这些基本可以流畅的使用linux系统

linux初识

  1. cd /opt 进入opt目录
  2. tar -zxvf xx.tar.gz 解压
  3. ./xx-install.pl 安装
  4. pwd 显示当前用户在哪个目录
  5. linux中,隐藏文件是以.开头的
  6. ls 可以查看当前目录的内容,包括文件和文件夹
    1. ls -a 显示隐藏文件
    2. ls -l 单列(详细的)显示目录内容
    3. ls -al 混合显示
    4. ls -al /root 单列显示root的所有文件

linux目录结构介绍

  1. linux只有没有盘符,只有一个根目录/,windows中,我们可以有c,d,e盘,但是也可以改名为文件盘,游戏盘等等,但是在linux中,/不可以修改名字
  2. 根目录下,有许多目录
    1. root : 系统管理员(超级权限者)的用户主目录
    2. home : 家目录,存放普通用户的主目录,每创建一个用户,家目录下会增加对应的一个文件夹
    3. bin : binary,放置常用的命令
    4. sbin : super binary ,系统管理员使用的系统管理程序
    5. etc : 配置文件,比如你安装了mysql,那么该目录下就有mysql的配置文件
    6. boot : linux启动的时候需要的核心文件,以及一些连接文件和映射文件
    7. dev : device,设备管理器,linux中一切皆文件,硬件也会映射成为一个文件来管理
    8. lib : 系统开机所需要的最基本的动态连接共享库,作用类似于win的ddl文件,几乎所有的应用程序都需要用到这些共享库
    9. lost+found : 一般为空,系统非法关机后,这里就有了一些文件,隐藏的,可以通过ls查看
    10. usr : 非常重要的目录,用户的很多应用程序和文件都放在这个目录下面,类似于win下的program files目录
    11. proc(不要动) : 虚拟目录,系统内存的映射,访问这个目录来获得系统信息
    12. srv(不要动) : service,该目录存放一些服务启动之后需要提供的数据
    13. sys(不要动) : linux2.6很大的一个变化,该目录下安装了2.6内核新出现的一个文件系统sysfs
    14. tmp : 存放临时文件
    15. media : linux会自动识别一些设备,例如u盘,光驱等等,当识别后,linux会把识别的设备挂到该目录下
    16. mnt : 系统提供该目录是为了让用户临时挂载别的文件系统的,我们可以将外部的存储挂在/mnt/上,然后进入该目录就可以查看里面的内容了,比如我们的共享文件夹
    17. opt : 给主机额外安装软件所摆放的内容,如安装oracle数据库就可以放置到该目录下,默认为空,注意,这里面存放的是安装文件,而不是安装后产生的软件
    18. /usr/local : 给主机额外安装软件所需的目录,一般是通过编译源码方式所安装的程序,安装后产生的软件就在这里
    19. var : 存放不断扩充的东西,经常被修改的目录放在这个目录下面,包括各种日志文件

远程登录xshell

  1. xshell,可以使得我们用户远程连接linux系统,因为实际开发中,linux并不会在本机,而是布置在远端,开发程序员需要远程登录linux系统并使用,这里就需要xshell
  2. 首先要知道linux的主机ip,我们可以在linux的终端输入ifconfig,来得知ip地址
  3. 然后打开xshell,建立连接,输入ip地址,然后输入对应的linux的用户名和密码(例如用户名root,密码root)
  4. 之后就可以远程操纵linux系统

文件的上传和下载xftp

  1. xftp使得我们可以在win和linux之间传输数据
  2. 建立连接的时候,记得要选择sftp协议,端口号为22
  3. 如果建立连接失败,检查linux的ip地址是否正确,是否改变过

vi和vim

  • vi和vim的三种模式

    1. 正常模式 : 以vim打开一个文件就进入了正常模式,在这个模式中,你可以使用上下左右按键来移动光标,你可以使用删除字符或删除整行来处理文档内容,也可以使用赋值.粘贴来处理你的文件数据
    2. 插入模式 : 按下i I o O a A r R字母后才可以进入编辑模式,一般按i就可以,摁esc退出插入模式
    3. 命令行模式 : 输入:进入命令行模式,在这个模式中,可以提供你相关指令,完成读取,存盘,替换,离开vim,显示行号等动作
      1. wq : 写入并退出
      2. q : 退出
      3. q! : 强制退出,不保存
  • 写一个简单的c++程序并运行

    1. 首先,打开终端,输入vim hello.cpp
    2. 然后摁i进入编辑模式,输入以下代码
    #include
    using namespace std;
    int main()
    {
        cout << "hello world" << endl;
        return 0;
    }
    
    1. 保存后,在终端中输入 g++ hello.cpp, 就会生成一个 a.out 可执行文件(这里注意,wim平台下生成的应该是.exe文件)
    2. 如果想限定生成的可执行文件的名称,使用代码 g++ hello.cpp -o hjl即可
    3. 输入 ./hjl执行,终端输出 hello world
  • 快捷键

    1. 拷贝当前行 yy , 拷贝当前行向下的5行-> 5yy ,并粘贴
    2. 删除当前行 dd , 删除当前行向下的5行-> 5dd
    3. 在文件中查找某个单词(命令行模式下 /关键字 回车就开始查找,输入n就是查找下一个)
    4. 设置文件的行号,取消文件的行号(命令行模式下 : set nu 和 :set nonu)
    5. 编辑/etc/profile文件,使用快捷键到该文档的最末行G和最首行gg
    6. 在一个文件中输入内容后 ,撤销 u
    7. 编辑/etc/profile文件,并将光标移动到 20 行 shift + g

关机&重启命令

  1. shutdown -h now 立即进行关机 h->halt 停止
  2. shutdown -h 1 一分钟后关机
  3. shutdown -r now 现在重新启动计算机
  4. halt 关机
  5. reboot 重启
  6. sync 把内存的数据同步到硬盘
注意 : 
    不论是重新启动还是关机,首先要运行sync命令,把内存的数据写入到硬盘中
    目前的shutdown/halt/reboot指令均会在关机前进行sync,但是小心驶得万年船

用户相关

用户登录和注销

  • 基本介绍
    1. 登录的时候尽量不要使用root用户,其实实际开发中,我们也不会有root用户,root用户是系统管理员,有最大的权限,避免操作失误,可以利用平普通用户登录,登录后在用sudo - 用户名来切换成系统管理员身份,注意-和用户名之间有空格
    2. 在提示符下输入logout即可注销用户
  • 使用细节
    1. logout注销指令在图形运行级别无效,在运行级别3下有效
    2. 运行级别这个概念,后面介绍

创建用户

  1. useradd milan 创建用户名称为milan的用户
  2. useradd -d /home/test king 创建名称为king的用户,对应的工作目录为 home/test 而不是默认的home/king

指定/修改密码

  1. passwd milan 给用户milan设置密码

删除用户

  1. 删除用户milan,但是保留milan家目录 userdel milan
  2. 删除用户以及用户的目录 userdel -r milan
  • 一般情况下,我们建议保留家目录

查询用户信息

  • `id 用户名

切换用户

  • su - 要切换的用户名
  • 细节说明 :
    1. 从权限高的用户切换到权限低的用户,不需要输入密码,反之需要
    2. 当需要返回原来用户时,使用exit/logout指令

查看第一次登录的用户信息

  • who am i

用户组

  • 介绍 :
类似于角色,系统可以对有共性/权限的多个用户进行统一的管理
  • 新增组 : groupadd 组名
  • 删除组 : groupdel 组名
  • 增加用户的时候直接进组 : `useradd -g 用户组 用户名,如果创建用户的时候没有指定组,那么会创建一个和用户名相同的组名,然后将用户放到该组
  • 修改用户的组 : usermod -g 新用户组名 用户名 例如 usermod -g mojiao king

用户组和相关的文件

  1. etc/passwd :
用户的配置文件,记录用户的各种信息
每行的含义 :
    用户名:口令:用户标识号:组标识号:注释性描述:主目录:登录shell
  1. etc/shadow :
口令的配置文件
每行的含义 : 
    登录名:加密口令:最后一次修改时间:最小时间间隔:最大时间间隔:警告时间:不活动时间:失效时间:标志
  1. etc/group :
组(group)的配置文件,记录linux包含的组的信息
每行含义 : 
    组名:口令:组标识号:组内用户列表

运行级别

  • 运行级别说明:
0 :关机
1 :单用户【找回丢失密码】 
2:多用户状态没有网络服务 
3:多用户状态有网络服务 
4:系统未使用保留给用户 
5:图形界面 
6:系统重启 
常用运行级别是 3 和 5 ,也可以指定默认运行级别, 后面演示
  • 应用实例 : init [0123456] 应用案例: 通过 init 来切换不同的运行级别,比如动 5-3 , 然后关机。
在 centos7 以前, /etc/inittab 文件中 . 进行了简化 ,如下: 
multi-user.target: analogous to runlevel 3 
graphical.target: analogous to runlevel 5 
# To view current default target, run: systemctl get-default 
# To set a default target, run: systemctl set-default TARGET.target


在终端输入
systemctl set-default multi-user.target

找回root密码

  • 如何找回root密码

帮助指令

  • man获得帮助信息 例如 : man ls
基本语法 : man[命令或配置文件](功能描述 : 获得帮助信息)
案例 : 查看ls命令的帮助信息
  • help指令
基本语法 : help 命令(功能描述 : 获得shell内置命令的帮助信息)
  • 应用实例 : 查看cd命令的帮助信息
  • 百度帮助更直接

文件目录类

1 pwd

  1. 基本语法 : pwd
  2. 功能描述 : 显示当前工作目录的绝对路径

2 ls

  1. 基本语法 : ls
  2. 常用选项
    1. -a
    2. -l
    3. -h 方便人阅读的方式展示,比如将文件大小有bit变为M

3 cd指令

  1. 基本语法 : cd 参数(根据参数切换到指定目录)
  2. cd ~ ->回到家目录,如果只写cd,默认也是回到家目录
  3. cd … -> 回到上一级目录
  4. 这里需要理解绝对路径和相对路径

4 mkdir (make directory)

  • 用于创建目录
  • 基本语法 : mkdir [选项] 要创建的目录
  • 常用选项 :
    1. -p 创建多级目录
  • 应用实例 :
    1. 创建一个目录 /home/dog mkdir /home/dog
    2. 创建多级目录 /home/animal/tiger mkdir -p /home/animal/tiger

5 rmdir (remake directory)

  • 用于删除空目录(注意,首先是空的,其次是目录而不是文件)
  • 基本语法 : rmdir [选项] 要删除的空目录
  • 应用实例 : 删除目录 /home/dog
  • 提示 : 如果要删除非空目录 ,需要使用 rm -rf 要删除的目录 但是使用该命令要非常的谨慎

6 touch指令

  • touch指令创建空文件
  • 基本语法 : touch 文件名称
  • 应用实例 : 创建一个空文件 hello.txt touch hello.txt

7 cp指令

  • cp指令拷贝文件到指定目录
  • 基本语法 : cp [选项] source(源地址) dest(目的地址)
  • 常用选项 : -r 递归复制整个文件夹
  • 应用实例 :
    1. 将home/hello.txt 拷贝到 /home/bbb 目录下 cp /home/hello.txt bbb/
    2. 递归复制整个文件夹,将/home/bbb整个目录,拷贝到/opt目录下 cp -r /home/bbb /opt/
  • 强制覆盖不提示的方法 : 因为如果目的地址以及存在源地址文件,那么这个时候拷贝会针对每个文件询问一次,是否确认覆盖,如果文件夹内容非常多的话,是非常麻烦的 使用命令 : \cp -r /home/bbb /opt 就可以强制覆盖,不提示方法

8 rm指令

  • rm指令移除文件或目录
  • 基本语法 : rm [选项] 要删除的文件或目录
  • 常用选项 :
    1. -r : 递归删除整个文件夹,删除每个文件或目录的时候,都会询问确认删除吗?如果不想被询问,可以-f
    2. -f : 强制删除不提示
  • 应用案例 :
    1. 将/home/hello.txt删除 rm /home/hello.txt
    2. 递归删除整个文件夹 /home/bbb rm -r /home/bbb
    3. 强制删除目录 rm -rf /home/bbb

9 mv指令

  • 移动文件与目录或给文件重命名
  • 基本语法 :
    1. 重命名 : mv oldNameFile newNameFile
    2. 移动文件 : mv /temp/movefile /targetFolder
    3. 总是,如果是同一个目录,就是重命名,如果是不同目录,就是移动文件
  • 应用案例 :
    1. 将home/cat.txt 文件重命名为 pig.txt mv /home/cat.txt /home/pig.txt
    2. 将home/pig .txt文件移动到 /root 目录下 mv /home/pig.txt /root,如果是mv home/pig.txt home/cat.txt 就是移动并重命名
    3. 移动整个目录,比如将 /opt/bbb 移动到 /home下 mv /opt/bbb /home

10 cat指令

  • cat指令查看文件内容
  • 基本语法 : cat [选项] 要查看的文件
  • 常用选项 : -n 显示行号
  • 应用实例 : /etc/profile 文件内容,显示行号 cat -n /etc/profile
  • 使用细节 : cat只可以浏览文件,而不可以修改文件,为了浏览方便,一般会带上管道命令 |more cat -n /etc/profile | more[进行交互]
  • 管道命令 : 将上一个命令的结果交给下一个命令来处理

11 more指令

  • more指令是一个基于vi编辑器的文本过滤器,他一次显示全屏幕的文本内容,而不是全部,你可以通过摁快捷键来继续处理,比如摁enter,就可以再看下一行,摁space可以看下一页
  • 基本语法 : more 要查看的文件名
  • 快捷键
    1. space : 下一页
    2. enter : 下一行
    3. q : 离开more,不再显示该文件内容
    4. ctrl + F : 向下滚动一屏
    5. ctrl + B : 返回上一屏
    6. = : 输出当前行的行号
    7. :f : 输出文件名和当前行号

12 less指令

  • less指令用来分屏查看内容,与more指令相似但是不同之处在于,less在显示文件内容的时候,并不是一次性全部加载并显示,而是根据需要加载内容,对于大型文件有较高的效率
  • 基本语法 : less 要查看的文件
  • 操作 :
    1. space : 下一页
    2. pagedown : 下一页
    3. pageup : 上一页
    4. /字串 : 向下寻找字串,n向下,N向上
    5. ?字串 : 向上寻找字串,n向上,N向下
    6. q : 离开
  • 应用实例 : 使用less查看一个大型文件 /opt/杂文.txt

13 echo指令

  • 输出内容到控制台
  • 基本语法 : echo [选项] [输出内容]
  • 应用案例 :
    1. 使用echo指令输出环境变量和主机名称 echo $PATH echo $HOSTNAME
    2. 使用echo指令输出hello,world! echo hello,world!

14 head指令

  • 显示文件的开头部分,默认情况,head指令显示文件的前10行
  • 基本语法 :
    1. head 文件,显示文件的前10行
    2. head -n 5 文件 查看文件的前5行

15 tail指令

  • 显示文件的尾部内容
  • 基本语法
    1. tail 文件
    2. tail -n 5 文件
    3. tail -f 文件 实时追踪该文档的所有更新,退出追踪ctrl + c
    例如 : 实时监控mydate.txt,看看文件是否有变化,是否看到实时的追加
    touch mydate.txt
    tail -f /heme/mydate.txt
    这个时候打开另一个终端输入 : 
    echo > hello world > /home/mydate.txt
    

16 >和>>

  • />是输出重定向,>>是追加
  • 基本语法 :
    1. ls -l > 文件 列表的内容写入文件中
    2. ls -al >> 文件 列表的单列内容追加写入文件中
    3. cat 文件1 > 文件2 将文件1的内容覆盖到文件2
    4. echo 内容 >> 文件,将文件1的内容覆盖到文件2
  • 应用实例 :
    1. 将/home下的目录列表写入到 /home/info.txt ls -l > /home/info.txt,如果info不存在,系统会为我们创建
    2. 将当前的日历信息 追加到 /home/mycal中 ``

17 ln指令

  • 软链接也称之为符号链接,类似于windows里面的快捷方式,主要存放了链接其他文件的路径
  • 基本语法 : ln -s [原文件或目录] [软链接名] 给原文件创建一个软连接
  • 应用案例 :
    1. 在/home下创建一个软链接myroot,链接到/root目录 ln -s /root /home/myroot
    2. 删除软链接 rm /home/myroot
  • 细节说明 : 使用pwd查看目录的时候,仍然看到的是软链接所在目录
[root@hjl home]# ln -s /root /home/myroot
[root@hjl home]# cd /home/myroot
[root@hjl myroot]# pwd
/home/myroot 而不是 /root

18 history

  • 查看已经执行过的命令,也可以执行历史命令
  • 基本语法 : history
  • 应用实例 :
    1. 显示所有的历史命令 history
    2. 显示最近使用的10个历史命令 history 10
    3. 执行历史编号为5的指令 !5

时间日期类指令

1 date

  • 显示当前日期
  • 基本语法 :
    1. date (功能描述:显示当前时间)
    2. date +%Y(功能描述:显示当前年份)
    3. date +%m(功能描述:显示当前月份)
    4. date +%d(功能描述:显示当前是哪一天)
    5. date “+%Y-%m-%d %H:%M:%S”(功能描述:显示年月日时分秒)
  • 应用案例
    1. 显示当前时间信息 date
    2. 显示当前时间年月日 date "+%Y-%m-%d"
    3. 显示当前时间年月日时分秒 date "+%Y %m %d %H:%M:%S

2 date设置日期

  • 基本语法 :date -s 字符串时间
  • 应用实例 :
    1. 设置系统当前时间 , 比如设置成 2020-11-03 20:02:10 date -s "2020-11-03 20:02:10"

3 cal

  • 查看日历
  • 基本语法 : cal [选项] 如果不加选项,显示当月日历
  • 应用案例
    1. 显示当前日历 : cal
    2. 显示2020年日历 : cal 2020

搜索查找类

1 find

  • find指令将从指定目录向下递归的遍历其各个子目录,将满足条件的文件或者目录显示在终端
  • 基本语法 : find [搜索范围] [选项] 搜索范围 : 在哪个目录下查找
  • 选项说明 :
    1. -name<查询方式> 按照指定的文件名查找模式查找文件
    2. -user<用户名> 查找属于指定用户名的所有文件
    3. -size<文件大小> 查找指定的文件大小查找文件
  • 应用实例
    1. 按文件名:根据名称查找/home 目录下的 hello.txt 文件 find /home -name hello.txt
    2. 按拥有者:查找/opt 目录下,nobody用户的文件 find /opt -user nobody
    3. 查找整个 linux 系统下大于 200M的文件(+n 大于 -n 小于 n 等于, 单位有 k,M,G)find / -size +200M

2 locate

  • locate 指令可以快速定位文件路径。locate 指令利用事先建立的系统中所有文件名称及路径的 locate 数据库实现快速定位给定的文件。Locate 指令无需遍历整个文件系统,查询速度较快。为了保证查询结果的准确度,管理员必须定期更新locate 时刻
  • 基本语法 : locate 搜索文件
  • 特别说明 : 由于 locate 指令基于数据库进行查询,所以第一次运行前,必须使用 updatedb 指令创建 locate 数据库。
  • 应用实例 :
    1. 请使用 locate 指令快速定位 hello.txt 文件所在目录 locate hello.txt

3 which指令

  • 可以查看某个指令在哪个目录下 比如ls指令which ls

4 grep

  • grep过滤查找,管道符,|,表示将前一个命令的处理结果输出传递给后面的命令处理。
  • 基本语法 : grep [选项] 查找内容 源文件
  • 常用选项
    1. -n 显示匹配行和行号
    2. -i 忽略字母大小写
  • 应用实例 :
    1. 请在 hello.txt 文件中,查找 “yes” 所在行,并且显示行号
      1. 写法1 : cat /home/hello.txt | grep -n yes
      2. 写法2 : grep -n yes /home/hello.txt

压缩和解压

1 gzip/gunzip 指令

  • gzip 用于压缩文件, gunzip 用于解压的
  • 基本语法 :
    1. gzip 文件 (功能描述:压缩文件,只能将文件压缩为*.gz 文件)
    2. gunzip 文件.gz (功能描述:解压缩文件命令)
  • 应用实例 :
    1. gzip 压缩, 将 /home 下的 hello.txt 文件进行压缩 gzip /home/hello.txt
    2. gunzip 压缩, 将 /home 下的 hello.txt.gz 文件进行解压缩 gunzip /home/hello.txt.gz

2 zip/unzip 指令

  • zip 用于压缩文件, unzip 用于解压的,这个在项目打包发布中很有用的
  • 基本语法 :
    1. zip [选项] XXX.zip 将要压缩的内容(功能描述:压缩文件和目录的命令)
    2. unzip [选项] XXX.zip (功能描述:解压缩文件)
  • 常用选项
    • zip的 -r:递归压缩,即压缩目录
    • unzip的 -d<目录> :指定解压后文件的存放目录
  • 应用实例 :
    1. 将 /home 下的 所有文件/文件夹进行压缩成myhome.zip zip -r /home/ myhome.zip
    2. 将 myhome.zip 解压到 /opt/tmp 目录下 unzip -d /opt/tmp /home/myhome.zip

3 tar 指令

  • tar 指令 是打包指令,最后打包后的文件是 .tar.gz 的文件。
  • 基本语法 : tar [选项] XXX.tar.gz 打包的内容 (功能描述:打包目录,压缩后的文件格式.tar.gz)
  • 选项说明 :
    1. -c : 产生.tar打包文件
    2. -v : 显示详细信息
    3. -f : 指定压缩后的文件名
    4. -z : 对文档进行解压或压缩
    5. -x : 解包tar文件
  • 应用实例
    1. 压缩多个文件,将 /home/pig.txt 和 /home/cat.txt 压缩成 pc.tar.gz tar -zcvf pc.tar.gz /home/pig.txt /home/cat.txt 注意,压缩的时候会保存目录架构,比如说我们的打包压缩命令是tar -zcvf pc.tar.gz /home/pig.txt /home/cat.txt,那么最后我们压缩的文件的目路结构就是/home/pig和cat
    2. 将/home 的文件夹 压缩成 myhome.tar.gz tar -zcvf myhome.tar.gz /home/
    3. 将 pc.tar.gz 解压到当前目录 tar -zxvf pc.tar.gz
    4. 将myhome.tar.gz 解压到 /opt/tmp2目录下 tar -zxvf /home/myhome.tar.gz -C /opt/tmp2 -C代表指定解压目录

组管理

  • 组的基本概念 : 在 linux 中的每个用户必须属于一个组,不能独立于组外。在 linux 中每个文件 有所有者、所在组、其它组的概念。
    1. 所有者 : 一般为文件的创建者,谁创建了该文件,就自然的成为该文件的所有者。
    2. 所在组 : 当某个用户创建了一个文件后,这个文件的所在组就是该用户所在的组(默认)。
    3. 其他组 : 除文件的所有者和所在组的用户外,系统的其它用户都是文件的其它组

1 所有者

  • 一般为文件的创建者,谁创建了该文件,就自然的成为该文件的所有者。

查看文件的所有者

  • 指令 ls –ahl
  • 应用实例 :

修改文件的所有者 chown -> change owner

  • 指令 : chown 用户名 文件名
  • 应用实例 : 使用 root 创建一个文件 apple.txt ,然后将其所有者修改成 tom chown hjl apple.txt
  • 注意 : 当文件的所有者修改后,该文件的所在组不会改变

2 组的创建

  • 指令 : groupadd 组名
  • 应用实例 :
    1. 创建一个组 monster groupadd monster
    2. 创建一用户 fox ,并放入monster组中 useradd -g monster fox

3 所在组

查看文件/目录所在组

  • 指令 : ls –ahl
  • 应用实例 : 使用 fox 来创建一个文件,看看该文件属于哪个组? monst就是所在组
-rw-r--r--. 1 fox  monster    0 8月  24 11:38 ok.txt

修改文件/目录所在组

  • 指令 : chgrp 组名 文件名 chgrp -> change group
  • 应用实例 : 使用 root 用户创建文件 orange.txt ,看看当前这个文件属于哪个组,然后将这个文件所在组,修改到 fruit 组。
touch orange.txt
ls -l
groupadd fruit
chgrp fruit orange.txt

显示 : 
-rw-r--r--.  1 root fruit      0 8月  24 11:50 orange.txt

4 其他组

改变用户所在组

  • 在添加用户时,可以指定将该用户添加到哪个组中,同样的用 root 的管理权限可以改变某个用户所在的组
  • 指令 :
    1. usermod –g 新组名 用户名
    2. usermod –d 目录名 用户名 改变该用户登陆的初始目录。特别说明:用户需要有进入到新目录的权限。
  • 应用案例 : 将 zwj 这个用户从原来所在组,修改到 wudang 组 usermod -g wudang zwj

权限管理

ls -l 中显示的内容如下:
-rwxrw-r-- 1 root root 1213 Feb 2 09:39 abc
1.  第一列10个数字说明
    1.  第 0 位确定文件类型(d, - , l , c , b)
        l 是链接,相当于 windows 的快捷方式 
        d (directory)是目录,相当于 windows 的文件夹 
        c (character)是字符设备文件,鼠标,键盘 
        b (block)是块设备,比如硬盘 
        - 普通文件
    2.  第 1-3 位确定所有者(该文件的所有者)拥有该文件的权限。---User 
    3.  第 4-6 位确定所属组(同用户组的)拥有该文件的权限,---Group 
    4.  第 7-9 位确定其他用户拥有该文件的权限 ---Other
2.  第二列 :硬链接数,目录,子目录数
3.  第三列 : 所属用户
4.  第四列 : 所属组
5.  第五列 : 大小(B)
6.  第六列 : 最后的修改时间
7.  第七列 : 名称

注意 : rwx可用数字表示为: r=4,w=2,x=1 因此 rwx=4+2+1=7 , 数字可以进行组合

rwx 权限详解,难点

rwx 作用到文件

  1. [ r ]代表可读(read): 可以读取,查看
  2. [ w ]代表可写(write): 可以修改,但是不代表可以删除该文件,删除一个文件的前提条件是对该文件所在的目录有写权限,才能删除该文件.
  3. [ x ]代表可执行(execute):可以被执行

rwx 作用到目录

  1. [ r ]代表可读(read): 可以读取,ls 查看目录内容
  2. [ w ]代表可写(write): 可以修改, 对目录内创建+删除+重命名目录
  3. [ x ]代表可执行(execute):可以进入该目录

修改权限-chmod

  • 通过 chmod 指令,可以修改文件或者目录的权限。

第一种方式 : + 、-、= 变更权限

  • u:所有者 g:所有组 o:其他人 a:所有人(u、g、o 的总和)
    1. chmod u=rwx,g=rx,o=x 文件/目录名
    2. chmod o+w 文件/目录名
    3. chmod a-x 文件/目录名
  • 案例 :
    1. 给 abc 文件 的所有者读写执行的权限,给所在组读执行权限,给其它组读执行权限。chmod u=rw,g=rx,o=rx abc
    2. 给 abc 文件的所有者除去执行的权限,增加组写的权限 chmod u-x,g+w,o+w adc
    3. 给 abc 文件的所有用户添加读的权限 chmod a+r adc

第二种方式:通过数字变更权限

  • r=4 w=2 x=1 rwx=4+2+1=7
  • 指令 : chmod u=rwx,g=rx,o=x 文件目录名
  • 案例 : 将 /home/abc.txt 文件的权限修改成 rwxr-xr-x, 使用给数字的方式实现:chmod 755 /home/abc.txt

修改文件所有者-chown

  • chown newowner 文件/目录 改变所有者
  • chown newowner:newgroup 文件/目录 改变所有者和所在组
  • -R 如果是目录 则使其下所有子文件或目录递归生效
  • 案例 :
    1. 请将 /home/abc.txt 文件的所有者修改成 tom chown king /home/abc.txt
    2. 请将 /home/test 目录下所有的文件和目录的所有者都修改成 tom chown -R king /home/test

修改文件/目录所在组-chgrp

  • chgrp newgroup 文件/目录 【 改变所在组】
  • 案例 :
    1. 请将 /home/abc .txt 文件的所在组修改成 shaolin (少林) chgrp shaolin /home/abc.txt
    2. 请将 /home/test 目录下所有的文件和目录的所在组都修改成 shaolin(少林) chgrp -R shaolin /home/test

最佳实践-警察和土匪游戏

police , bandit 
jack, jerry: 警察 
xh, xq: 土匪
  1. 创建组 groupadd police groupadd bandit
  2. 创建用户 useradd -g police jack useradd -g police jery useradd -g bandit xh useradd -g bandit xq
  3. jack 创建一个文件,自己可以读 r 写w,本组人可以读,其它组没人任何权限 首先 jack 登录 ;touch jackFile.txt chmod 640 jackFile.txt
  4. jack 修改该文件,让其它组人可以读, 本组人可以读写 chmod o=r,g=wr jackFile.txt
  5. xh 投靠 警察,看看是否可以读写
  6. 测试,看看 xh 是否可以读写,xq 是否可以, 小结论,就是如果要对目录内的文件进行操作,需要要有对该目录的 相应权限
  7. 示意图
  • 注意 : 小结论,就是如果要对目录内的文件进行操作,需要要有对该目录的 相应权限

定时任务调度

crontab定时任务调度

  • crontab 进行 定时任务的设置
  • 概述 : 是指系统在某个时间执行的特定的命令或程序。
  • 分类 :
    1. 系统工作 : 有些重要的工作必须周而复始地执行。如病毒扫描等
    2. 个别用户工作 : 个别用户可能希望执行某些程序,比如对mysql 数据库的备份。
  • 基本语法 : crontab [选项]
  • 常用选项 :
    1. -e : 编辑crontab定时任务
    2. -l : 查询crontab任务
    3. -r : 删除当前用户所有的crontab任务
  • 快速入门 :
设置任务调度文件:/etc/crontab 
设置个人任务调度。执行 crontab –e 命令。 
接着输入任务到调度文件 
如:*/1 * * * * ls –l   /etc/ > /tmp/to.txt 
意思说每小时的每分钟执行 ls –l /etc/ > /tmp/to.txt 命令

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WnmqtffP-1630734433338)(…/images/5ab156a8f447acd157ece50b000698dab7d2b1df3365971d1af66c4460d80196.png)]

  • 应用案例 :
    1. 每隔 1 分钟,就将当前的日期信息,追加到 /tmp/mydate 文件中
    2. 每隔 1 分钟, 将当前日期和日历都追加到 /home/mycal 文件中
    先写脚本my.sh
    date >> /tmp/mycal
    cal >> /tmp/mycal
    之后给my.sh增加可执行权限 chmod u+x my.sh
    crontab -e
    增加一句话
    */1 * * * * /home/my.sh
    
    1. 每天凌晨 2:00 将mysql 数据库 testdb ,备份到文件中

at定时任务

  • 基本介绍
1) at 命令是一次性定时计划任务,at 的守护进程 atd 会以后台模式运行,检查作业队列来运行。 
2) 默认情况下,atd 守护进程每 60 秒检查作业队列,有作业时,会检查作业运行时间,如果时间与当前时间匹配,则 运行此作业。
3) at 命令是一次性定时计划任务,执行完一个任务后不再执行此任务了 
4) 在使用 at 命令的时候,一定要保证 atd 进程的启动 , 可以使用相关指令来查看 ps -ef | grep atd //可以检测 atd 是否在运行
  • at命令格式 : at [选项] [时间] Ctrl + D 结束 at 命令的输入, 输出两次
  • ps -ef 检测当前有哪些运行的进程
  • 应用实例 :
    1. 2 天后的下午 5 点执行 /bin/ls /home
    [root@hjl ~]# at 5pm + 2 days
    at> /bin/ls /home<EOT>      
    job 1 at Sat Aug 28 17:00:00 2021
    [root@hjl ~]# atq
    1	Sat Aug 28 17:00:00 2021 a root
    
    1. atq 命令来查看系统中没有执行的工作任务
      atq
    2. 明天 17 点钟,输出时间到指定文件内 比如 /root/date100.log at 5pm tomorrow date > /root/date100.log
    3. 2 分钟后,输出时间到指定文件内 比如 /root/date200.log at now + 2 minutes date > /root/date200.log
    4. 删除已经设置的任务 , atrm 编号

Linux 磁盘分区、挂载

linux分区

  • 原理介绍 :
    1. Linux 来说无论有几个分区,分给哪一目录使用,它归根结底就只有一个根目录,一个独立且唯一的文件结构 , Linux 中每个分区都是用来组成整个文件系统的一部分。
    2. Linux 采用了一种叫“载入”的处理方法,它的整个文件系统中包含了一整套的文件和目录,且将一个分区和一个目录 联系起来。这时要载入的一个分区将使它的存储空间在一个目录下获得。
      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XFENgdqA-1630734433341)(…/images/73db2a647201386f7c7ac9152906824eb59bcbcc88dae553b3b7853eb68aab9d.png)]
  • 硬盘说明 :
    1. Linux 硬盘分 IDE 硬盘和 SCSI 硬盘,目前基本上是 SCSI 硬盘
    2. 对于 IDE 硬盘,驱动器标识符为“hdx~”,其中“hd”表明分区所在设备的类型,这里是指 IDE 硬盘了。“x”为盘号(a 为 基本盘,b 为基本从属盘,c 为辅助主盘,d 为辅助从属盘),“~”代表分区,前四个分区用数字 1 到 4 表示,它们是主分区或扩展分区,从 5 开始就是逻辑分区。例,hda3 表示为第一个 IDE 硬盘上的第三个主分区或扩展分区,hdb2 表示为第二个 IDE 硬盘上的第二个主分区或扩展分区。
    3. 对于 SCSI 硬盘则标识为“sdx~”,SCSI 硬盘是用“sd”来表示分区所在设备的类型的,其余则和 IDE 硬盘的表示方法 一样
  • 查看所有设备挂载情况 : lsblk 或者 lsblk -f

挂载案例

  • 如何增加一块硬盘
    1. 虚拟机添加硬盘
    2. 分区
    3. 格式化
    4. 挂载
    5. 设置可以自动挂载
  • 分区命令
    • 指令 : fdisk /dev/sdb
    • 开始分区 :
      1. m 显示命令列表
      2. p 显示磁盘分区 同 fdisk –l
      3. n 新增分区
      4. d 删除分区
      5. w 写入并退出
      • 说明 : 开始分区后输入 n,新增分区,然后选择 p ,分区类型为主分区。两次回车默认剩余全部空间。最后输入w 写入分区并退出,若不保存退出输入 q。
[root@hjl ~]# fdisk /dev/sdb
欢迎使用 fdisk (util-linux 2.23.2)。

更改将停留在内存中,直到您决定将更改写入磁盘。
使用写入命令前请三思。

Device does not contain a recognized partition table
使用磁盘标识符 0x074210b3 创建新的 DOS 磁盘标签。

命令(输入 m 获取帮助):m
命令操作
   a   toggle a bootable flag
   b   edit bsd disklabel
   c   toggle the dos compatibility flag
   d   delete a partition
   g   create a new empty GPT partition table
   G   create an IRIX (SGI) partition table
   l   list known partition types
   m   print this menu
   n   add a new partition
   o   create a new empty DOS partition table
   p   print the partition table
   q   quit without saving changes
   s   create a new empty Sun disklabel
   t   change a partition's system id
   u   change display/entry units
   v   verify the partition table
   w   write table to disk and exit
   x   extra functionality (experts only)

命令(输入 m 获取帮助):n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): p
分区号 (1-4,默认 1):1  
起始 扇区 (2048-2097151,默认为 2048):
将使用默认值 2048
Last 扇区, +扇区 or +size{K,M,G} (2048-2097151,默认为 2097151):
将使用默认值 2097151
分区 1 已设置为 Linux 类型,大小设为 1023 MiB

命令(输入 m 获取帮助):w
The partition table has been altered!

Calling ioctl() to re-read partition table.
正在同步磁盘。
[root@hjl ~]# lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda      8:0    0   20G  0 disk 
├─sda1   8:1    0    1G  0 part /boot
├─sda2   8:2    0    2G  0 part [SWAP]
└─sda3   8:3    0   17G  0 part /
sdb      8:16   0    1G  0 disk 
└─sdb1   8:17   0 1023M  0 part 
sr0     11:0    1 1024M  0 rom  
  • 格式化磁盘 : 以为上面的步骤之后,我们输入lsblk -f会发现,系统没有给新的分区设置uuid
    • 指令 : mkfs -t ext4 /dev/sdb1
    • 注意 : ext4是分区类型
  • 挂载 : mount,以为上面的步骤之后,我们输入lsblk -f会发现,系统没有给新的分区设置挂载点
    • 将一个分区与一个目录联系起来,所以我们首先应该创建一个目录,然后才挂载
    • 指令 : mount 设备名称 挂载目录
    • 例如: mount /dev/sdb1 /newdisk
    • umount 设备名称 或者 挂载目录
    • 例如: umount /dev/sdb1 或者 umount /newdisk
  • 设置自动挂载,在上面步骤结束后,如果重启系统,会发现之前设置的挂载点失效了,所以我们要设置自动挂载,也就是永久挂载
    • 通过修改/etc/fstab 实现挂载,添加完成后 执行mount –a 即刻生效

查询系统整体磁盘使用情况

  • df -h , df -h /目录可以查看对于目录的磁盘占用情况,默认为当前目录
[root@hjl /]# df -h
文件系统        容量  已用  可用 已用% 挂载点
/dev/sda3        17G  5.7G   11G   37% /
devtmpfs        895M     0  895M    0% /dev
tmpfs           910M     0  910M    0% /dev/shm
tmpfs           910M   11M  900M    2% /run
tmpfs           910M     0  910M    0% /sys/fs/cgroup
/dev/sda1       976M  144M  766M   16% /boot
.host:/         238G  157G   81G   67% /mnt/hgfs 这个这么大,是我们设置的虚拟目录,所以显示的是我们windows对于磁盘大小
tmpfs           182M  4.0K  182M    1% /run/user/42
tmpfs           182M   28K  182M    1% /run/user/0

查询指定目录的磁盘占用情况

  • du -h
  • 选项
    1. -s 指定目录占用大小汇总
    2. -h 带计量单位
    3. -a 含文件
    4. –max-depth=1 子目录深度
    5. -c 列出明细的同时,增加汇总值
  • 应用实例 : 查询 /opt 目录的磁盘占用情况,深度为 1
[root@hjl opt]# du -h --max-depth=1 /opt
4.0K	/opt/ccc
4.0K	/opt/rh
20K	/opt/tmp
96M	/opt/tmp2
163M	/opt/vmware-tools-distrib
315M	/opt ->这是汇总
-- 连带文件显示
[root@hjl opt]# du -ha --max-depth=1 /opt
4.0K	/opt/ccc
4.0K	/opt/rh
54M	/opt/VMwareTools-10.3.22-15902021.tar.gz
3.5M	/opt/杂文.txt
20K	/opt/tmp
96M	/opt/tmp2
163M	/opt/vmware-tools-distrib
315M	/opt

-- 显示总大小
[root@hjl opt]# du -hac --max-depth=1 /opt
4.0K	/opt/ccc
4.0K	/opt/rh
54M	/opt/VMwareTools-10.3.22-15902021.tar.gz
3.5M	/opt/杂文.txt
20K	/opt/tmp
96M	/opt/tmp2
163M	/opt/vmware-tools-distrib
315M	/opt
315M	总用量

磁盘使用指令

  1. 统计/opt 文件夹下文件的个数 ls -l /opt | grep "^-" | wc -l
[root@hjl opt]# ll
总用量 58676
drwxr-xr-x. 2 root root     4096 8月  23 21:59 ccc
drwxr-xr-x. 2 root root     4096 10月 31 2018 rh
drwxr-xr-x. 3 root root     4096 8月  24 10:51 tmp
drwxr-xr-x. 3 root root     4096 8月  24 11:10 tmp2
-rw-r--r--. 1 root root 56414224 3月  25 2020 VMwareTools-10.3.22-15902021.tar.gz
drwxr-xr-x. 9 root root     4096 3月  25 2020 vmware-tools-distrib
-rw-r--r--. 1 root root  3642757 8月  24 08:40 杂文.txt
[root@hjl opt]# ls -l /opt | grep "^-"
-rw-r--r--. 1 root root 56414224 3月  25 2020 VMwareTools-10.3.22-15902021.tar.gz
-rw-r--r--. 1 root root  3642757 8月  24 08:40 杂文.txt
[root@hjl opt]# ls -l /opt | grep "^-" | wc -l
2
  1. 统计/opt 文件夹下目录的个数 ls -l /opt | grep "^d" | wc -l
  2. 统计/opt 文件夹下文件的个数,包括子文件夹里的 ls -lR /opt | grep "^-" | wc -l
  3. 统计/opt 文件夹下目录的个数,包括子文件夹里的 ls -lR /opt | grep "^d" | wc -l
  4. 以树状显示目录结构 tree 目录 , 注意,如果没有 tree ,则使用 yum install tree 安装 tree /home/

NAT网络配置

网络配置原理图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-myxQsdMn-1630734433343)(…/images/efea682b7a26539d4fde94700284861b531dc4a4b288ec5f74ae5c9fd85fd5c0.png)]

查看网络 IP 和网关

  • 查看网络ip
    1. windows下在cmd窗口输入ipconfig
    2. linux在终端输入ifconfig
      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zO9sci1T-1630734433350)(…/images/6a9894367604902cf2eec036c418052f59564ffb7fbb3b468c5af1c2217b1cc2.png)]
      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DwUkAXcr-1630734433353)(…/images/03004875cf34d5a4d411edc8ffa0befb345ea6587b21634fb1ea4195ac4de1f5.png)]
  • 查看网关
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3cenyexi-1630734433355)(…/images/f929d6470a832211d18b075750efddebb2c94603e53590f39c854c71236b66f4.png)]
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RG9jLR25-1630734433357)(…/images/c234e38965addcce627363cc3c927e592e64e22b44e31c1831ef7ff50f4353e6.png)]
  • ping 目的主机,测试当前服务器是否可以连接目的主机

linux网络环境配置

  1. 第一种方法 : 自动获取(linux的地址会变化)
    • 登陆后,通过界面的来设置自动获取 ip,特点:linux 启动后会自动获取 IP,缺点是每次自动获取的 ip 地址可能不一样
      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-U2lWOmaO-1630734433361)(…/images/92fbe7b8facbd0fa00d65544736c70eefe0085209aef9d8d9c2463367377ecf4.png)]
  2. 第二种方法 : 指定ip
    • 直接修改配置文件来指定 IP,并可以连接到外网(程序员推荐)
    • 编辑 vim /etc/sysconfig/network-scripts/ifcfg-ens33 要求:将 ip 地址配置的静态的,比如: ip 地址为 192.168.200.130
ifcfg-ens33 文件说明 
DEVICE=eth0                                 #接口名(设备,网卡)
HWADDR=00:0C:2x:6x:0x:xx                    #MAC地址
TYPE=Ethernet #网络类型(通常是 Ethemet)
UUID=926a57ba-92c6-4231-bacb-f27e5e6a9f44   #随机 id 

#系统启动的时候网络接口是否有效(yes/no) 
ONBOOT=yes 
# IP 的配置方法[none|static|bootp|dhcp](引导时不使用协议|静态分配 IP|BOOTP 协议|DHCP 协议) BOOTPROTO=static 
#IP 地址
IPADDR=192.168.200.130 
#网关 
GATEWAY=192.168.200.2 
#域名解析器
DNS1=192.168.200.2
  • 修改后
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="static"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens33"
UUID="a11c3585-6021-4ace-9997-ba53c0fb6618"
DEVICE="ens33"
ONBOOT="yes"
#IP 地址
IPADDR=192.168.200.130
#网关
GATEWAY=192.168.200.2
#域名解析器
DNS1=192.168.200.2

  1. 重启网络服务或者重启 service network restartreboot

主机名和host映射

  • 设置主机名:
    1. 为了方便记忆,可以给 linux 系统设置主机名, 也可以根据需要修改主机名
    2. 指令 hostname : 查看主机名
    3. 修改文件在 /etc/hostname 指定
    4. 修改后,重启生效
  • 设置 hosts 映射
    • 之前我们都是输入 ping 192.168.200.130来检测是否ping通,如果你想通过host来ping,即输入ping hjl,就需要设置host映射
    1. windows下 : C:\Windows\System32\drivers\etc\hosts 文件指定即可
    # Copyright (c) 1993-2009 Microsoft Corp.
    #
    # This is a sample HOSTS file used by Microsoft TCP/IP for Windows.
    #
    # This file contains the mappings of IP addresses to host names. Each
    # entry should be kept on an individual line. The IP address should
    # be placed in the first column followed by the corresponding host name.
    # The IP address and the host name should be separated by at least one
    # space.
    #
    # Additionally, comments (such as these) may be inserted on individual
    # lines or following the machine name denoted by a '#' symbol.
    #
    # For example:
    #
    #      102.54.94.97     rhino.acme.com          # source server
    #       38.25.63.10     x.acme.com              # x client host
    
    # localhost name resolution is handled within DNS itself.
    #	127.0.0.1       localhost
    #	::1             localhost
    #127.0.0.1       activate.navicat.com
    192.168.200.130 hjl  # 加上这一行即可
    
    1. 在linux下 : 在 /etc/hosts 文件 指定 添加 192.168.200.128 surface4
  • 主机名解析机制分析 : 例如,用户在浏览器输入了www.baidu.com
    1. 浏览器检查浏览器缓存有没有该域名解析ip地址
    2. 没有去dns缓存查
    3. 没有去本地hosts文件查
    4. 没有去互联网当中的dns域名服务器查:dns是分级的,是一组服务器
    本地域名服务器
        根域名服务器
        顶级(二级,三级)域名服务器
        权威域名服务器
    
    1. 还没有找到就返回域名不存在

进程

基本介绍

  1. 在 LINUX中,每个执行的程序都称为一个进程。每一个进程都分配一个 ID号(pid,进程号)。=>windows => linux
  2. 每个进程都可能以两种方式存在的。前台后台,所谓前台进程就是用户目前的屏幕上可以进行操作的。后台进程 则是实际在操作,但由于屏幕上无法看到的进程,通常使用后台方式执行。
  3. 一般系统的服务都是以后台进程的方式存在,而且都会常驻在系统中。直到关机才才结束。

ps显示系统执行的进程

  • ps命令是用来查看目前系统中,有哪些正在执行,以及它们执行的状况。可以不加任何参数.
[root@hjl ~]# ps
   PID TTY          TIME CMD
 19583 pts/2    00:00:00 bash
 20007 pts/2    00:00:00 ps

 # pid : 进程识别号
 # tty : 终端机号
 # time : 此进程消耗的cpu时间
 # cmd : command 进程名 执行该进程的指令
  • 选项 :
    • -a : 显示当前终端的所有进程信息
    • -u : 以用户的格式显示进程信息
    • -x : 显示后台进程运行的参数
  System V展示风格 
  USER:用户名称 
  PID:进程号  
  %CPU:进程占用 CPU的百分比 
  %MEM:进程占用物理内存的百分比 
  VSZ:进程占用的虚拟内存大小(单位:KB) 
  RSS:进程占用的物理内存大小(单位:KB) 
  TT:终端名称,缩写 . 
  STAT:进程状态,其中 S-睡眠,s-表示该进程是会话的先导进程,N-表示进程拥有比普通优先级更低的优先级,R正在运行,D-短期等待,Z-僵死进程,T-被跟踪或者被停止等等
  STARTED:进程的启动时间 
  TIME:CPU时间,即进程使用 CPU的总时间
  COMMAND:启动进程所用的命令和参数,如果过长会被截断显示

kill杀死进程

  1. kill [选项] 进程号(功能描述:通过进程号杀死/终止进程)
  2. killall 进程名称 (功能描述:通过进程名称杀死进程,连带的杀死其子进程,也支持通配符,这在系统因负载过大而变得很慢时很有用)
  3. 常用选项 -9 , 强迫进程立即停止,比如要踢掉某个非法用户,终止远程登录服务sshd,终止多个gedit,强制杀掉一个终端
  4. 案例 :
    1. 案例 1:踢掉某个非法登录用户 kill 进程号–> kill 11421
    2. 案例 2: 终止远程登录服务 sshd, 在适当时候再次重启 sshd 服务–> kill sshd 对应的进程号;
      重启sshd.service --> /bin/systemctl start sshd.service
    3. 案例 3: 终止多个 gedit , --> killall gedit
    4. 案例 4:强制杀掉一个终端, --> kill -9 bash 对应的进程号

pstree查看进程树

  • pstree [选项] ,可以更加直观的来看进程信息
  • 选项 :
    1. -p :显示进程的 PID
    2. -u :显示进程的所属用户

服务管理

基本介绍

  • 介绍 : 服务(service) 本质就是进程,但是是运行在后台的,通常都会监听某个端口,等待其它程序的请求,比如(mysqld , sshd,防火墙等),因此我们又称为守护进程,是 Linux 中非常重要的知识点。
  • 例如 : 启动network-> service network start
  • 注意 : 在 CentOS7.0 后 很多服务不再使用 service ,而是 systemctl (后面专门讲),如果指令 : ls -l /etc/init.d/ 可以查看还可以用service控制的服务

查看服务名 :

1.  `setup` 即可,之后就会进入一个窗口
![图 6](../images/ff9ce83b4d3748fe5c3e473b41403eb20df555a536fadcfb3464c6d27fa29275.png)  
2.  /etc/init.d 看到 service 指令管理的服务 `ls -l /etc/init.d`

服务器运行级别(runlevel)

-   Linux 系统有 7 种运行级别(runlevel):常用的是级别 3 和 5
    1.  运行级别 0:系统停机状态,系统默认运行级别不能设为 0,否则不能正常启动 
    2.  运行级别 1:单用户工作状态,root 权限,用于系统维护,禁止远程登陆 
    3.  运行级别 2:多用户状态(没有NFS),不支持网络 
    4.  **运行级别 3**:完全的多用户状态(有NFS),无界面,登陆后进入控制台命令行模式 
    5.  运行级别 4:系统未使用,保留 
    6.  **运行级别 5**:X11 控制台,登陆后进入图形GUI 模式 
    7.  运行级别 6:系统正常关闭并重启,默认运行级别不能设为 6,否则不能正常启动
-   修改当前系统的默认运行级别 : 
    1.  获取运行级别 : `systemctl get-default`
    2.  修改运行级别 : `systemctl set-default multi-user.target` 修改为3级别
        -   multi-user.target : 3 多用户命令行界面
        -   graphical.target : 5 图形界面

chkconfig

  • chkconfig指令可以显示,服务在不同运行级别下的自启动状态
  • 查看服务 chkconfig --list
[root@hjl ~]# chkconfig --list

注:该输出结果只显示 SysV 服务,并不包含
原生 systemd 服务。SysV 配置数据
可能被原生 systemd 配置覆盖。 

      要列出 systemd 服务,请执行 'systemctl list-unit-files'。
      查看在具体 target 启用的服务请执行
      'systemctl list-dependencies [target]'。

netconsole     	0:关	1:关	2:关	3:关	4:关	5:关	6:关
network        	0:关	1:关	2:开	3:开	4:开	5:开	6:关
vmware-tools   	0:关	1:关	2:开	3:开	4:开	5:开	6:关

比如network服务,在运行级别3的时候是开启的,在运行级别1的时候是关闭的
  • 修改服务在某一级别的自启动状态 : chkconfig --level 3 network off/on

systemctl

  • 基本语法: systemctl [start | stop | restart | status] 服务名
    • 例如关闭防火墙 : systemctl stop firewalld.service
  • systemctl 指令管理的服务在 /usr/lib/systemd/system 查看
  • systemctl可以设置服务的自启动状态 :
    1. systemctl list-unit-files 查看服务开机启动状态,可以使用grep过滤
    [root@hjl ~]# systemctl list-unit-files | grep firewalld.service
    firewalld.service                             enabled 
    
    1. systemctl enable 服务名 : 设置服务开机启动
    2. systemctl disable 服务名 : 关闭服务开机启动
    3. systemctl is-enabled 服务名 : 查询某个服务是不是自启动的
    [root@hjl ~]# systemctl is-enabled firewalld.service
    enabled
    
  • 注意细节 :
    1. 关闭或者启用防火墙后,立即生效。[telnet 测试 某个端口即可]
    2. 这种方式只是临时生效,当重启系统后,还是回归以前对服务的设置。
    3. 如果希望设置某个服务自启动或关闭永久生效,要使用 systemctl [enable|disable] 服务名

防火墙

  • 防火墙开启,这个时候有一个请求,那么会有以下操作
    1. 看请求的服务是否开启
    2. 如果开启,看该请求的端口是否处于打开状态,打开状态则允许访问,关闭状态则不允许访问
    3. 如果请求的服务为关闭状态,那么不允许访问
  • 防火墙关闭,这个时候有请求,那么直接看请求的服务是否打开即可

firewall指令,负责在防火墙开启的情况下打开端口

  • 在真正的生产中,我们往往是需要把防火墙打开的,但是问题来了,如果我们把防火墙打开,那么外部请求数据包就不能跟服务器直接通讯,这个时候,我们就需要打开对应的端口,让外部请求通过端口跟服务器通讯
  • firewall 指令
    • 注意 : 查看协议 : netstat -anp
    1. 打开端口 : firewall-cmd --permanent --add-port=端口号/协议
    2. 关闭端口 : firewall-cmd --permanent --remove-port=端口号/协议
    3. 重新载入,才能生效 : firewall-cmd --reload
    4. 查询端口是否开放: firewall-cmd --query-port=端口/协议

top动态监控进程

指令

  • top 与 ps 命令很相似。它们都用来显示正在执行的进程。Top 与 ps 最大的不同之处,在于 top 在执行一段时间可以更新正在运行的的进程。
  • 基本语法 : top [选项]
  • 选项 :
    1. -d 秒数 : 指定top命令每隔几秒更新,默认是3秒
    2. -i : 使top不现实任何闲置或僵死进程
    3. -p : 通过指定监控进程id来仅仅监控某个进程的状态
      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-REQXgZlN-1630734433363)(…/images/40bdbe1e987e51b80b4e055e2f2ce43d1dcb866eadafea96124310e6a858beec.png)]
      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2JztUfNo-1630734433365)(…/images/140238df9afbdab5944fe70ee3ba8692d64b7db3e9b99a3183e31bd94b32221b.png)]
  • 注意 : 僵死进程–>进程已经死掉,但是内存没有释放

交互操作

  • 交互操作
    1. P : 以cpu使用率排序,默认就是此项
    2. M : 以内存的使用率排序
    3. N : 以pid排序
    4. q : 退出top
  • 案例 :
    1. 案例 1.监视特定用户, 比如我们监控 tom用户 :
      • top:输入此命令,按回车键,查看执行的进程。
      • u:然后输入“u”回车,再输入用户名,即可,
    2. 案例 2:终止指定的进程, 比如我们要结束 tom登录
      • top:输入此命令,按回车键,查看执行的进程。
      • k:然后输入“k”回车,再输入要结束的进程 ID号,之后可能还要求你输入一个信号量,一般输入9强制kill即可
    3. 案例 3:指定系统状态更新的时间(每隔 10 秒自动更新), 默认是 3 秒
      • top -d 10

netstat监控网络状态

  • 基本语法 : netstat [选项]
  • 选项 :
    1. -an 按一定顺序排列输出
    2. -p 显示哪个进程在调用
  • 应用案例 : 请查看服务名为 sshd 的服务的信息。netstat -anp | grep sshd

rpm和yum

rpm

  • 介绍
    rpm用于互联网下载包的打包及安装工具,它包含在某些 Linux 分发版中。它生成具有.RPM扩展名的文件。RPM
是RedHat Package Manager(RedHat 软件包管理工具)的缩写,类似windows 的 setup.exe,这一文件格式名称虽然打上 了RedHat 的标志,但理念是通用的。 
    Linux 的分发版本都有采用(suse,redhat, centos 等等),可以算是公认的行业标准了。

指令

  1. 查询指令 : rpm -qa,例如 : 查看是否安装了firefox rpm -qa | grep firefox
一个 rpm包名:firefox-60.2.2-1.el7.centos.x86_64 
名称:firefox  
版本号:60.2.2-1 
适用操作系统: el7.centos.x86_64 表示 centos7.x 的 64 位系统 
如果是 i686、i386 表示 32 位系统,noarch 表示通用
  1. rpm -q 软件包名 : 查询软件包是否安装 例如 rpm -q firefox
  2. rpm -qi 软件包名 : 查询软件包信息
  3. rpm -ql 软件包名 : 查询软件包中的文件 rpm -ql firefox
  4. rpm -qf 文件全路径名 : 查询文件所属的软件包 rpm -qf /etc/passwd
[root@hjl ~]# rpm -qf /etc/passwd
setup-2.8.71-10.el7.noarch
[root@hjl ~]# rpm -qf /root/install.log
错误:文件 /root/install.log:没有那个文件或目录
  1. 卸载rpm包 : rpm -e RPM包的名称
    • 应用案例 : 删除firefox软件包 rpm -e firefox
    • 细节 :
      1. 如果其它软件包依赖于您要卸载的软件包,卸载时则会产生错误信息。
        如: $ rpm -e foo
        removing these packages would break dependencies:foo is needed by bar-1.0-1
      2. 如果我们就是要删除 foo 这个 rpm 包,可以增加参数 --nodeps ,就可以强制删除,但是一般不推荐这样做,因为依 赖于该软件包的程序可能无法运行
        如:$ rpm -e --nodeps foo
  2. 安装 rpm包 : rpm -ivh RPM包全路径名称
    • 参数说明 :
      1. i=install 安装
      2. v=verbose 提示
      3. h=hash 进度条
    • 应用实例 : 演示卸载和安装 firefox 浏览器 : rpm -e firefox ; rpm -ivh firefox

yum

  • Yum 是一个 Shell 前端软件包管理器。基于RPM包管理,能够从指定的服务器自动 下载RPM包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软件包。

指令

  1. 查询 yum服务器是否有需要安装的软件 : yum list|grep xx 软件列表
  2. 安装指定的 yum包 : yum install xxx 下载安装
  • 案例 : 请使用 yum的方式来安装 firefox --> rpm -e firefox; yum list | grep firefox ;yum install firefox

搭建Java EE环境

  1. 准备好jdk安装包存放的地方,应该存放在 /opt/jdk, opt目录就是linux存放额外安装包的地方 mkdir /opt/jdk,注意这里不需要加 -r,以为opt目录以及存在,所以这里创建的不是多级目录
  2. 解压jdk压缩包 tar -zxvf jdk-8u261-linux-x64.tar.gz
  3. 将解压后的内容,放置到/usr/local/java下,因为usr/local就是linux下额外安装内容的存放位置 mv /opt/jdk /usr/local/java
  4. 之后 cd /usr/local/java/jdk/bin ,bin下存放和java有关的指令,这个时候输入./java -version就可以查看jdk版本信息
  5. 但是一旦切换目录,我们就无法使用java有关的指令,如果想使用,必须输入非常长的安装路径,所以,我们需要就行环境变量的配置,和系统配置有关的配置文件都在/etc下
  6. vim /etc/profile,在文件的最下面输入
    export JAVA_HOME=/usr/local/java/jdk1.8.0_261
    export PATH=$JAVA_HOME/bin:$PATH
    
  7. 这个时候我们输入echo $PATH依然不会显示我们刚刚配置的环境变量的路径,我们需要刷新
  8. source /etc/profile 即可,之后我们可以在任意路径下使用java有关指令
  • 简单的java代码
    1. vim ./Hello.java
      public class Hello{
          public static void main(String[] args){
              System.out.println("hello world");
          }
      }
      
    2. javac Hello.java 就会产生编译后的.class文件
    3. java Hello 就会在终端输出hello world,注意,这里不要写java文件的后缀名

tomcat安装

  1. cd /opt/tomcat/
  2. 解压tomcat压缩包 : tar -zxvf apache-tomcat-8.5.59.tar.gz
  3. cd /opt/tomcat/apache-tomcat-8.5.59
  4. cd bin/
  5. ./startup.sh开启tomcat服务
  6. 之后,在浏览器输入192.168.200.128,发现无法跳转,这是因为我们没有开启tomcat对应的8080端口,防火墙拦截了
  7. firewall-cmd --permanent --add-port=8080/tcp 开启端口号
  8. firewall-cmd --reload 重新载入,不然端口还是没有开启
  9. firewall-cmd --query-port=8080/tcp 检查看8080端口开启没有
  10. 之后浏览器就可以正常访问
  11. 接下来写一个简单的html192.168.200.128:8080
    1. cd /opt/tomcat/apache-tomcat-8.5.59/webapps/ROOT 进入tomcat部署文件的默认路径
    2. 然后在这个目录下创建一个简单的html页面
    3. 在浏览器输入 192.168.200.128:8080/hjl.html 这里的hjl.html就是刚刚写的简单的html页面

搭建mysql环境

  1. 老样子,将压缩包解压到/opt/mysql/下
  2. 如果你是centos系统,该系统会自带一个类mysql数据库,会和mysql冲突,要先删除
    1. rpm -qa | grep mari 查询是否有该数据库
    2. rpm -e --nodeps mariadb-libs 卸载
  3. 刚才解压完,我们会发现有很多的rpm安装包,安装其中四个安装包
    1. rpm -ivh mysql-community-common-5.7.26-1.el7.x86_64.rpm
    2. rpm -ivh mysql-community-libs-5.7.26-1.el7.x86_64.rpm
    3. rpm -ivh mysql-community-client-5.7.26-1.el7.x86_64.rpm
    4. rpm -ivh mysql-community-server-5.7.26-1.el7.x86_64.rpm
  4. 运行systemctl start mysqld.service,启动mysql服务
  5. mysql安装好后会给mysql的root用户自动创建一个复杂的默认密码,我们要先查看该密码 grep "password" /var/log/mysqld.log ,然后修改该密码,因为不修改初始密码,我们无法进行任何操作
  6. mysql -u root -p默认密码 登录mysql,之后set password for 'root'@'localhost' =password('新密码');来修改密码
  7. flush privileges 使得修改生效,一般如果是对mysql进行了配置修改,最好使用一次该代码,否则很可能修改暂时不生效
  8. 之后就可以进行对mysql的正常操作了,如果你想在windows中对linux虚拟机的mysql操作,首先,你需要在linux虚拟机内,打开mysql的端口,然后,进入mysql数据库,输入以下代码
    1. use mysql;
    2. update user set host = '%' where user = 'root';
    3. flush privileges
    4. 进行如上的操作是为了允许远程登录mysql,mysql默认不允许远程登录
  9. 如果你发现,在linux虚拟机的musql中创建的表格,无法插入中文字符,那是因为安装的mysql的默认字符集是lati乱七八糟的,我们需要修改为utf8才可以正常使用,具体方法各位百度

shell编程

学习目的

  1. Linux 运维工程师在进行服务器集群管理时,需要编写 Shell 程序来进行服务器管理。
  2. 对于 JavaEE 和 Python 程序员来说,工作的需要,你的老大会要求你编写一些 Shell 脚本进行程序或者是服务器的维 护,比如编写一个定时备份数据库的脚本。
  3. 对于大数据程序员来说,需要编写 Shell 程序来管理集群
  • 什么是shell : 我们书写的指令比如mkdir /opt/jdkk/,是无法直接被linux内核理解并执行的,所以,linux内核和指令之间存在一个shell,shell就是一个命令行解释器,会负责将我们的指令,解释成为linux内核可以理解并执行

shell脚本的执行方式

  • 格式要求 :
    1. 脚本要以#!/bin/bash开头
    2. 脚本要有可执行权限,也就是rwx中的x
    3. 脚本文件名后缀约定俗成为.sh
  • 编写第一个shell脚本 : 创建一个shell脚本,输出hello world!
    #!/bin/bash
    echo "hello world"
    
  • 执行shell脚本有两种方式
    1. 第一种 : 首先,给.sh文件赋予x权限,然后 ./hello.sh即可
    2. 第二种 : 不用给.sh赋予权限,直接sh hello.sh

shell变量

#!bin/bash
#案例1 : 定义变量
A=100
# 输出变量需要加上$符号
echo \$A=$A
#案例2 : 撤销变量
unset A
echo "\$A=$A"
#案例3 : 声明静态的变量B=2,不可以撤销
readonly B=2
echo "B=$B"
unset B #这里会报错反设定,因为静态变量不可以撤销
  • shell变量命名规则
    1. 变量名称可以由字母、数字和下划线组成,但是不能以数字开头。5A=200(×)
    2. 等号两侧不能有空格
    3. 变量名称一般习惯为大写, 这是一个规范,我们遵守即可

环境变量

  1. vim /etc/profile
  2. 再文件的最下面,输入export 变量名=变量值
  3. 之后,退出文件,输入source /etc/profile,更新
  4. 之后在终端输入echo $环境变量名 即可输出对应的变量值

获取命令行的参数消息

  1. $n n为1/2/3/4等等数字,如果n>10,则因写成格式类似于${10},可以获得命令行的第n个参数
  2. $* 获取命令行全部参数,将全部参数当作一个整体
  3. $@ 获取命令行全部参数,但是会将每个参数区分对待
  4. $# 获取命令行中参数的个数
#!/bin/bash
echo "$1 $2 $3"
echo "所有的参数为$*"
echo "$@"
echo "参数的个数$#"

预定义变量

  • shell设计者实现准备好的变量,可以直接使用
  1. $$ 当前进程的pid
  2. $! 后台运行的最后一个进程的pid
  3. $? 最后一次执行的命令的返回状态。如果这个变量的值为 0,证明上一个命令正确执行;如果这个变 量的值为非 0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了
#!/bin/bash
echo "当前执行的进程 id=$$"
#加&代表以后台的方式运行一个脚本,并获取他的进程号
/root/shcode/myshell.sh &
echo "最后一个后台方式运行的进程 id=$!"
echo "执行的结果是=$?"

运算符

  • 有三种运算表达式书写方式
  1. $((运算表达式))
  2. $[运算表达式]
  3. expr 表达式 注意,表达式中,运算符两边必须用空格隔开
    1. 在expr方式中,*应该写为*
#!/bin/bash
#案例1:计算(2+3)*4的值
#使用第一种方式
RES1=$(((2+3)*4))
echo res1=$RES1
#第二种方式:推荐
RES2=$[(2+3)*4]
echo res2=$RES2
#第三种方式,不推荐,注意,运算符号两边必须有空格,并且*必须写成\*
TEMP=`expr 2 + 3`
echo TEMP=$TEMP
RES3=`expr $TEMP \* 4`
echo RES3=$RES3
#案例2:计算命令行的两个参数的和
RES4=$[$1+$2]
echo RES4=$RES4

条件判断

  1. =字符串比较
  2. 整数比较
    1. -lt 小于
    2. -le 小于等于 little equal
    3. -eq 等于
    4. -gt 大于
    5. -ge 大于等于
    6. -ne 不等于
  3. 按照文件权限进行判断
    1. -r 有读的权限
    2. -w 有写的权限
    3. -x 有执行的权限
  4. 按照文件类型进行判断
    1. -f 文件存在并且是一个常规的文件
    2. -e 文件存在
    3. -d 文件存在并是一个目录
#!/bin/bash
#案例 1:"ok"是否等于"ok" 判断语句:使用 =
if [ "ok" = "ok" ]
then
        echo "equal"
fi
#案例 2:23 是否大于等于 22 判断语句:使用 -ge
if [ 23 -ge 22 ]
then
        echo "大于等于"
fi
#案例 3:/root/shcode/aaa.txt 目录中的文件是否存在 判断语句: 使用 -f
if [ -f /root/shcode/aaa.txt ]
then
        echo "文件存在"
fi

if else

#!/bin/bash
#单分支
if[ $1 -ge 60 ]
then 
    echo "不及格"
fi
#案例:请编写一个 shell 程序,如果输入的参数,大于等于 60,则输出 "及格了",如果小于 60,则输出 "不及格"
if [ $1 -ge 60 ]
then
        echo "及格了"
elif [ $1 -lt 60 ]
then
        echo "不及格"
fi

case

#!/bin/bash
#案例1 : 当命令行参数是 1 时,输出 "周一", 是 2 时,就输出"周二", 其它情况输出 "other"
case $1 in
"1")
echo "周一"
;;
"2")
echo "周二"
;;
*)
echo "other..."
;;
esac

for

#!/bin/bash
#案例 1 :打印命令行输入的参数 [这里可以看出$* 和 $@ 的区别]
#注意,$*是吧输入的参数当作一个整体,所以只会输出一句话
for i in "$*"
do
        echo "number is $i"
done
#$@是吧输入的参数当作一个整体,所以会输出多句话
echo "=================================="
for i in "$@"
do
        echo "number is $i"
done
#!/bin/bash
#案例2 : 从 1 加到 100 的值输出显示
#定义一个变量SUM负责保存1到100的和
SUM=0
for(( i=1; i<=$1; i++))
do
#写上你的业务代码
        SUM=$[$SUM+i]
done
echo $SUM

while

#!/bin/bash
#案例 1 :从命令行输入一个数 n,统计从 1+..+ n 的值是多少?
SUM=0
i=0
while [ $i -le $1 ]
do
        SUM=$[$SUM+i]
        #i自增
        i=$[$i+1]
done
echo $SUM

read读取控制台输入

  1. -p:指定读取值时的提示符; read -p "请输入一个数NUM1=" NUM1
  2. -t:指定读取值时等待的时间(秒),如果没有在指定的时间内输入,就不再等待了。。read -t 3 -p "请输入一个数NUM2=" NUM2
#!/bin/bash
#案例 1:读取控制台输入一个NUM1 值
read -p "请输入一个数NUM1=" NUM1
echo "你输入的NUM1=$NUM1"
#案例 2:读取控制台输入一个NUM2 值,在 10 秒内输入
read -t 3 -p "请输入一个数NUM2=" NUM2
echo "你输入的NUM2=$NUM2"

系统函数

  1. basename 一般用于获取文件名称,返回完整路径最后 / 的部分,常用于获取文件名,由三部分组成basename 路径 后缀名 如果加上后缀名,你们最后得到的文件名称,会再删除掉尾部的匹配的后缀
    [root@hjl shcode]# basename /home/aaa/test.txt
    test.txt
    [root@hjl shcode]# basename /home/aaa/test190219012.txt
    test190219012.txt
    [root@hjl shcode]# basename /home/aaa/test190219012.txt txt
    test190219012.
    [root@hjl shcode]# basename /home/aaa/test190219012.txt .txt
    test190219012
    [root@hjl shcode]# basename /home/aaa/test190219012.txt 012.txt
    
  2. dirname 一般用于获取文件路径,返回完整路径最后 / 的前面的部分,常用于返回路径部分
    [root@hjl shcode]# dirname /home/aaa/test.txt
    /home/aaa
    

自定义函数

#!/bin/bash
#函数getSum可以返回两个参数的和
#定义函数
function getSum() {
        SUM=$[$n1+$n2]
        echo "SUM=$SUM"
}
#输入两个值
read -p "请输入n1=" n1
read -p "请输入n2=" n2
#调用自定义函数 
getSum $n1 $n2
~               

你可能感兴趣的:(杂项,linux,windows,mysql)