《小团队web技术搭建》(十)Linux初阶入门(二)

8,600 阅读9分钟

欢迎关注系列专栏《小团队web技术搭建》

《小团队web技术搭建》(一)环境和工具的准备-第一部分
《小团队web技术搭建》(二)环境和工具的准备-第二部分
《小团队web技术搭建》(三)环境和工具的准备-第三部分
《小团队web技术搭建》(四)虚拟机的安装使用
《小团队web技术搭建》(五)项目的简单部署方式
《小团队web技术搭建》(六)自动化部署方式(CI/CD)(一)
《小团队web技术搭建》(七)自动化部署方式(CI/CD)(二)
《小团队web技术搭建》(八)Docker+持续部署
《小团队web技术搭建》(九)Linux初阶入门(一)
持续更新中...

我们接着上一篇介绍的Linux入门内容,介绍其它一些基础操作。

文件查看

cat:从首行显示文件内容

cat [-AbEnTv]

选项与参数:

  • -A :相当於 -vET 的整合选项,可列出一些特殊字符而不是空白而已;
  • -b :列出行号,仅针对非空白行做行号显示,空白行不标行号!
  • -E :将结尾的断行字节 $ 显示出来;
  • -n :列印出行号,连同空白行也会有行号,与 -b 的选项不同;
  • -T :将 [tab] 按键以 ^I 显示出来;
  • -v :列出一些看不出来的特殊字符

示例:

# 查看test.txt的文件内容
cat /home/test.txt

tac:文件内容从最后一行开始显示

tac会从最后一行开始,倒着显示文件内容 示例:

# 倒行查看test.txt的文件内容
tac /home/test.txt

nl: 带着行号显示文件内容

nl [-bnw] 文件

选项与参数:

  • -b :指定行号指定的方式,主要有两种:
    -b a :表示不论是否为空行,也同样列出行号(类似 cat -n);
    -b t :如果有空行,空的那一行不要列出行号(默认值);
  • -n :列出行号表示的方法,主要有三种:
    -n ln :行号在荧幕的最左方显示;
    -n rn :行号在自己栏位的最右方显示,且不加 0 ;
    -n rz :行号在自己栏位的最右方显示,且加 0 ;
  • -w :行号栏位的占用的位数。
nl test.txt

more:可翻页查看文件内容

在 more 这个程序的运行过程中,你有几个按键可以按的:

  • 空白键 (space):代表向下翻一页;
  • Enter         :代表向下翻『一行』;
  • /字串         :代表在这个显示的内容当中,向下搜寻『字串』这个关键字;
  • :f            :立刻显示出档名以及目前显示的行数;
  • q             :代表立刻离开 more ,不再显示该文件内容。
  • b 或 [ctrl]-b :代表往回翻页,不过这动作只对文件有用,对管线无用。

示例:

# 如果文件内容足够长,你可以尝试按enter键查看下一行
more test.txt

less:与more类似,更接近vi编辑器操作

可以理解为只读模式下的vi编辑器,功能与more很像。 less运行时可以输入的命令有:

  • 空白键    :向下翻动一页;
  • [pagedown]:向下翻动一页;
  • [pageup]  :向上翻动一页;
  • /字串     :向下搜寻『字串』的功能;
  • ?字串     :向上搜寻『字串』的功能;
  • n         :重复前一个搜寻 (与 / 或 ? 有关!)
  • N         :反向的重复前一个搜寻 (与 / 或 ? 有关!)
  • q         :离开 less 这个程序;
# 如果文件内容足够长,你可以尝试按上下方向键查看上下行
less test.txt

head:显示前n行文件内容

head [-n number] 文件 

选项与参数:

  • -n :后面接数字,代表显示几行的意思
# 默认显示10行
head test.txt

# -n指定显示行数
head -n 20 test.txt

tail:显示后n行文件内容,可实时读取

在查看类似日志等文件时,我们经常用到tail,因为它的-f参数可以实时显示后面写入的文件内容。

tail [-n number] 文件 

选项与参数:

  • -n :后面接数字,代表显示几行的意思
  • -f :表示持续侦测后面所接的档名,要等到按下[ctrl]-c才会结束tail的侦测
# 显示最后10行
tail test.txt

# 监听文件写入内容
tail -f nginx.log

文件权限

权限描述

当我们输入ls -lll命令时,会显示当前文件下的文件及其权限情况等信息

