Linux的基础命令行

Linux

用户管理

查看用户

who am i
#或者
who mom likes

创建用户

sudo adduser lilei

用户组

groups shiyanlou
cat /etc/group | grep -E "shiyanlou"		#结果:group_name:password:GID:user_list

将其它用户加入 sudo 用户组

#1.
su -l lilei
sudo ls
#2.
sudo usermod -G sudo lilei

删除用户和用户组

#--remove-home 参数在删除用户时候会一并将该用户的工作目录一并删除
sudo deluser lilei --remove-home

用户及文件权限管理

查看文件权限

一个目录同时具有读权限和执行权限才可以打开并查看内部文件,而一个目录要有写权限才允许在其中创建其它文件

#显示隐藏文件
ls -al
#查看某一个目录的完整属性,而不是显示目录里面的文件属性
ls -dl <目录名>
#显示所有文件大小,并以普通人类能看懂的方式呈现
#小 s 为显示文件大小,大 S 为按文件大小排序
ls -asSh

变更文件所有者

sudo chown shiyanlou iphone11

修改文件权限

g、o 还有 u 分别表示 group(用户组)、others(其他用户) 和 user(用户),+ 和 - 分别表示增加和去掉相应的权限

chmod 600 iphone11
chmod go-rw iphone11

目录结构及文件基本操作

目录路径

  • . 表示当前目录,.. 表示上一级目录,- 表示上一次所在目录, 通常表示当前用户的 home 目录
  • .开头的文件都是隐藏文件,所以这两个目录必然也是隐藏的,你可以使用ls -a 命令查看隐藏文件

文件的基本操作

  • 新建

    • touch
    • mkdir
  • 使用 -p 参数,同时创建父目录(如果不存在该父目录)mkdir -p father/son/grandson

  • 复制

    • #cp复制无法创建目录(此语句)
      cp test father/son/grandson
      
    • mkdir family
      cp -r father family					#要成功复制目录需要加上 -r 或者 -R 参数,表示递归复制
      
  • 删除

    • rm,-r递归,-f强制
  • 移动文件与文件重命名

    • mv 源目录文件 目的目录
    • mv 旧的文件名 新的文件名
  • 查看文件

    • cat为正序显示,tac为倒序显示

      • -n显示行号
    • nl 命令,添加行号并打印,这是个比 cat -n 更专业的行号打印命令

      • -b : 指定添加行号的方式,主要有两种:
            -b a:表示无论是否为空行,同样列出行号("cat -n"就是这种方式)
            -b t:只列出非空行的编号并列出(默认为这种方式)
        -n : 设置行号的样式,主要有三种:
            -n ln:在行号字段最左端显示
            -n rn:在行号字段最右边显示,且不加 0
            -n rz:在行号字段最右边显示,且加 0
        -w : 行号字段占用的位数(默认为 6 位)
        
    • 使用 moreless命令分页查看文件

    • 使用 headtail命令查看文件

      • 默认查看头部/尾部 10行
      • 加上 -n 参数,后面紧跟行数,查看对应的行数
  • 查看文件类型

    • file
  • 在 Linux 中文件的类型不是根据文件后缀来判断的。当你在文件里输入内容后才会显示文件类型

  • 编辑文件

    • vim
    • gedit

环境变量与文件查找

