前端工程师应该掌握的linux命令

470 阅读18分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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
  1. 首先 export + 自定义名字(REDIS_HOME) = 路径名称
  2. 然后 export PATH=$PATH:$+自定义名字(REDIS_HOME)
  3. 最后执行echo $PATH可以查看我们添加的环境变量

image.png

可以看到环境变量 $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 个核心字段,对应关系如下:

字段位置示例值含义核心作用
1drwxr-xr-x文件类型 + 权限位(10 个字符)区分文件类型、控制访问权限
22硬链接数(目录默认 ≥2,文件默认 1)查看文件的硬链接别名数量
3root文件所有者(User)定义文件的归属用户
4root文件所属组(Group)定义文件的归属用户组
54096文件大小(目录默认 4096 字节,单位:字节)查看文件占用磁盘空间
6Dec 2 10:00最后修改时间(mtime)排查文件是否被修改、备份依据
7bin文件名 / 目录名(软链接会显示 -> 目标路径标识文件 / 目录名称

文件类型 + 权限位(第 1 字段,10 个字符)

Linux 中一切皆文件,通过首字符区分 3 种常见类型:

字符类型示例说明
d目录(Directory)drwxr-xr-x文件夹,用于存放文件 / 子目录
-普通文件(Regular)-rw-r--r--文本、图片、可执行程序等常规文件
l软链接(Symbolic Link)lrwxrwxrwx快捷方式,指向其他文件 / 目录

访问权限(后 9 个字符,分 3 组)

image.png

权限位按「所有者(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 目录结构

image.png

/:根目录

  • 作用:所有目录的 “根节点”,Linux 中所有文件 / 目录都挂载在 / 下,唯一的顶级目录。
  • 注意:根目录空间有限,避免直接存放文件(建议存到 /home 或 /var)。

/bin:基础可执行命令

  • 作用:存放所有用户(普通用户 + root)都能执行的基础命令,系统启动和单用户模式下必须可用。
  • 核心命令:lscpmvrmcatecho 等(无复杂依赖,可独立运行)。
  • 区别于 /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普通用户常用命令(非系统必需)curlwgetgit 等(系统启动后可用)
/usr/sbinroot 系统管理命令(非启动必需)httpd(Apache 服务)、sshd(SSH 服务)等
/usr/lib//usr/lib64应用程序共享库非系统核心库(如第三方软件依赖库)
/usr/share架构无关的共享数据文档(man 手册)、图标、字体、示例配置
/usr/local本地安装软件目录源码编译安装的软件(默认路径 ./configure --prefix=/usr/local

/tmp:临时文件目录

  • 作用:所有用户可读写的临时文件存储区,系统重启后自动清空(部分发行版定时清理,如 CentOS 每 10 天清理一次)。
  • 权限:默认权限 1777rwxrwxrwt,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 后,输出会按固定字段排列,核心字段如下(按输出顺序):

字段全称含义实用场景
UIDUser ID进程所属用户的 ID(对应用户名,如 root 是 0)确认 “哪个用户启动的进程”(如是否是 root 权限进程)
PIDProcess ID进程唯一标识(核心!)杀进程(kill PID)、关联其他工具(如 top -p PID
PPIDParent PID父进程 ID(进程的 “启动者”)查看进程父子依赖(如谁启动了 nginx、java 进程)
CCPU Utilization进程占用的 CPU 百分比(简化版,0 表示低占用)快速判断进程是否耗 CPU(数值越大越耗)
STIMEStart Time进程启动时间(格式:月 - 日 或 时:分)排查 “进程是否刚启动”“是否长期运行”(如 STIME 是 3 天前,说明长期运行)
TTYTerminal进程所属终端(? 表示无终端,即后台进程)区分 “前台进程”(有终端,如 pts/0)和 “后台守护进程”(无终端)
TIMECPU Time进程累计占用的 CPU 总时间(时:分: 秒)辅助判断进程耗 CPU 程度(时间越长,说明越耗 CPU)
CMDCommand启动进程的完整命令(含路径和参数)确认进程实际用途(如 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 等),找到第一个与 “命令名” 匹配的可执行文件,输出其绝对路径。
  • 注意:仅查找 可执行文件(如 lsjavanginx),不查找普通文件、配置文件或目录。
查找自定义安装的命令(如 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/