[root@iZbp106v9cy80x0lhprg0rZ ~]# ls -l
total 508
drwxr-xr-x 11 www  users   8192 Nov 28 18:06 htop-2.0.2
-rw-r--r--  1 root root  476364 Nov 28 18:05 htop-2.0.2.tar.gz
-rw-r--r--  1 root root   24567 Aug 18  2021 install.sh
-rw-r--r--  1 root root    2197 Jan  9 16:14 test.txt
drwxr-xr-x  3 root root      18 Aug 20  2021 www

上面最左侧的信息即为权限信息,其描述的信息。权限描述信息有十位,第一位如果是d说明是文件夹,-则表示是文件;后面三组rwx分别代表用户、用户组、其他的读、写、执行权限,-代表没有该权限。

image.png

  • 第2到4个字符表示此文件所有者对此文件的权限
  • 第5到7个字符表示此文件所属于的组里面的账户对此文件的权限
  • 第8到10个字符表示除了上面两类型的其他用户对此文件的权限

其中

  • (read):可读,文件可以被查看。
  • w(write): 可写,文件可以被修改,删除。
  • x(execute):可执行,如果文件是脚本活程序,可以被执行。
  • - :无以上权限

比如:

-rw-r----- 1 root   tomcat 57092 Dec  8 00:46 LICENSE

上面的语句表明,LICENSE 是一个文件,其可以被其所有者读写,但不能执行。其仅仅可以被所属的组的用户查看,对于其他用户无权查看、修改、执行此文件。

chmod:修改文件权限

chmod [u|g|o|a] [=|+|-] [r|w|x] file
  • u|g|o|a: u代表用户user,g代表用户组group,o代表其他other,a代表all
  • =|+|-: =表示直接给权限,+/-表示在原来权限的基础上加减权限
  • r|w|x: r表示读权限,w表示写权限,x表示可执行权限
  • file: 文件名

示例:

# 给文件所属于的组(root组)加上写权限
chmod g+w test.txt

chmod的参数还有一种数字描述形式:

chmod [user_num|group_num|other_num] file

第一位数字描述拥有者权限,第二个数字是描述用户组,第三位数字是描述其它用户权限,三个数字都是由读写、执行权限的值相加而来。 我们先定读、写、执行的值为:

  • r = 4
  • w = 2
  • x = 1

比如希望用户权限为可读可写可执行,用户组和其他只能读和执行,那么可以用755代表权限。因为

7 = 4(r)+2(w)+1(x)
5 = 4(r)+1(x)

按照上面的描述,这些数字相加后可能的值有0、1、2、4、3、5、6、7,其中0代表无权限

# 拥有者权限(7代表所有权限),用户组/其它用户(5代表可读、可执行)
chmod 755 test.txt

# 又比如比较粗暴的做法: 让所有用户获得所有权限
chmod 777 test.txt

文件查找

find:在指定目录根据文件信息查找

这是查找文件最强大、也是比较常用的命令,输出结果是列出符合条件的文件列表。可以根据文件的命名、大小、修改时间、类型、权限等信息查找。

find 搜索路径 [选项] 搜索内容

find的选项特别多,这里不一一列举,我们从查找场景去介绍它的使用会更好,更多参数如有需要可自行去查找资料,或者直接

根据文件命名查找

# 在/root目录查找名叫"test.txt"的文件,注意按实际需求限制查找路径范围越小越好,不然查找会慢
find /root -name test.txt

# 在当前目录查找名叫"test.txt"的文件,忽略文件名大小写
find . -iname test.txt

# 在当前目录查找结尾是".txt"的文件
find . -name *.txt

根据文件大小查找

示例:

# 在当前目录下搜索文件大小为100k的文件
find . -size 100k

# 在当前目录下搜索文件大小大于100M的文件。
find . -size +100M

根据文件修改时间查找

我们需要注意几个选项:

  • -atime[+|-]时间:按照文件访问时间搜索
  • -mtime[+|-]时间:按照文件数据修改时间搜索
  • -ctime[+|-]时间:按照文件状态修改时间搜索

以-mtime说明

  • -mtime n:n为数字,意思是在n天之前的【一天之内】被更改过内容的文件;
  • -mtime +n:列出在n天之前(不含n天本身)被更改过内容的文档名;
  • -mtime -n: 列出在n天之内(含n天本身)被更改过内容的文档名;

示例:

# 在当前目录查找内容修改发生在2天之内的文件
find . -mtime -2  

根据文件类型查找

注意选项:

  • -type d:查找目录
  • -type f:查找普通文件
  • -type l:查找软链接文件
# 查找当前文件中的目录
find . -type d