环境变量

  • 添加自定义路径到“ PATH ”环境变量

    PATH=$PATH:/home/shiyanlou/mybin
    
  • 我们可以简单地使用下面命令直接添加内容到 .zshrc 中

    echo "PATH=$PATH:/home/shiyanlou/mybin" >> .zshrc
    source .zshrc
    
  • 删除和修改已有的环境变量

    • 变量设置方式说明
      ${变量名#匹配字串}从头向后开始匹配,删除符合匹配字串的最短数据
      ${变量名##匹配字串}从头向后开始匹配,删除符合匹配字串的最长数据
      ${变量名%匹配字串}从尾向前开始匹配,删除符合匹配字串的最短数据
      ${变量名%%匹配字串}从尾向前开始匹配,删除符合匹配字串的最长数据
      ${变量名/旧的字串/新的字串}将符合旧字串的第一个字串替换为新的字串
      ${变量名//旧的字串/新的字串}将符合旧字串的全部字串替换为新的字串
    • 使用 unset 命令删除一个环境变量

搜索文件

  • whereis 只能搜索二进制文件(-b),man 帮助文件(-m)和源代码文件(-s)

    whereis find
    
  • locate 快而全

    • locate 命令查找文件也不会遍历硬盘,它通过查询/var/lib/mlocate/mlocate.db 数据库来检索信息

      sudo apt-get update
      sudo apt-get install locate
      sudo updatedb
      
  • which 小而精

    • 通常使用 which 来确定是否安装了某个指定的程序,因为它只从 PATH 环境变量指定的路径中去搜索命令并且返回第一个搜索到的结果。也就是说,我们可以看到某个系统命令是否存在以及执行的到底是哪一个地方的命令
  • find 精而细

    • find [path] [option] [action]

    • #列出用户家目录下比 /etc 目录新的文件
      find ~ -newer /etc
      

文件打包与解压缩

概念

  • *.tar——tar 程序打包,未压缩的文件

zip 压缩打包程序

  • #-r 参数表示递归打包包含子目录的全部内容
    #-q 参数表示为安静模式,即不向屏幕输出信息
    #-o 表示输出文件,需在其后紧跟打包输出文件名
    #-e 参数表示加密
    #-l 参数将 LF 转换为 CR+LF 以此来兼容windows
    zip -r -q -o shiyanlou.zip /home/shiyanlou/Desktop
    
  • #查看打包后文件的大小
    du -h -d 0 *.zip ~ | sort
    
  • 设置压缩级别

    #-x 是为了排除我们上一次创建的 zip 文件,否则又会被打包进这一次的压缩文件中,即上一次压缩的内容不会出现在这次压缩的压缩包中
    zip -r -9 -q -o shiyanlou_9.zip /home/shiyanlou/Desktop -x ~/*.zip
    

使用 unzip 命令解压缩 zip 文件

  • 解压到指定目录

    unzip -q shiyanlou.zip -d ziptest
    
  • 不想解压只想查看压缩包的内容

    unzip -l shiyanlou.zip
    
  • 解压编码问题

    #windows默认使用GBK,Linux使用UTF-8
    unzip -O GBK 中文压缩文件.zip
    

tar 打包工具

  • 解包一个文件(-x 参数)到指定路径的已存在目录(-C 参数) -f 用于指定创建的文件名

    mkdir tardir
    tar -xf shiyanlou.tar -C tardir
    
  • 只查看不解包文件 -t 参数

    tar -tf shiyanlou.tar
    
  • 创建 tar 文件的基础上添加 -z 参数,使用 gzip 来压缩文件

    tar -czf shiyanlou.tar.gz /home/shiyanlou/Desktop
    
  • 解压 *.tar.gz 文件

    tar -xzf shiyanlou.tar.gz
    

文件系统操作与磁盘管理

查看磁盘和目录的容量

  • df 命令查看磁盘的容量
  • du 命令查看目录的容量

Linux下的帮助命令

内建命令与外部命令

  • 内建命令

    • 内建命令实际上是 shell 程序的一部分,其中包含的是一些比较简单的 Linux 系统命令,这些命令是写在 bash 源码的 builtins 里面的,由 shell 程序识别并在 shell 程序内部完成运行,通常在 Linux 系统加载运行时 shell 就被加载并驻留在系统内存中。而且解析内部命令 shell 不需要创建子进程,因此其执行速度比外部命令快。比如:history、cd、exit 等等
  • 外部命令

    • 外部命令是 Linux 系统中的实用程序部分,因为实用程序的功能通常都比较强大,所以其包含的程序量也会很大,在系统加载时并不随系统一起被加载到内存中,而是在需要时才将其调入内存。虽然其不包含在 shell 中,但是其命令执行过程是由 shell 程序控制的。外部命令是在 Bash 之外额外安装的,通常放在/bin,/usr/bin,/sbin,/usr/sbin 等等。比如:ls、vi 等

帮助命令的使用

  • help

    #外部命令
    ls --help
    #内建命令
    help exit
    
  • man

    • 没有内建和外部命令区分,更加详细
  • info

    • 更加详细

crontab 的使用

sudo cron -f &					 			#启动crontab
crontab -e										#添加计划
crontab -l										#列出计划
ps aux | grep cron						#cron是否成功启动
sudo tail -f /var/log/syslog	#查看日志
crontab -r										#删除计划

命令执行顺序控制与管道

命令执行顺序的控制

  • 顺序执行多条命令

    • 简单的顺序执行你可以使用 ; 来完成
  • 有选择的执行命令

    • which cowsay>/dev/null && echo "exist" || echo "not exist"
  • shell中&& || 无优先级

管道

  • 表现

    • 表现出来的形式就是将前面每一个进程的输出(stdout)直接作为下一个进程的输入(stdin)
    • 过滤程序时经常会用到的就是匿名管道,在命令行中由| 分隔符表示
  • cut 命令,打印每一行的某一字段

    #打印 /etc/passwd 文件中以 : 为分隔符的第 1 个字段和第 6 个字段分别表示用户名和其家目录
    cut /etc/passwd -d ':' -f 1,6
    #随机产生字符串,截取1-6位
    echo $RANDOM |md5sum |cut -c 1-6  #这里是产生6位,可以有1-32位
    
  • grep 命令,在文本中或 stdin 中查找匹配字符串

    grep [命令选项]... 用于匹配的表达式 [文件]...
    
  • wc 命令,简单小巧的计数工具

    • wc 命令用于统计并输出一个文件中行、单词和字节的数目
    # 行数
    wc -l /etc/passwd
    # 单词数
    wc -w /etc/passwd
    # 字节数
    wc -c /etc/passwd
    # 字符数
    wc -m /etc/passwd
    #最长行字节数
    wc -L /etc/passwd
    
  • sort, uniq

简单的文本处理

tr [option]...SET1 [SET2]

  • 用来删除一段文本信息中的某些文字。或者将其进行转换

col [option]

  • 将Tab换成对等数量的空格键,或反转这个操作
  • -x 将Tab转换为空格
    -h 将空格转换为Tab(默认选项)

join [option]... file1 file2

  • 与数据库的join类似
  • -1指明第一个文件要用哪个字段来对比,默认对比第一个字段

paste [option] file...

  • 简单地将多个文件合并一起,以Tab隔开
  • -d 指定合并的分隔符,默认为 Tab
    -s 不合并到一行,每个文件为一行

数据流重定向

概念

  • 将原本输出到标准输出的数据重定向到一个文件中,> >>

标准错误重定向

  • #将标准错误重定向到标准输出,再将标准输出重定向到文件,注意要将重定向到文件写到前面
    cat Documents/test.c hello.c >somefile  2>&1
    #或者只用bash提供的特殊的重定向符号"&"将标准错误和标准输出同时重定向到文件
    cat Documents/test.c hello.c &>somefilehell
    

tee

  • 除了需要将输出重定向到文件,也需要将信息打印在终端

永久重定向

  • #使用exec替换当前进程的重定向,将标准输出重定向到一个文件
    exec 1>somefile
    

创建输出文件描述符

  • #创建fd=3的文件,重定向到somefile
    exec 3>somefile
    #输入到fd=3的文件中
    echo "this is test" >&3
    

关闭文件描述符

  • exec 3>&-
    

完全屏蔽命令的输出

  • #所有导入它的数据都将被吞噬
    /dev/null
    

正则表达式基础

思维导图

  • ![image-20201027181512437](/Users/chennianzuisui/Library/Application Support/typora-user-images/image-20201027181512437.png)

grep 模式匹配命令

  • 参数说明
    -b将二进制文件作为文本来进行匹配
    -c统计以模式匹配的数目
    -i忽略大小写
    -n显示匹配文本所在行的行号
    -v反选,输出不匹配行的内容
    -r递归匹配查找
    -A nn 为正整数,表示 after 的意思,除了列出匹配行之外,还列出后面的 n 行
    -B nn 为正整数,表示 before 的意思,除了列出匹配行之外,还列出前面的 n 行
    --color=auto将输出中的匹配项设置为自动颜色显示
  • 正则表达式和扩展正则表达式的区别

    • 仅仅是元字符(meta charactor)的区别而已
    • BRE: 只有^$.*[]是元字符,ERE: ^$.[]*+(){}?|都是元字符,所以类似于?无需\?转义
  • 正则表达式优先级

    优先级为从上到下从左到右,依次降低

    运算符说明
    \转义符
    ()(?:)(?=)[]括号和中括号
    *+?{n}{n,}{n,m}限定符
    ^$\ 任何元字符定位点和序列
    选择

sed

命令说明
s行内替换
c整行替换
a插入到指定行的后面
i插入到指定行的前面
p打印指定行,通常与 -n 参数配合使用
d删除指定行

awk 文本处理语言

  • pattern

    • awk 所有的操作都是基于 pattern(模式)—action(动作)对来完成的
    • pattern 通常是表示用于匹配输入的文本的“关系式”或“正则表达式”,action 则是表示匹配后将执行的动作
  • awk [-F fs] [-v var=value] [-f prog-file | 'program text'] [file...]

  • 其中 -F 参数用于预先指定前面提到的字段分隔符(还有其他指定字段的方式),-v 用于预先为 awk 程序指定变量,-f 参数用于指定 awk 命令要执行的程序文件,或者在不加 -f 参数的情况下直接将程序语句放在这里,最后为 awk 需要处理的文本输入,且可以同时输入多个文本文件

Linux下软件安装

apt

  • 工具

    工具说明
    install其后加上软件包名,用于安装一个软件包
    update从软件源镜像服务器上下载/更新用于更新本地软件源的软件包列表
    upgrade升级本地可更新的全部软件包,但存在依赖问题时将不会升级,通常会在更新之前执行一次 update
    dist-upgrade解决依赖关系并升级(存在一定危险性)
    remove移除已安装的软件包,包括与被移除软件包有依赖关系的软件包,但不包含软件包的配置文件
    autoremove移除之前被其他软件包依赖,但现在不再被使用的软件包
    purge与 remove 相同,但会完全移除软件包,包含其配置文件
    clean移除下载到本地的已经安装的软件包,默认保存在 /var/cache/apt/archives/
    autoclean移除已安装的软件的旧版本软件包
  • 参数

    参数说明
    -y自动回应是否安装软件包的选项,在一些自动化安装脚本中使用这个参数将十分有用
    -s模拟安装
    -q静默安装方式,指定多个 q 或者 -q=## 表示数字,用于设定静默级别,这在你不想要在安装软件包时屏幕输出过多时很有用
    -f修复损坏的依赖关系
    -d只下载不安装
    --reinstall重新安装已经安装但可能存在问题的软件包
    --install-suggests同时安装 APT 给出的建议安装的软件包
  • 搜索

    sudo apt-cache search softname1 softname2
    

从二进制包安装

  • 从网络上下载的二进制包解压后放到合适的目录,然后将包含可执行的主程序文件的目录添加进PATH环境变量即可

Linux 进程概念

进程和程序的区别

程序只是一些列指令的集合,是一个静止的实体,而进程不同,进程有以下的特性:

  • 动态性:进程的实质是一次程序执行的过程,有创建、撤销等状态的变化。而程序是一个静态的实体。
  • 并发性:进程可以做到在一个时间段内,有多个程序在运行中。程序只是静态的实体,所以不存在并发性。
  • 独立性:进程可以独立分配资源,独立接受调度,独立地运行。
    异步性:进程以不可预知的速度向前推进。
  • 结构性:进程拥有代码段、数据段、PCB(进程控制块,进程存在的唯一标志)。也正是因为有结构性,进程才可以做到独立地运行。

进程的分类

  • 进程的功能与服务的对象来分

    • 用户进程

      • 通过执行用户程序、应用程序或称之为内核之外的系统程序而产生的进程
    • 系统进程

      • 执行内存资源分配和进程切换等相对底层的工作
  • 应用程序的服务类型来分

    • 交互进程

    • 批处理进程

      • 进程集合,负责按顺序启动其他的进程
    • 守护进程

      • 守护进程是一直运行的一种进程,在 Linux 系统启动时启动,在系统关闭时终止。它们独立于控制终端并且周期性的执行某种任务或等待处理某些发生的事件

        • cron这个进程为 crontab 的守护进程

进程组与 Sessions

  • 每一个进程都会是一个进程组的成员,而且这个进程组是唯一存在的,他们是依靠 PGID(process group ID)来区别的,而每当一个进程被创建的时候,它便会成为其父进程所在组中的一员

  • 与进程组类似,每当一个进程被创建的时候,它便会成为其父进程所在 Session 中的一员,每一个进程组都会在一个 Session 中,并且这个 Session 是唯一存在的

    • Session 中的每个进程都称为一个工作(job)。每个会话可以连接一个终端(control terminal)。当控制终端有输入输出时,都传递给该会话的前台进程组。Session 意义在于将多个 jobs 囊括在一个终端,并取其中的一个 job 作为前台,来直接接收该终端的输入输出以及终端信号。 其他 jobs 在后台运行

工作管理

  • ctrl + c终止前台工作

  • ctrl + z当前工作停止并丢到后台

    #被停止并放置在后台的工作我们可以使用这个命令来查看
    jobs
    #想让其在后台运作
    bg [%jobnumber]
    #将后台的工作拿到前台来
    fg [%jobnumber]
    
  • & 让我们的命令在后台中运行——ls &

  • 删除一个工作

    kill -signal %jobnumber
    
    信号值作用
    -1重新读取参数运行,类似与 restart
    -2如同 ctrl+c 的操作退出
    -9强制终止该任务
    -15正常的方式终止该任务

Linux 进程管理

进程的查看

  • top

  • ps

    • ps aux
    • ps axjf
  • 部分的进程呈树状显示出来

  • ps -afxo user,ppid,pid,pgid,command

  • 自定义我们所需要的参数显示

  • pstree

    • pstree -up
    参数选择解释
    -A程序树之间以 ASCII 字符连接
    -p同时列出每个 process 的 PID
    -u同时列出每个 process 的所属账户名称

进程管理

  • 进程的执行顺序

    • root

      • nice 的值我们是可以通过 nice 命令来修改的,而需要注意的是 nice 值可以调整的范围是 -20 ~ 19,数值越小,优先级越高
    • 普通用户

      • 0~19

端口查看

netstat -anp |grep 端口号

命令 lsof -i tcp:port (port替换成端口号,比如6379)可以查看该端口被什么程序占用,并显示PID,方便KILL(kill pid

image-20201113200902462

Shell脚本

  • 取控制台最后一个参数${!#}

作业

实验9

需求

要求实现一个网络应用能够类似 top 命令,来监控远程服务器的进程。具体描述如下:

  • 在浏览器中输入服务器的地址 http://xxx.xxx.xxx.xxx ,能够根据 top 命令的格式显示系统的进程状态,并且每隔5秒钟刷新一次。
  • 作业提交内容: a. 服务器地址文本 addr.txt (比如http://47.32.100.12) b. 服务端源代码

技术要求

  • springboot | thymeleaf
  • 阿里云服务器

ps:其实也可以使用C/C++的开源项目——tinyhttpd,它用500多行代码实现了一个小型的服务器,在它上面魔改应该也可以达到上诉效果,不过我还是用springboot,比较方便哈哈哈

前端

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>top</title>
    <script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
</head>
<body>

<div id="slot">

</div>
</body>

<script>
    //假设每隔5秒发送一次请求
    window.onload = function () {
        getApi();
    }

    function getApi() {
        setTimeout(getApi, 5 * 1000);
        $.ajax({
            url: '服务器公网IP地址+端口号+请求路径',
            type: 'get',
            success: function (data) {
                $("#slot").empty();
                console.log(data);
                var obj = data.data;
                $.each(obj, function (index, item) {
                    $("#slot").append('<div>' + item + '</div>');
                })
            }
        })
    }
</script>

</html>
  1. 添加thymeleaf的约束
  2. 前端设定定时器,每隔5秒发送一个http请求,返回的数据重新渲染页面

后端

@GetMapping("process")
public JsonData printProcess(Model model) {
    Process process = null;
    List<String> totLine = null;
    try {
        process = Runtime.getRuntime().exec("ps aux");
        BufferedReader input = new BufferedReader(new InputStreamReader(process.getInputStream()));
        String line = null;
        int i = 0;
        totLine = new ArrayList<>();
        while ((line = input.readLine()) != null) {
            totLine.add(line);
        }
        model.addAttribute("processInfo", totLine);
        input.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
    return JsonData.buildSuccess(totLine);
}
  1. 根据请求的url返回执行ps aux后的输入流,然后再以json格式返回给前端
  2. 打jar包,会自动在target目录下生成

image-20201126123219696

image-20201126123249093

部署

1.下载FinalShell

本人的电脑是mac,所以连接服务器用的工具是FinalShell,Windows用户可以使用FinalShell,也可以使用XShell,怎么开心怎么来

image-20201126122251860

MAC FinalShell下载链接

image-20201126122421624

2.连接服务器

image-20201126122852497

只给出截图,具体请参考阿里云官方文档

3.下载JDK

自己去Oracle官网下载好了

image-20201126123018418

4.传输JDK和*.jar到服务器

解压JDK安装java环境,然后后台运行jar即可

nohup java -jar XXX.jar &

效果

静态图看不出来5秒刷新,可以开启网页翻译,就有明显感觉5秒刷新一次了

image-20201126123652397

总结

不是很想写,肚子好饿,但刚吃过,有得等到下午4.多才能吃饭了

参考文献

SpringBoot项目部署到阿里云服务器全流程(简直详细到啰嗦)

如何让程序在linux服务器下一直运行(关闭远程连接后仍然继续运行)

# Linux  入门 

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×