Linux常用命令归类总结
文件相关
创建文件
- touch:
touch README.md
- ">"重定向:
echo 'study and share' > README.md
- vi && vim:
vim README.md
, vim是vi的升级版,直接用它吧,有些系统装好后只有vi,这里提一下。
删除文件
- 删除文件
rm README.md
,如果是多个文件你就往后面补文件名。 - 自信地强制删除:
rm -rf README.md
, 数据无价,慎用。
linux最佳文本编辑器vim
# vim file: 有则打开文件,没则创建文件
# 三种模式:插入模式(按i进入,或者o下一行)、可视模式(CTRL + V)、命令模式(默认)
# 关于保存: :q 退出、 :q! 退出不保存、 :wq 退出并保存
文件夹的相关操作
- 创建文件夹:
mkdir app
-
-p
创建多层嵌套文件夹,例子mkdir -p a/b/c
-
- 删除文件夹:
rmdir app
, 多层嵌套的话rm -rf app
- 查看文件夹相关信息:
ls app
-
-a
: 列举所有文件(包含隐藏的) -
-l
列表形式展示
-
- 进入文件夹:
cd app
,.
表示当前目录,那么返回上一级就是cd ..
复制、修改、移动、文件(夹)
- 复制文件(夹):
cp file1 file2
-
-r
: 复制嵌套文件夹,例如cp -r a b
, 其中a的结构是a/b/c
,即多层时。
-
- 修改和移动:
mv app ppa
, mv这个命令承载了重命名文件(夹)和拷贝的重任。
硬链接和软链接
- 硬链接:
ln ataola zjt
,占用空间 - 软链接:
ln -s ataola zjt
, 相当于快捷方式,不占空间
压缩与解压缩
tar
- 将ataola文件压缩成ataola.tar.gz:
tar -czvf ataola.tar.gz ataola
- 将ataola.tar.gz文件解压缩到当前目录:
tar -zxvf ataola.tar.gz
- -c 创建
- -z gzip压缩
- -v显示细节
- -f 文件
- -x 解压缩
zip
- 压缩:
zip ataola.zip ataola
- 解压:
unzip ataola.zip ataola
- 加密压缩:
zip -re ataola.zip ataola
网络相关
查看网络信息
- 查看本机网络信息:
ip addr
- 查看本机网络信息:
ifconfig
网络通信
- 检测与外界通信是否正常:
ping xxx
, 例如:ping zhengjiangtao.cn
- 查看本机相关端口暴露情况:
netstat
, 推荐使用netstat -tlunp
,显示正在监听的tcp和udp信息,清爽一点。-
-u (udp)
: 仅显示udp相关选项 -
-n
: 显示全名。 -
-l
: 仅列出有在 Listen 的服务状态 -
-p
: 显示建立相关链接的程序名
-
- 查看TCP UDP相关服务
lsof -i
防火墙
- 安装:
yum install iptables iptables-services -y
- 开启:
service iptables start
- 关闭:
service iptables stop
- 保存:
service iptables save
- 查看状态:
service iptables status
- 开启某个端口(80为例):
iptables -I INPUT -p tcp --dport 80 -j ACCEPT
,iptables -I OUTPUT -p tcp --sport 80 -j ACCEPT
- 关闭某个端口(80为例):
iptables -I INPUT -p tcp --dport 80 -j DROP
,iptables -I OUTPUT -p tcp --sport 80 -j DROP
-
-I
: 将在指定链的指定编号位置插入一个规则 -
-F
:清除预设的所有规则 -
-A
: 将一个规则添加到链末尾 -
-p tcp
: 指定协议为tcp -
-s
: 指定源地址或地址段 -
-j ACCEPT
: 允许 -
-j DROP
: 拒绝 -
-d
: 指定目标地址或地址段 -
-m limit
: 限制单位时间访问频率 -
--dport port
: 指定目标TCP/IP端口, 如 –dport 80 -
--sport port
: 指定来源TCP/IP端口, 如 –dport 80 -
-L -n
: 查看防火墙配置信息 -
-L -n --line-number
: 显示规则和相应编号 -
-t nat -L
: 列出所有NAT链中所有规则 -
INPUT
: 处理数据输入包 -
OUTPUT
: 处理数据输出包
-
✘ ⚡ root@ataola ~/tmp iptables -L -n
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp spt:80
⚡ root@ataola ~/tmp
- 屏蔽某IP:例如:
ptables -A INPUT -p tcp -m tcp -s 218.109.192.109 -j DROP
- 阻止window蠕虫攻击:
iptables -I INPUT -j DROP -p tcp -s 0.0.0.0/0 -m string --algo kmp --string "cmd.exe"
- 防止SYN洪水攻击:
iptables -A INPUT -p tcp --syn -m limit --limit 5/second -j ACCEPT
用户相关
组
- 组信息存放位置:
/etc/group
, 格式:用户组名:密码:用户组ID:组内用户名
- 添加用户组:
groupadd usergroup
-
-g
: 自定义组ID, 例如groupadd -g 613 sanguo
-
- 修改用户组:
groupmod usergroup
-
-g
: 修改用户组ID -
-n
: 修改用户组名
-
- 删除用户组:
groupdel usergroup
用户
- 删除用户:
userdel user
-
-r
: 连家目录一起删除
-
权限问题
这个地方我纠结了一下,到底是放在文件相关还是用户相关讲,最后我选择这里。对于用户而言,其操作一个文件,有可读可写可执行否这么多种可能对吧,那么我们接下来讨论下。
对于一个文件而言,其与用户的关系,不外乎所有者(创建者)、组内成员、其他组或者用户,这里root用户是linux最高权限的用户,简言之,没有它干不了的事。
u |
g |
o |
a |
---|---|---|---|
所有者 |
同组用户 |
其他组 |
所有 |
字母表示
我们来看这样一个例子
⚡ root@ataola ~ ls -l /home/caocao
total 4
-rw-r--r-- 1 caocao sanguo 0 Jul 18 18:16 a
drwxr-xr-x 3 caocao sanguo 4096 Jul 18 18:17 b
⚡ root@ataola ~
单独把b前面的这一坨东西拎出来讲:drwxr-xr-x
,
- 第一个字母
d
,表示它是一个文件夹,而a第一个字母是-
,表示它是一个文件 - 第一组
rwx
, 表示其创建者caocao拥有可读可写可执行的权限 - 第二组
r-x
: 表示其所在sanguo组其他用户有可读可执行的权限 - 第三组
r-x
: 表示其他组或者用户有可读可执行的权限
实践一下
- 对于a文件给同组用户增加可写可执行权限, chmod g+wx a[caocao@ataola ~] ls -ltotal 4-rwxr--r-- 1 caocao sanguo 0 Jul 18 18:16 adrwxr-xr-x 3 caocao sanguo 4096 Jul 18 18:17 b[caocao@ataola ~] chmod g+wx a[caocao@ataola ~] ls -ltotal 4-rwxrwxr-- 1 caocao sanguo 0 Jul 18 18:16 adrwxr-xr-x 3 caocao sanguo 4096 Jul 18 18:17 b[caocao@ataola ~]
- 之后曹操有点小情绪,决定移除同组的可执权限chmod u-x a[caocao@ataola ~] chmod g-x a[caocao@ataola ~] ls -ltotal 4-rwxrw-r-- 1 caocao sanguo 0 Jul 18 18:16 adrwxr-xr-x 3 caocao sanguo 4096 Jul 18 18:17 b[caocao@ataola ~]
- 再之后,曹操他疯了,他决定移除自己的可写可执行权限chmod u-wx a[caocao@ataola ~] chmod u-wx a[caocao@ataola ~] ls -ltotal 4-r--rw-r-- 1 caocao sanguo 0 Jul 18 18:16 adrwxr-xr-x 3 caocao sanguo 4096 Jul 18 18:17 b[caocao@ataola ~]
数字表示
除了楼上的字母表示,也是可以用数字进行相关权限设置
字母与数字的对应关系如下:
r |
w |
x |
---|---|---|
4 |
2 |
1 |
那我们接着实践。
- 曹操后来又自己给自己治好了,决定收回撤销的a文件的可写可执行的权限,并设置其他人都只可读chmod 744 a[caocao@ataola ~] chmod 744 a[caocao@ataola ~] ls -ltotal 4-rwxr--r-- 1 caocao sanguo 0 Jul 18 18:16 adrwxr-xr-x 3 caocao sanguo 4096 Jul 18 18:17 b[caocao@ataola ~]
这里的744, 第一个代表所有者,4 + 2 + 1 = 7。第二个代表所属组 ,第三个代表其他选手。
更改文件用户组
这里我们创建一个魏国的group,然后将曹操家目录下的b文件夹归属与魏国这个组chgrp weiguo b
, 这里如果加个参数-R
的话,其内部的所有文件都会跟着变成魏国这个组,而不是三国,执行这个命令的是root用户。
⚡ root@ataola /home/caocao ls -l
total 4
-rwxr--r-- 1 caocao sanguo 0 Jul 18 18:16 a
drwxr-xr-x 3 caocao sanguo 4096 Jul 18 18:17 b
⚡ root@ataola /home/caocao chgrp weiguo b
⚡ root@ataola /home/caocao ls -l
total 4
-rwxr--r-- 1 caocao sanguo 0 Jul 18 18:16 a
drwxr-xr-x 3 caocao weiguo 4096 Jul 18 18:17 b
⚡ root@ataola /home/caocao
更改文件所属用户
之后root用户,决定干掉曹操,自己掌管b文件,那么可以这么做chown root b
, 相关参数同楼上的chgrp
⚡ root@ataola /home/caocao chown root b
⚡ root@ataola /home/caocao ls -l
total 4
-rwxr--r-- 1 caocao sanguo 0 Jul 18 18:16 a
drwxr-xr-x 3 root weiguo 4096 Jul 18 18:17 b
⚡ root@ataola /home/caocao ls -l b
total 4
drwxr-xr-x 2 caocao sanguo 4096 Jul 18 18:17 c
⚡ root@ataola /home/caocao
root用户想了想,狠人做到底,回收了其他人的可读可执行权限chmod o-rx b
⚡ root@ataola /home/caocao chmod o-rx b
⚡ root@ataola /home/caocao ls -l
total 4
-rwxr--r-- 1 caocao sanguo 0 Jul 18 18:16 a
drwxr-x--- 3 root weiguo 4096 Jul 18 18:17 b
⚡ root@ataola /home/caocao
此时曹操登录后想进入b目录,哈哈,是不可能的了。
[caocao@ataola ~]$ cd b
bash: cd: b: Permission denied
[caocao@ataola ~]$ ls -l
total 4
-rwxr--r-- 1 caocao sanguo 0 Jul 18 18:16 a
drwxr-x--- 3 root weiguo 4096 Jul 18 18:17 b
[caocao@ataola ~]$
进程相关
查看进程(ps)
- a 显示所有进程
- -a 显示同一终端下的所有程序
- -A 显示所有进程
- c 显示进程的真实名称
- -N 反向选择
- -e 等于“-A”
- e 显示环境变量
- f 显示程序间的关系
- -H 显示树状结构
- r 显示当前终端的进程
- T 显示当前终端的所有程序
- u 指定用户的所有进程
- -au 显示较详细的资讯
- -aux 显示所有包含其他使用者的行程
- -C<命令> 列出指定命令的状况
- –lines<行数> 每页显示的行数
- –width<字符数> 每页显示的字符数
- –help 显示帮助信息
- –version 显示版本显示
例如说我要查看docker的相关信息,你可以这样写ps -aux | grep docker | tail
, 因为数据量很大,tail就是只看文件尾部。
[caocao@ataola ~]$ ps -aux | grep docker | tail
root 16970 0.0 0.0 264800 428 ? Sl May31 0:03 /usr/bin/docker-containerd-shim-current 0e4ef69c19b981163067ec8af0c38b6fa84c380855c22309a884f0a0ed691912 /var/run/docker/libcontainerd/0e4ef69c19b981163067ec8af0c38b6fa84c380855c22309a884f0a0ed691912 /usr/libexec/docker/docker-runc-current
root 19417 0.0 0.0 188476 1636 ? Sl May31 0:04 /usr/libexec/docker/docker-proxy-current -proto tcp -host-ip 0.0.0.0 -host-port 3307 -container-ip 172.19.0.3 -container-port 3306
root 19422 0.0 0.0 272996 488 ? Sl May31 0:04 /usr/bin/docker-containerd-shim-current 6de60216270a3b6f5bfbe5d94d40fa2449e443eb77b67d4bf005061dd4ff412e /var/run/docker/libcontainerd/6de60216270a3b6f5bfbe5d94d40fa2449e443eb77b67d4bf005061dd4ff412e /usr/libexec/docker/docker-runc-current
root 22621 0.0 0.1 111092 2000 ? Sl Jul14 0:00 /usr/libexec/docker/docker-proxy-current -proto tcp -host-ip 0.0.0.0 -host-port 80 -container-ip 172.18.0.3 -container-port 80
root 22626 0.0 0.0 272996 1732 ? Sl Jul14 0:00 /usr/bin/docker-containerd-shim-current 52fca7d70916037e865da9ad1dfbf330e39be4a1a72c3a05ba1d862dff8cb563 /var/run/docker/libcontainerd/52fca7d70916037e865da9ad1dfbf330e39be4a1a72c3a05ba1d862dff8cb563 /usr/libexec/docker/docker-runc-current
root 29722 0.0 0.0 110036 1108 ? Sl May30 0:03 /usr/libexec/docker/docker-proxy-current -proto tcp -host-ip 0.0.0.0 -host-port 6379 -container-ip 172.20.0.2 -container-port 6379
root 29727 0.0 0.0 264800 340 ? Sl May30 0:03 /usr/bin/docker-containerd-shim-current 5c8daf272042ad0396924e6cd1f3d936e4c5f0280401861983316707c5ab9e75 /var/run/docker/libcontainerd/5c8daf272042ad0396924e6cd1f3d936e4c5f0280401861983316707c5ab9e75 /usr/libexec/docker/docker-runc-current
root 30185 0.0 0.0 264800 324 ? Sl May30 0:03 /usr/bin/docker-containerd-shim-current 5c8daf272042ad0396924e6cd1f3d936e4c5f0280401861983316707c5ab9e75 /var/run/docker/libcontainerd/5c8daf272042ad0396924e6cd1f3d936e4c5f0280401861983316707c5ab9e75 /usr/libexec/docker/docker-runc-current
root 30607 0.2 1.4 763120 26556 ? Ssl May30 186:57 /usr/bin/dockerd-current --add-runtime docker-runc=/usr/libexec/docker/docker-runc-current --default-runtime=docker-runc --exec-opt native.cgroupdriver=systemd --userland-proxy-path=/usr/libexec/docker/docker-proxy-current --init-path=/usr/libexec/docker/docker-init-current --seccomp-profile=/etc/docker/seccomp.json --selinux-enabled --log-driver=journald --signature-verification=false --storage-driver overlay2
root 30612 0.0 0.2 501356 4432 ? Ssl May30 41:51 /usr/bin/docker-containerd-current -l unix:///var/run/docker/libcontainerd/docker-containerd.sock --metrics-interval=0 --start-timeout 2m --state-dir /var/run/docker/libcontainerd/containerd --shim docker-containerd-shim --runtime docker-runc --runtime-args --systemd-cgroup=true
[caocao@ataola ~]$
当然啦,根据上面的命令参数,你也可以ps -ef | grep mysql
,打出mysql的相关信息
[caocao@ataola ~]$ ps -ef | grep mysql
1001 3471 3455 0 May30 ? 03:38:23 mysqld --wsrep_start_position=52a382bb-a27b-11ea-867f-c364b5a6fb0a:18
caocao 5928 16797 0 19:05 pts/0 00:00:00 grep --color=auto mysql
1001 6247 6231 0 May30 ? 03:38:57 mysqld
1001 7553 7537 0 May30 ? 03:38:59 mysqld
1001 8697 8679 0 May30 ? 03:38:07 mysqld
1001 19439 19422 0 May31 ? 03:33:23 mysqld --wsrep_start_position=52a382bb-a27b-11ea-867f-c364b5a6fb0a:23
[caocao@ataola ~]$
杀掉进程(kill)
根据查看进程得到的最前面的pid,杀掉一个进程是kill xxx
, 例如杀掉mysqld的pid为1001的进程kill 1001
, 可能运气不好会有杀不掉的情况,kill -9 xxx
,强制杀掉,慎用。
内存CPU和硬盘相关
内存
- 粗略 free[caocao@ataola ~] free total used free shared buff/cache availableMem: 1882192 454268 69256 2212 1358668 1238236Swap: 4194300 1242368 2951932[caocao@ataola ~]
- 详细 /proc/meminfo这个文件里面,太长了,这里就显示最后十行意思下[caocao@ataola ~] tail -10 /proc/meminfoAnonHugePages: 4096 kBCmaTotal: 0 kBCmaFree: 0 kBHugePages_Total: 0HugePages_Free: 0HugePages_Rsvd: 0HugePages_Surp: 0Hugepagesize: 2048 kBDirectMap4k: 88056 kBDirectMap2M: 2009088 kB[caocao@ataola ~]
CPU
- 查看cpu详细信息: cat /proc/cpuinfo[caocao@ataola ~] cat /proc/cpuinfoprocessor : 0vendor_id : GenuineIntelcpu family : 6model : 79model name : Intel(R) Xeon(R) CPU E5-26xx v4stepping : 1microcode : 0x1cpu MHz : 2394.454cache size : 4096 KBphysical id : 0siblings : 1core id : 0cpu cores : 1apicid : 0initial apicid : 0fpu : yesfpu_exception : yescpuid level : 13wp : yesflags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx lm constant_tsc rep_good nopl eagerfpu pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm 3dnowprefetch bmi1 avx2 bmi2 rdseed adx xsaveoptbogomips : 4788.90clflush size : 64cache_alignment : 64address sizes : 40 bits physical, 48 bits virtualpower management:[caocao@ataola ~]
硬盘
查看硬盘使用情况df
[caocao@ataola ~]$ df
Filesystem 1K-blocks Used Available Use% Mounted on
devtmpfs 930176 0 930176 0% /dev
tmpfs 941096 24 941072 1% /dev/shm
tmpfs 941096 2224 938872 1% /run
tmpfs 941096 0 941096 0% /sys/fs/cgroup
/dev/vda1 51473868 14918560 34358064 31% /
tmpfs 188220 0 188220 0% /run/user/0
[caocao@ataola ~]$
综合查看(vmstat)
[caocao@ataola ~]$ vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
3 0 1242368 85884 103628 1240960 0 0 13 42 5 6 2 3 95 0 0
[caocao@ataola ~]$
实时查看(top)
top - 19:16:16 up 52 days, 18:17, 3 users, load average: 0.58, 0.23, 0.25
Tasks: 149 total, 1 running, 148 sleeping, 0 stopped, 0 zombie
%Cpu(s): 3.0 us, 3.0 sy, 0.0 ni, 93.6 id, 0.0 wa, 0.0 hi, 0.3 si, 0.0 st
KiB Mem : 1882192 total, 82052 free, 454844 used, 1345296 buff/cache
KiB Swap: 4194300 total, 2951932 free, 1242368 used. 1237660 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
6247 1001 20 0 1385620 37224 1844 S 0.7 2.0 218:59.15 mysqld
7553 1001 20 0 1385644 38936 1860 S 0.7 2.1 219:01.83 mysqld
16104 polkitd 20 0 1583856 72124 4756 S 0.7 3.8 28:45.69 mongod
3471 1001 20 0 1414336 28812 2684 S 0.3 1.5 218:25.69 mysqld
7924 root 20 0 35632 3088 720 S 0.3 0.2 116:41.86 redis-server
8249 root 20 0 33464 2096 748 S 0.3 0.1 113:38.97 redis-server
8631 root 20 0 33464 1616 708 S 0.3 0.1 111:53.89 redis-server
10370 root 20 0 160080 8448 1384 S 0.3 0.4 60:37.62 barad_agent
10371 root 20 0 677032 8004 1492 S 0.3 0.4 344:28.10 barad_agent
19439 1001 20 0 1394932 22712 2656 S 0.3 1.2 213:25.65 mysqld
环境变量相关
临时
直接命令行里敲export xxx
, 例如
[caocao@ataola ~]$ export NODE_ENV=production
[caocao@ataola ~]$ echo $NODE_ENV
production
[caocao@ataola ~]$
set
和unset
也是可以的。
永久
-
/etc/profile
: 对所有用户生效 -
.bashrc | .zshrc | .bash.profile
: 对当前用户生效
问题思考
如果我把一个组删了,但是这个组里面有用户,是不是意味着他们将成为僵尸用户?
怎么可能。。。它会提示你先清用户,有用户就删不掉
⚡ root@ataola /home/caocao groupdel sanguo
groupdel: cannot remove the primary group of user 'caocao'
✘ ⚡ root@ataola /home/caocao ls /
创建用户不指定组,默认行为是什么?
如果不指定,默认创建一个和用户相同名字的组
使用useradd 命令,用户有哪些可以解析器shell(-s 后面可以跟哪些选择)?
/bin/zsh
/bin/bash
/sbin/nologin
这里/sbin/nologin
就是不让其登录,没有登录权限
参考文献
iptables命令:https://wangchujiang.com/linux-command/c/iptables.html
ps 进程查看器:https://linuxtools-rst.readthedocs.io/zh_CN/latest/tool/ps.html
- 纯代码修改WordPress 默认 Gravatar 头像的方法
- 这些行业的饭碗要被机器人抢了 再不努力就被它们PK掉了!
- DeveWork.com 上线“前端工具箱”(附源码下载)
- Debug和Release之本质区别
- ArgoUML -- 开源UML 建模工具
- 性能分析工具-PerfView
- c#测试字符串是否为GUID的几种方法
- 编译错误CS1595
- 分享一款带尖角浮出 公告栏 样式
- 在asp.net页面上得到Castle容器的实例
- WordPress自带TinyMCE编辑器相关功能增强
- 联众互动收购3家棋牌游戏公司,其域名买自蔡文胜手中
- 未来有什么工作绝对不会被人工智能取代
- WordPress在RSS Feed 中输出版权信息
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 信息收集之主机发现:nmap
- 文本文件逐行处理–用java8 Stream流的方式
- 使用java8API遍历过滤文件目录及子目录及隐藏文件
- 使用位运算、值交换等方式反转java字符串-共四种方法
- 精讲RestTemplate第2篇-多种底层HTTP客户端类库的切换
- 精讲RestTemplate第1篇-在Spring或非Spring环境下如何使用
- 在图中添加多边形
- 设置坐标轴刻度的位置和样式
- OkHttp透明压缩,收获性能10倍,外加故障一枚
- 体验spring-boot-devtools热部署,流畅且不失强大
- 【每周一库】 simsearch - a simple and lightweight fuzzy search engine
- 手把手教你实现xxl-job分布式任务调度平台搭建
- 直播短视频源码,动态需要用到点击图片展示预览效果的功能
- Docker 详细部署不香吗?
- 【41期】盘点那些必问的数据结构算法题之链表