根据文件权限查找

  • -perm: 权限模式:查找文件权限刚好等于“权限模式”的文件
  • -perm: -权限模式:查找文件权限全部包含“权限模式”的文件
  • -perm: +权限模式:查找文件权限包含“权限模式”的任意一个权限的文件

上面我们介绍过文件权限数字描述的含义,这里也用到这些数字:

# 查找权限权限等于755的文件
find . -perm 755

组合查找

会用到逻辑符选项:

  • -a: and逻辑与
  • -o: or逻辑或
  • -not: not 逻辑非

示例:

# 在当前目录下搜索大于2KB,并且文件类型是普通文件的文件
find . -size +2k -a -type f

# 在当前目录下搜索名字叫做test.txt或test.json的文件
find . -name test.txt -o -name test.json

# 在当前目录下查找名字不叫test.txt的文件
find . -not -name test.txt

对查找结果进行操作

# 对查找结果执行 -exec 后面的命令
find 搜索路径 [选项] 搜索内容 -exec 命令 {} \;

# 需确认后对查找结果执行 -ok 后面的命令
find 搜索路径 [选项] 搜索内容 -ok 命令 {} \;

示例:

# 查找当前目录下文件名以.log结尾且24小时内更改过的文件,并进行安全删除操作(即删除前会进行询问)
find -name "*.log" -type f -mtime -1 -ok rm {} \;

grep: 根据文件内容查找

在实际使用中,我们经常管道符配合使用,即在某些命令输出结果后使用grep过滤内容,比如:

# 查看包含"java"字符的进程
ps -ef | grep java

grep的命令格式:

grep [OPTIONS] PATTERN [FILE...]

grep的参数也比较多,但使用不复杂,这里不一一列举,举些例子:

# /etc/nginx.conf中查找包含'8080'的内容
grep "8080" /etc/nginx.conf

# 在多个文件查找内容
grep "root" /etc/passwd /etc/group

# 在当前目录中递归查找内容(即包含其下面多级子目录)
grep -r "root" ./

grep还有更多选项,比较灵活,但是不算常用,可自行查询。

locate:更快的查找

Linux为locate命令在/var/lib/mlocate目录专门有一个文件信息的数据库,用locate命令查找文件时,其实是在这样的数据库中查找。

所以locate命令和find命令的区别就是,locate命令查找文件在数据库中查找,查找的速度非常快,几乎是马上列出结果;而find命令查找时则是直接查找硬盘上的文件,查找的速度相应的非常慢。不过find命令查找文件比locate命令要可靠一些,因为locate的数据库是每天更新一次,如果是刚刚新建的文件,locate命令会找不到。

locate [OPTION]... [PATTERN]...

选项:

  • -e 将排除在寻找的范围之外。
  • -1 如果 是 1.则启动安全模式。在安全模式下,使用者不会看到权限无法看到 的档案。这会使速度减慢,因为 locate 必须至实际的档案系统中取得档案的 权限资料。
  • -f 将特定的档案系统排除在外,例如我们没有必要把 proc 档案系统中的档案 放在资料库中。
  • -q 安静模式,不会显示任何错误讯息。
  • -n 至多显示 n个输出。
  • -r 使用正规运算式 做寻找的条件。
  • -o 指定资料库存的名称。
  • -d 指定资料库的路径
  • -h 显示辅助讯息
  • -V 显示程式的版本讯息
# 查找和log相关的文件
locate log

# 使用正则:结尾是.log的文件
locate -r "\.log$"

which/where:查找命令的存放位置

which比where更直白和简洁的定位到程序的位置,whereis比which显示的更丰富,可以同时显示帮助及二进制文件。

which nginx
/usr/sbin/nginx

whereis nginx
nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx /usr/share/man/man8/nginx.8.gz

文件传输

scp

scp 命令用于 Linux 之间复制文件和目录。scp 是 secure copy 的缩写, scp 是 linux 系统下基于 ssh 登陆进行安全的远程文件拷贝命令。一般写法:

scp [可选参数] file_source file_target 

示例:

# 将本地test.txt文件复制到54.138.182.10远程机器的/home目录下
scp /home/test.txt root@54.138.182.10:/home

ftp

FTP是ARPANet的标准文件传输协议,该网络就是现今Internet的前身。

ftp [-dignv][主机名称或IP地址]
  • -d 详细显示指令执行过程,便于排错或分析程序执行的情形。
  • -i 关闭互动模式,不询问任何问题。
  • -g 关闭本地主机文件名称支持特殊字符的扩充特性。
  • -n 不使用自动登陆。
  • -v 显示指令执行过程。
ftp 54.138.182.10

文件解压缩/归档

