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
命令查看隐藏文件
文件的基本操作
环境变量与文件查找
环境变量
-
添加自定义路径到“ PATH ”环境变量
PATH=$PATH:/home/shiyanlou/mybin
-
我们可以简单地使用下面命令直接添加内容到 .zshrc 中
echo "PATH=$PATH:/home/shiyanlou/mybin" >> .zshrc
source .zshrc
-
删除和修改已有的环境变量
-
变量设置方式 | 说明 |
${变量名#匹配字串} | 从头向后开始匹配,删除符合匹配字串的最短数据 |
${变量名##匹配字串} | 从头向后开始匹配,删除符合匹配字串的最长数据 |
${变量名%匹配字串} | 从尾向前开始匹配,删除符合匹配字串的最短数据 |
${变量名%%匹配字串} | 从尾向前开始匹配,删除符合匹配字串的最长数据 |
${变量名/旧的字串/新的字串} | 将符合旧字串的第一个字串替换为新的字串 |
${变量名//旧的字串/新的字串} | 将符合旧字串的全部字串替换为新的字串 |
-
使用 unset
命令删除一个环境变量
搜索文件
文件打包与解压缩
概念
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 文件
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 等
帮助命令的使用
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
不合并到一行,每个文件为一行
数据流重定向
概念
- 将原本输出到标准输出的数据重定向到一个文件中,
>
>>
标准错误重定向
tee
- 除了需要将输出重定向到文件,也需要将信息打印在终端
永久重定向
创建输出文件描述符
关闭文件描述符
完全屏蔽命令的输出
正则表达式基础
思维导图
- 
grep 模式匹配命令
-
参数 | 说明 |
-b | 将二进制文件作为文本来进行匹配 |
-c | 统计以模式匹配的数目 |
-i | 忽略大小写 |
-n | 显示匹配文本所在行的行号 |
-v | 反选,输出不匹配行的内容 |
-r | 递归匹配查找 |
-A n | n 为正整数,表示 after 的意思,除了列出匹配行之外,还列出后面的 n 行 |
-B n | n 为正整数,表示 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
从二进制包安装
- 从网络上下载的二进制包解压后放到合适的目录,然后将包含可执行的主程序文件的目录添加进PATH环境变量即可
Linux 进程概念
进程和程序的区别
程序只是一些列指令的集合,是一个静止的实体,而进程不同,进程有以下的特性:
- 动态性:进程的实质是一次程序执行的过程,有创建、撤销等状态的变化。而程序是一个静态的实体。
- 并发性:进程可以做到在一个时间段内,有多个程序在运行中。程序只是静态的实体,所以不存在并发性。
- 独立性:进程可以独立分配资源,独立接受调度,独立地运行。
异步性:进程以不可预知的速度向前推进。
- 结构性:进程拥有代码段、数据段、PCB(进程控制块,进程存在的唯一标志)。也正是因为有结构性,进程才可以做到独立地运行。
进程的分类
-
进程的功能与服务的对象来分
-
用户进程
- 通过执行用户程序、应用程序或称之为内核之外的系统程序而产生的进程
-
系统进程
-
应用程序的服务类型来分
进程组与 Sessions
工作管理
Linux 进程管理
进程的查看
-
top
-
ps
-
部分的进程呈树状显示出来
-
ps -afxo user,ppid,pid,pgid,command
-
自定义我们所需要的参数显示
-
pstree
参数选择 | 解释 |
-A | 程序树之间以 ASCII 字符连接 |
-p | 同时列出每个 process 的 PID |
-u | 同时列出每个 process 的所属账户名称 |
进程管理
-
进程的执行顺序
-
root
- nice 的值我们是可以通过 nice 命令来修改的,而需要注意的是 nice 值可以调整的范围是 -20 ~ 19,数值越小,优先级越高
-
普通用户
端口查看
netstat -anp |grep 端口号
命令 lsof -i tcp:port
(port替换成端口号,比如6379)可以查看该端口被什么程序占用,并显示PID,方便KILL(kill pid
)

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>
- 添加thymeleaf的约束
- 前端设定定时器,每隔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);
}
- 根据请求的url返回执行
ps aux
后的输入流,然后再以json格式返回给前端
- 打jar包,会自动在target目录下生成


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

MAC FinalShell下载链接

2.连接服务器

只给出截图,具体请参考阿里云官方文档
3.下载JDK
自己去Oracle官网下载好了

4.传输JDK和*.jar到服务器
解压JDK安装java环境,然后后台运行jar即可
nohup java -jar XXX.jar &
效果
静态图看不出来5秒刷新,可以开启网页翻译,就有明显感觉5秒刷新一次了

总结
不是很想写,肚子好饿,但刚吃过,有得等到下午4.多才能吃饭了
参考文献
SpringBoot项目部署到阿里云服务器全流程(简直详细到啰嗦)
如何让程序在linux服务器下一直运行(关闭远程连接后仍然继续运行)