持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第3天,点击查看活动详情
作为一个前端工程师,部署自己的项目就需要会操作服务器,本文只是把自己常用到的一些服务器知识汇总,仅作为复习用。
环境变量
当我们在安装 node 后,在主目录执行 node -v,发现找不到 node 这个命令,但是进入安装 node的目录,再执行就能运行了。现在我想要在任何目录都能执行 node 命令,那怎么做呢?
答案是环境变量,如何在 mac 添加环境变量呢?
vi .bash_profile
export REDIS_HOME=/usr/local/redis/bin
export PATH=$PATH:$REDIS_HOME
source .bash_profile
- 首先
export + 自定义名字(REDIS_HOME) = 路径名称 - 然后
export PATH=$PATH:$+自定义名字(REDIS_HOME) - 最后执行
echo $PATH可以查看我们添加的环境变量
可以看到环境变量 $PATH 有好几个路径,当我们在终端输入一个命令的时候,电脑就会依次按照$PATH 中设定的路径来到目录中去查找,如果存在同名的路径,则执行先找到的那个。
linux 文件属性
Linux 是多用户多任务操作系统,文件属性是其权限管理和资源控制的核心基础,用于定义文件的所有者、所属组、访问权限、类型、大小、时间戳等关键信息。通过 ls -l 命令可查看文件完整属性。
最常用的查看命令是 ls -l(长格式输出),执行后会显示文件的完整属性信息,示例如下:
ls -l /home/user
输出:
total 48
drwxr-xr-x 2 root root 4096 Dec 2 10:00 bin
-rw-r--r-- 1 user user 1234 Dec 1 15:30 note.txt
lrwxrwxrwx 1 root root 10 Nov 30 09:00 jdk -> /usr/local/jdk11
drwxrwx--- 3 user dev 4096 Nov 29 14:00 project
每行输出共 7 个核心字段,对应关系如下:
| 字段位置 | 示例值 | 含义 | 核心作用 |
|---|---|---|---|
| 1 | drwxr-xr-x | 文件类型 + 权限位(10 个字符) | 区分文件类型、控制访问权限 |
| 2 | 2 | 硬链接数(目录默认 ≥2,文件默认 1) | 查看文件的硬链接别名数量 |
| 3 | root | 文件所有者(User) | 定义文件的归属用户 |
| 4 | root | 文件所属组(Group) | 定义文件的归属用户组 |
| 5 | 4096 | 文件大小(目录默认 4096 字节,单位:字节) | 查看文件占用磁盘空间 |
| 6 | Dec 2 10:00 | 最后修改时间(mtime) | 排查文件是否被修改、备份依据 |
| 7 | bin | 文件名 / 目录名(软链接会显示 -> 目标路径) | 标识文件 / 目录名称 |
文件类型 + 权限位(第 1 字段,10 个字符)
Linux 中一切皆文件,通过首字符区分 3 种常见类型:
| 字符 | 类型 | 示例 | 说明 |
|---|---|---|---|
d | 目录(Directory) | drwxr-xr-x | 文件夹,用于存放文件 / 子目录 |
- | 普通文件(Regular) | -rw-r--r-- | 文本、图片、可执行程序等常规文件 |
l | 软链接(Symbolic Link) | lrwxrwxrwx | 快捷方式,指向其他文件 / 目录 |
访问权限(后 9 个字符,分 3 组)
权限位按「所有者(User)→ 所属组(Group)→ 其他用户(Other)」分组,每组 3 位,分别控制读(r)、写(w)、执行(x)权限:
示例解读(以 -rw-r--r-- 为例):
- 类型:
-(普通文件); - 所有者权限:
rw-(可读写,无执行权限); - 所属组权限:
r--(仅读,无写、执行权限); - 其他用户权限:
r--(仅读,无写、执行权限)
限的数字表示法
Linux 文件属性有两种设置方法,一种是数字,一种是符号。
- owner = rwx = 4+2+1 = 7
- group = rwx = 4+2+1 = 7
- others= --- = 0+0+0 = 0
# 将 file.txt 权限改为 644(所有者读写,其他只读)
chmod 644 file.txt
# 将 project 目录权限改为 755(所有者读写执行,其他读执行)
chmod 755 project/
# 递归修改目录及子文件权限为 755
chmod -R 755 project/
所有者与所属组
- 所有者(User) :文件的创建者或被指定的用户,拥有最高控制权(可修改权限、删除文件);
- 所属组(Group) :文件归属的用户组,组内用户共享该组的权限;
# 修改文件所有者为 user
chown user file.txt
# 修改文件所属组为 dev
chown dev file.txt
# 同时修改所有者和所属组
chown user:dev file.txt
linux 目录结构
/:根目录
- 作用:所有目录的 “根节点”,Linux 中所有文件 / 目录都挂载在
/下,唯一的顶级目录。 - 注意:根目录空间有限,避免直接存放文件(建议存到
/home或/var)。
/bin:基础可执行命令
- 作用:存放所有用户(普通用户 + root)都能执行的基础命令,系统启动和单用户模式下必须可用。
- 核心命令:
ls、cp、mv、rm、cat、echo等(无复杂依赖,可独立运行)。 - 区别于
/sbin:/bin命令普通用户可执行,/sbin仅 root 用于系统管理。
/sbin:系统管理命令
- 作用:存放仅 root 用户可用的系统管理命令,用于系统配置、硬件管理、故障排查。
- 核心命令:
reboot(重启)、shutdown(关机)、fdisk(磁盘分区)、ifconfig(网络配置)、mkfs(格式化文件系统)等。 - 使用场景:普通用户执行会提示 “权限不足”,需用
sudo或切换到 root 用户。
/dev:设备文件目录
- 作用:Linux 中 “一切皆文件”,硬件设备通过该目录下的设备文件映射,程序通过操作文件实现对硬件的控制。
/etc:系统配置文件目录
-
作用:存放系统级和应用程序的配置文件,修改该目录下的文件会影响系统或程序的运行。
-
核心子目录 / 文件:
- 系统配置:
/etc/passwd(用户账户信息)、/etc/group(用户组信息)、/etc/shadow(用户密码哈希)、/etc/fstab(文件系统挂载配置)、/etc/resolv.conf(DNS 配置); - 服务配置:
/etc/nginx(Nginx 配置)、/etc/mysql(MySQL 配置)、/etc/systemd(systemd 服务配置); - 网络配置:
/etc/network(网络接口配置,部分发行版用/etc/sysconfig/network-scripts)。
- 系统配置:
/home:普通用户主目录
- 作用:存放普通用户的个人文件、配置、工作目录,每个用户对应一个同名子目录(由
useradd自动创建)。 - 示例:创建用户
test后,会生成/home/test目录,该用户的文件默认存于此(如文档、下载、桌面)。 - 权限:每个用户仅对自己的
/home/用户名目录有读写权限,其他用户无权限(默认权限700)。
/root:超级用户主目录
- 作用:
root用户(系统管理员)的个人目录,类似普通用户的/home,但独立存在(root权限最高,无需存于/home)。 - 注意:普通用户无法访问
/root(默认权限700),需切换到root用户(su - root)或用sudo操作。
/opt:第三方应用程序目录
- 作用:存放手动安装的第三方软件(非系统包管理器安装,如源码编译的 JDK、Tomcat、MySQL)。
- 优点:独立于系统目录,便于管理和卸载(删除整个
/opt/软件名目录即可)。 - 示例:安装 JDK 11 到
/opt/jdk11,安装 Tomcat 到/opt/tomcat,配置环境变量时指向该目录。
/usr:共享系统资源目录
- 作用:存放用户级的共享资源(程序、库、文档、图标等),是系统中最大的目录之一,核心子目录丰富。
- 核心子目录详解:
| 子目录 | 作用 | 核心内容 |
|---|---|---|
/usr/bin | 普通用户常用命令(非系统必需) | curl、wget、git 等(系统启动后可用) |
/usr/sbin | root 系统管理命令(非启动必需) | httpd(Apache 服务)、sshd(SSH 服务)等 |
/usr/lib//usr/lib64 | 应用程序共享库 | 非系统核心库(如第三方软件依赖库) |
/usr/share | 架构无关的共享数据 | 文档(man 手册)、图标、字体、示例配置 |
/usr/local | 本地安装软件目录 | 源码编译安装的软件(默认路径 ./configure --prefix=/usr/local) |
/tmp:临时文件目录
- 作用:所有用户可读写的临时文件存储区,系统重启后自动清空(部分发行版定时清理,如 CentOS 每 10 天清理一次)。
- 权限:默认权限
1777(rwxrwxrwt,Sticky Bit 特殊权限,仅文件所有者可删除自己的文件)。 - 使用场景:程序运行时生成的临时文件、脚本测试文件(避免存重要数据)。
/var:可变数据目录
- 作用:存放系统运行中动态变化的文件(如日志、缓存、数据库数据、邮件),与
/usr(静态资源)相对。 - 核心子目录详解:
| 子目录 | 作用 | 核心内容 |
|---|---|---|
/var/log | 系统和应用日志 | syslog(系统日志)、auth.log(认证日志)、nginx/error.log(Nginx 错误日志) |
/var/lib | 应用程序数据 | MySQL 数据(mysql/)、Docker 镜像(docker/)、软件包缓存(dpkg//rpm/) |
/var/spool | 队列数据 | 邮件队列(mail/)、打印队列(cups/) |
/var/cache | 应用程序缓存 | APT/YUM 包管理器缓存(apt//yum/)、浏览器缓存 |
/var/tmp | 长期临时文件 | 比 /tmp 清理频率低(部分系统重启后不清理) |
linux 常用命令
搜索
grep: 搜索文件里面的内容
// 搜索某个文件里面是否包含字符串
grep 'adb' /data/a.txt
// 在多个文件检索某个字符串
grep 'zifuchuan' *.log
// 递归搜索某个目录和子目录下的所有文件
grep -r 'asd' 文件目录
find: 搜索匹配条件的文件
// 格式
find ./ -type f -name "文件名"
参数依次是:find命令,这里的./指的是当前路径,-type是选择文件类型,文件类型可以是 f,d,l,f是文件类型,d是目录类型,l是链接类型等。-name 按照名称查找,文件名称要加引号。
// 在etc目录及其子目录下,查找host开头的文件
find /etc -name 'host*'
两者的区别:
- 搜索维度完全不同:
find专注于文件系统层面,搜索的是 “文件 / 目录” 这个实体,依据的是文件的元数据(路径、名称、大小、修改时间、权限、所有者等)。
find /var/log -name "*.log"
grep专注于文本内容层面, 搜索的是文件内的字符数据,依据的是字符串 / 正则表达式。
grep "Linux" *.txt
tail: 查看日志文件
tail 是 Linux 中专门用于查看文件尾部内容的命令,而日志文件(如 .log)通常是实时追加更新的(新日志不断写在文件末尾),因此 tail 是查看日志的核心工具 —— 尤其适合实时监控日志、查看最新日志条目。
快速查看日志最新 10 行(默认行为)
# 查看 app.log 最新10条日志
tail app.log
实时监控日志
tail -f filename // -f=follow 实时跟踪文件更新
该命令会把filename文件里面的最尾部的内容显示在屏幕上,并且不断刷新,只要filename更新就可以看到最新的文件内容。
查看日志最新 N 行(自定义行数)
tail -n 100 app.log // 显示文件最后 N 行(`n`=number)
telnet: 验证某个服务是否正常
telnet 是 Linux/Unix 中用于 TCP 协议调试与端口连通性测试 的经典工具,核心作用是建立 TCP 连接并传递纯文本数据,常用来验证服务器端口是否开放、网络是否可达(比如测试数据库、Web 服务、接口的端口连通性)。
本质是于 TCP 协议的客户端工具,通过 TCP 三次握手 建立连接,连接成功后可双向传输纯文本(无加密,明文传输)。
telnet [HostName or IP] [PortNumber]
- 主机名 / IP:目标服务器的域名(如
www.baidu.com)或 IP 地址(如192.168.1.100)。 - 端口号:必须指定(TCP 端口范围 1-65535),如
80(HTTP)、443(HTTPS)、3306(MySQL)、22(SSH)。
适用场景
- 服务器端口是否开放(如:
80端口、3306数据库端口、8080应用端口)。 - 验证 TCP 服务是否正常响应(如:手动发送 HTTP 请求、测试 Socket 服务)。
- 网络连通性(区分是端口未开放,还是网络防火墙拦截)。
测试80 端口(HTTP 服务)
telnet www.baidu.com 80
连接成功(端口开放)的输出:
Trying 180.101.49.11... # 解析 IP
Connected to www.baidu.com. # 连接成功
Escape character is '^]'. # 提示:按 Ctrl+] 退出交互模式
telnet 和 ping 的区别
telnet 和 ping 是 Linux 中两种完全不同用途的网络工具,核心区别在于:
ping基于 ICMP 协议,用于测试「主机是否可达」(网络层连通性), 工作在 网络层(OSI 第 3 层),向目标主机发送 “请求包”,如果目标主机在线且网络通畅,会返回 “响应包”,无需关注具体服务。telnet基于 TCP 协议,用于测试「特定端口是否开放 + 服务是否响应」(传输层连通性)。工作在 传输层(OSI 第 4 层) ,使用 TCP 协议 ——TCP 是 “面向连接的可靠协议”,必须通过 “三次握手” 建立连接,且针对具体端口(端口对应上层服务)。
简单说:ping 验证 “服务器活着没”,telnet 验证 “服务器的某个服务能用没”。
场景 1:服务器是否在线?—— 用 ping
想知道远程服务器(如 192.168.1.100)是否开机、网络是否通畅,用 ping:
ping 192.168.1.100
场景 2:服务器的 MySQL 服务是否可用?—— 用 telnet
ping 成功只能说明服务器在线,但 MySQL 服务(默认端口 3306)可能未启动,或端口被防火墙拦截,此时用 telnet 测试:
telnet 192.168.1.100 3306
ps(process status): 显示当前进程的状态
ps(Process Status)是 Linux 中用于查看系统进程状态的核心命令,能列出当前运行的进程信息。
ps -ef:显示所有进程信息。
| 选项 | 含义 | 作用 |
|---|---|---|
-e | 全称 --everyone/--all | 列出系统所有进程(包括所有用户、后台进程、系统进程),无遗漏 |
-f | 全称 --full | 显示完整格式的进程信息(比默认格式多父进程 ID、用户 ID 等关键字段) |
简单说:-e 保证 “查全”,-f 保证 “查细”,组合后就是 “查看所有进程的完整详情”。
执行 ps -ef 后,输出会按固定字段排列,核心字段如下(按输出顺序):
| 字段 | 全称 | 含义 | 实用场景 |
|---|---|---|---|
UID | User ID | 进程所属用户的 ID(对应用户名,如 root 是 0) | 确认 “哪个用户启动的进程”(如是否是 root 权限进程) |
PID | Process ID | 进程唯一标识(核心!) | 杀进程(kill PID)、关联其他工具(如 top -p PID) |
PPID | Parent PID | 父进程 ID(进程的 “启动者”) | 查看进程父子依赖(如谁启动了 nginx、java 进程) |
C | CPU Utilization | 进程占用的 CPU 百分比(简化版,0 表示低占用) | 快速判断进程是否耗 CPU(数值越大越耗) |
STIME | Start Time | 进程启动时间(格式:月 - 日 或 时:分) | 排查 “进程是否刚启动”“是否长期运行”(如 STIME 是 3 天前,说明长期运行) |
TTY | Terminal | 进程所属终端(? 表示无终端,即后台进程) | 区分 “前台进程”(有终端,如 pts/0)和 “后台守护进程”(无终端) |
TIME | CPU Time | 进程累计占用的 CPU 总时间(时:分: 秒) | 辅助判断进程耗 CPU 程度(时间越长,说明越耗 CPU) |
CMD | Command | 启动进程的完整命令(含路径和参数) | 确认进程实际用途(如 java -jar app.jar --port=8080) |
截取 nginx 进程片段
UID PID PPID C STIME TTY TIME CMD
root 5678 1 0 09:00 ? 00:00:01 /usr/sbin/nginx -g daemon on; master_process on;
www-data 5679 5678 0 09:00 ? 00:00:05 nginx: worker process
www-data 5680 5678 0 09:00 ? 00:00:04 nginx: worker process
解读:nginx 主进程(PID=5678)由系统初始化进程(PPID=1,即 systemd)启动,用户是 root;两个工作进程(PID=5679、5680)的父进程是主进程(PPID=5678),用户是 www-data(权限更低,更安全)。
- 高频用法:
ps -ef | grep 关键词(过滤目标进程); - 关键字段:
PID(杀进程)、PPID(查父进程)、CMD(确认进程用途);
curl: 命令行网页浏览器
curl 是 Linux 中功能强大的 HTTP/HTTPS 客户端工具,支持 GET/POST/PUT/DELETE 等请求方法,还能模拟表单提交、文件上传下载、设置请求头、调试接口等,是开发 / 运维调试接口、访问网页、查看接口响应的必备工具(无图形界面时替代浏览器)。
基础用法 —— 发送 GET 请求(访问网页 / 接口)
curl http://www.linux.com
执行后,www.linux.com 的html就会显示在屏幕上了。由于安装 linux 的时候很多时候是没有安装桌面的,也意味着没有浏览器,因此这个方法也经常用于测试一台服务器是否可以到达一个网站。
只看响应头(不看正文)
用 -I(大写 i)选项,仅显示 HTTP 响应头(排查接口状态码、缓存等):
curl -I https://www.baidu.com
HTTP/1.1 200 OK
Accept-Ranges: bytes
Cache-Control: private, no-cache, no-store, proxy-revalidate, no-transform
Content-Type: text/html
wget: 从web上下载内容
wget 是 Linux 中专注于 文件下载 的命令行工具,支持 HTTP/HTTPS/FTP 等协议。
// 使用wget下载redis的tar.gz文件
wget https://download.redis.io/releases/redis-6.0.8.tar.gz
tar: 压缩解压
tar [选项] [文件..]
命令选项
- c: create 创建一个新归档(压缩)
- x: extract 从归档中解出文件(解压)
- v: verbose 详细地列出处理的文件过程
- f: file=ARCHIVE 使用归档文件或 ARCHIVE 设备,这个参数是最后一个,后面只接文件名
// 将 1.txt 2.txt 3.txt 4.txt 文件打包为 test.tar
tar -cvf test.tar(压缩后的文件名) *.txt(被压缩的文件)
// 将 test.tar 解包
tar -xvf test.tar
ln: 软链接
当我们需要在不同的目录,用到相同的文件时,我们不需要在每一个需要的目录下都放一个必须相同的文件,我们只要在某个固定的目录,放上该文件,然后在其它的目录下用ln命令链接(link)它就可以,不必重复的占用磁盘空间。
ln -s 源文件 目标文件 // Symbolic Link
比如我现在node应用程序安装在usr/local下,但是我想着在全局使用node命令,那么我们就需要把node放到全局变量里面,在linux中,全局变量放在usr/local/bin下面。
ln -s /usr/local/nodejs/bin/node /usr/local/bin
which: 查看环境变量里面的可执行文件
which 是 Linux 中用于 查找可执行文件路径 的命令,核心作用是根据当前用户的 PATH 环境变量(系统查找可执行文件的路径列表),定位命令 / 程序的具体安装位置,常用于验证命令是否已安装、确认执行的是哪个版本的命令(避免同名命令冲突)。
which [选项] 命令名/程序名
- 核心逻辑:
which会遍历PATH变量中的所有目录(如/usr/bin、/bin、/usr/local/bin等),找到第一个与 “命令名” 匹配的可执行文件,输出其绝对路径。 - 注意:仅查找 可执行文件(如
ls、java、nginx),不查找普通文件、配置文件或目录。
查找自定义安装的命令(如 nginx)
which nginx
输出: 自定义安装到 `/usr/local/nginx/sbin`
scp: 传输文件到服务器
scp(Secure Copy)是 Linux 中基于 SSH 协议 的安全文件传输工具,核心作用是在本地主机与远程主机之间、或两台远程主机之间加密传输文件 / 目录(数据传输过程加密,比 ftp 安全),常用于服务器之间备份数据、部署文件、迁移资源等场景。
# 1. 本地文件 → 远程主机(上传文件)
scp [选项] 本地文件路径 远程用户@远程主机IP:远程目标路径
# 2. 远程文件 → 本地主机(下载文件)
scp [选项] 远程用户@远程主机IP:远程文件路径 本地目标路径
# 3. 远程主机A文件 → 远程主机B文件(跨远程传输,本地作为中转)
scp [选项] 远程用户A@主机AIP:文件路径 远程用户B@主机BIP:目标路径
把本地的 dist 文件传到服务器上的 /root/vue3-zhihu 目录
scp -r dist root@47.101.***.170:/root/vue3-zhihu // -r : 递归传输目录
文件操作
mkdir 创建目录
在当前目录创建 test 目录
mkdir test
验证:用 ls 查看,当前目录会新增 test 文件夹。
递归创建多级目录(核心选项 -p,必记!)
mkdir -p test1/test2/test3/test4
用 -p(parent,父目录)选项可一次性创建 “多级嵌套目录”,即使父目录不存在也会自动创建,无需手动逐级创建(最实用场景)。
mv
mv(move)是 Linux 中用于移动文件 / 目录或重命名文件 / 目录的核心命令。
# 场景 1:重命名(源和目标在同一目录,仅名称不同)
mv [选项] 源文件/目录 新名称
# 场景 2:移动(源和目标在不同目录,路径不同)
mv [选项] 源文件/目录 目标目录
// 比如把文件夹test重命为test1
mv test test1
// 把文件test2里面的内容移动到test文件中
mv test2/* test
cp: 复制文件或目录
cp [选项] 源目录 目标目录
# 将 app.txt 复制到当前目录,并重命名为 app-backup.txt
cp app.txt app-backup.txt
# 或复制到其他目录并重命名
cp app.txt /home/user/docs/app-2025.txt
# 将 file1.jpg、data.csv、report.pdf 同时复制到 /opt/backup 目录
cp -i file1.jpg data.csv report.pdf /opt/backup/
# 将当前目录的 project 目录(含所有子文件)复制到 /opt/projects 目录下
cp -r project /opt/projects/