tar:文件归档、解压缩

tar(英文全拼:tape archive )命令用于备份文件(即文件归档和解开归档)。 tar的参数比较多,我们列出常用的参数:

  • -c或--create 建立新的备份文件。
  • -t或--list 列出备份文件的内容。
  • -x或--extract或--get 从备份文件中还原文件。
  • -v或--verbose 显示指令执行过程。
  • -z或--gzip或--ungzip 通过gzip指令处理备份文件。
# 将test1.txt和test2.txt压缩打包为为test.tar.gz
tar -czvf test.tar.gz test1.txt test2.txt

# 解压test.tar.gz
tar -xzvf test.tar.gz 

zip/unzip:文件解压缩

命令参数较多,我们举例子说明:

# -r为递归处理,这里是把/home/html下的所有文件压缩到html.zip
zip -r html.zip /home/html

# 将test1.txt和test2.txt压缩打包为为test.zip
zip test.zip test1.txt test2.txt

# 查看压缩包里的文件
unzip -l test.zip 
# 或
unzip -v test.zip

# 解压test.zip
unzip  test.zip

编辑器

熟悉linux基础操作的过程就是熟悉命令和快捷键的过程,vi/vim也不例外。在没有Gui情况下,操作指令非常多,我们可以按照需要记住一些常用的操作即可,在学习和查询中不断熟悉完善学习,下图列举了vi的使用指令: image.png

学习vi或vim的技巧就是多去练习,慢慢熟悉它的操作习惯。

篇幅有限,具体vi编辑器的使用这里不多做介绍,可以自行查找教程学习。

你也可以通过文件传输,在本地使用自己熟悉的编辑器编辑完文本后在上传到linux(当然这比较麻烦),我还是推荐去掌握vi的使用。

进程管理

ps:查看系统进程

介绍常用的ps用法:

# 查看所有进程
ps -A

# 查看目前所有的正在内存当中的程序
ps aux

# 带(启动)命令显示进程
ps -ef

# 配合grep筛选显示
ps -ef | grep java

top:实时查看进程运行情况

选项:

  • b:以批量模式运行,但不能接受命令行输入;
  • c:显示命令行,而不仅仅是命令名;
  • d:显示两次刷新时间的间隔,比如 -d 5,表示两次刷新间隔为5秒;
  • i:不显示空闲进程和僵尸进程;
  • n:更新的次数,完成后退出top。比如 -n 5,表示top更新5次数据就退出;
  • p:参数为PID,仅监视指定进程的ID;PID是一个数值;
  • q:不经任何延时就刷新;
  • s:安全模式运行,禁用一些效互指令;
  • S:累积模式,输出每个进程的总的CPU时间,包括已死的子进程;
top

image.png

lsof:列出当前系统打开文件的工具

lsof [options] filename

选项:

  • -a:列出打开文件存在的进程。
  • -c<进程名> :列出指定进程所打开的文件。
  • -g:列出GID号进程详情。
  • -d<文件号>:列出占用该文件号的进程。
  • +d<目录> :列出目录下被打开的文件。
  • +D<目录> :递归列出目录下被打开的文件。
  • -n<目录> :列出使用NFS的文件。
  • -i<条件> :列出符合条件的进程。(4、6、协议、:端口、 @ip )
  • -p<进程号> :列出指定进程号所打开的文件。
  • -u :列出UID号进程详情。
  • -h :显示帮助信息。
  • -v :显示版本信息。

示例:

# 列出谁在使用某个端口。
命令:lsof -i:3306

kill:结束进程

kill [选项] [进程号]

常用操作信号对应的数字:

HUP    1    终端断线
INT     2    中断(同 Ctrl + C)
QUIT    3    退出(同 Ctrl + \)
TERM   15    终止
KILL    9    强制终止
CONT   18    继续(与STOP相反, fg/bg命令)
STOP    19    暂停(同 Ctrl + Z)
# 查看操作信号
kill -l
 1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL       5) SIGTRAP
 6) SIGABRT      7) SIGBUS       8) SIGFPE       9) SIGKILL     10) SIGUSR1
11) SIGSEGV     12) SIGUSR2     13) SIGPIPE     14) SIGALRM     15) SIGTERM
16) SIGSTKFLT   17) SIGCHLD     18) SIGCONT     19) SIGSTOP     20) SIGTSTP
21) SIGTTIN     22) SIGTTOU     23) SIGURG      24) SIGXCPU     25) SIGXFSZ
26) SIGVTALRM   27) SIGPROF     28) SIGWINCH    29) SIGIO       30) SIGPWR
31) SIGSYS      34) SIGRTMIN    35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3
38) SIGRTMIN+4  39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8
43) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7
58) SIGRTMAX-6  59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2
63) SIGRTMAX-1  64) SIGRTMAX

# 我们可以使用`ps`命令查看进程的第二列拿到进程号
ps aux

# 强制终止进程
kill –9 3268

磁盘信息

  • df -hl:查看磁盘剩余空间
  • df -h:查看每个根路径的分区大小
  • du -sh [目录名]:返回该目录的大小
  • du -sm [文件夹]:返回该文件夹总M数
  • du -h [目录名]:查看指定文件夹下的所有文件大小(包含子文件夹)

防火墙

一般以下工具只留一种即可,免得配置复杂,最好是iptables。

iptables

其规则比较复杂,我们简单介绍。

# 查看规则
iptables –L

# 开放3306端口
sudo iptables -I INPUT 2 -p tcp --dport 3306 -j ACCEPT

# 删除INPUT列表中的第二条规则
sudo iptables -D INPUT 2

# 保存规则
service iptables save

ufw

iptables很强大也很复杂,于是便有UFW和Firewalld。它们的命令简单清晰很多,底层都是调用iptables。UFW是Ubuntu下防火墙。

# 启动ufw 
systemctl start ufw 

# 停用ufw 
systemctl stop ufw

# 查询ufw开启状态,打印规则 
ufw status 
# 允许80端口访问 
ufw allow 80 
# 拒绝8000端口访问 
ufw deny 9000 
# 拒绝ip为xxx.xxx.xxx.xxx访问 
ufw deny from xxx.xxx.xxx.xxx 
# 允许通过tcp协议,9000-9002访问 
ufw allow 9000:9002/tcp 
# 删除规则 
ufw delete allow http

Firewalld

Firewalld是Fedora/CentOS 8之后版本自带的防火墙:

# 启动
firewalld systemctl start firewalld 

# 停用
firewalld systemctl stop firewalld

# 允许tcp协议8161端口访问,--zone(作用域),--permanent(永久生效) 
firewall-cmd --zone=public --add-port=8161/tcp --permanent 
# 重新加载规则 
firewall-cmd --reload 
# 将80端口的流量转发至8080 
firewall-cmd --add-forward-port=port=80:proto=tcp:toport=8080 
# 将80端口的流量转发至192.168.0.1 
firewall-cmd --add-forward-port=proto=80:proto=tcp:toaddr=192.168.1.0.1 
# 将80端口的流量转发至192.168.0.1的8080端口 
firewall-cmd --add-forward-port=proto=80:proto=tcp:toaddr=192.168.0.1:toport=8080

安装命令

CentOS/RHEL/Fedora

格式:

yum [options] [command] [package ...]
  • options 可选,选项包括-h(帮助),-y(当安装过程提示选择全部为 "yes"),-q(不显示安装的过程)等等。
  • command 要进行的操作。
  • package 安装的包名。 示例:
# 列出所有可更新的软件清单
yum check-update

# 更新所有软件
yum update

# 安装wget
yum install wget

# 确认安装是否成功
rpm -qa | grep wget

# 删除软件包
yum remove <package_name>

# 查找软件包
yum search <keyword>

# 找出以 pam 为开头的软件
yum list pam*

Debian/Ubuntu

apt [options] [command] [package ...]
  • options 可选,选项包括 -h(帮助),-y(当安装过程提示选择全部为"yes"),-q(不显示安装的过程)等等。
  • command 要进行的操作。
  • package:安装的包名。

常用操作示例:

# 列出所有可更新的软件清单
sudo apt update

# 升级软件包
sudo apt upgrade

# 列出可更新的软件包及版本信息
apt list --upgradeable

# 升级软件包,升级前先删除需要更新软件包
sudo apt full-upgrade

# 安装指定的软件命令
sudo apt install <package_name>

# 安装多个软件包
sudo apt install <package_1> <package_2> <package_3>

# 更新指定的软件命令
sudo apt update <package_name>

# 显示软件包具体信息,例如:版本号,安装大小,依赖关系等等
sudo apt show <package_name>

# 删除软件包命令
sudo apt remove <package_name>

# 清理不再使用的依赖和库文件:
sudo apt autoremove

# 移除软件包及配置文件:
sudo apt purge <package_name>

# 查找软件包命令
sudo apt search <keyword>

# 列出所有已安装的包
apt list --installed

# 列出所有已安装的包的版本信息
apt list --all-versions

感谢阅读!欢迎关注系列专栏《小团队web技术搭建》