
1. 项目概述为什么测试工程师必须掌握Linux命令在软件测试这个行当里干了十几年我越来越觉得一个测试工程师的“兵器库”里除了测试用例、缺陷管理工具和自动化脚本Linux命令行绝对是那把最趁手、最锋利的“瑞士军刀”。你可能觉得测试不就是点点点或者写写自动化脚本吗跟黑乎乎的终端有什么关系这个想法恰恰是很多测试新手甚至是工作了几年的朋友容易陷入的误区。我见过太多测试同事遇到服务器日志需要查看、环境需要简单配置、进程需要排查、文件需要批量处理时第一反应是去找开发或者运维。一来二去沟通成本高效率低下自己的技术视野也被局限在了“用户界面”这一亩三分地。实际上无论是Web应用、移动App还是后端服务它们的“家”大多安在Linux服务器上。测试尤其是涉及接口、性能、安全、稳定性等更深层次的测试本质上就是在和这些服务器打交道。不会用命令就像医生不会用听诊器你只能看到表面的症状却无法深入病灶进行诊断。所以当我看到“测试人员常用的20个Linux命令”这个标题时我特别有共鸣。这绝不是一份冷冰冰的命令列表而是一张通往“全栈测试”能力的入场券。掌握它们意味着你能独立完成很多基础的环境搭建、问题定位和数据操作不再受制于人意味着你能更精准地描述bug比如“在/opt/app/logs/目录下的error.log中从今天上午10点开始持续出现Connection timeout异常”而不是笼统地说“服务器好像有问题”更意味着当你在进行自动化测试、持续集成/持续部署CI/CD流水线搭建时这些命令将成为你脚本中最坚实的基石。这篇文章我就从一个老测试的角度为你拆解这20个命令。我不会像教科书一样只讲语法而是结合测试工作中最高频、最真实的场景告诉你每个命令“为什么用”、“什么时候用”以及“怎么用才高效”。无论你是刚入行的测试小白还是想提升技术深度的资深同学这份“实战指南”都能让你有所收获。2. 核心思路测试视角下的Linux命令分类与选型逻辑面对成百上千的Linux命令测试人员应该优先掌握哪些我的筛选逻辑很简单紧贴测试活动的核心生命周期。一个测试任务从准备环境、执行测试、监控状态到分析结果、清理现场每个环节都有对应的命令需求。基于此我把这20个命令分为四大类这比单纯罗列更有助于你理解和记忆。2.1 环境探查与导航类成为服务器的“导游”测试开始前你首先得知道自己在哪服务器上有什么。这类命令帮助你快速熟悉战场。定位与导航pwd,cd,ls。这是你的“指南针”和“地图”。系统信息侦察uname,df,free。快速了解服务器型号、磁盘空间和内存使用情况这是环境验证的第一步。2.2 文件与内容操作类测试数据的“管理员”测试离不开测试数据、配置文件和日志。这类命令让你能高效地创建、查看、搜索和处理文件。文件操作touch,mkdir,rm,cp,mv。准备测试数据、备份日志、清理临时文件都靠它们。内容查看与搜索cat,more/less,head/tail,grep。这是测试人员的“王牌”查看实时日志、搜索特定错误、提取关键信息全靠它们。文件传输scp。在本地和服务器、服务器与服务器之间同步测试脚本、抓取日志包不可或缺。2.3 进程与网络诊断类系统状态的“诊断师”当应用无响应、接口超时、性能不佳时你需要像医生一样检查系统的“脉搏”和“神经”。进程管理ps,kill。查看服务是否在运行优雅或强制地结束一个失控的进程。网络诊断ping,telnet/nc(netcat),netstat/ss。检查网络连通性、测试端口是否开放、查看服务监听状态定位网络层问题。2.4 权限与安装部署类环境搭建的“工程师”搭建测试环境、安装依赖、执行脚本时你需要相应的权限和工具。权限管理chmod,chown。当你从别处拷贝了一个脚本却无法执行时就需要它。包管理yum(CentOS/RHEL) 或apt-get(Ubuntu/Debian)。安装测试需要的软件包如curl、jq、docker等。归档解压tar。收到的日志包、安装包基本都是.tar.gz格式。这个分类法贯穿了我整个测试生涯。接下来我们就进入实战环节我会为每个命令配上测试工作中最典型的场景和必须掌握的参数。3. 命令精讲与测试实战场景解析下面我将这20个命令融入具体的测试场景中详细讲解。记住多用、多练是唯一捷径。建议你打开一个Linux终端可以是实体服务器、虚拟机甚至Windows下的WSL跟着操作一遍。3.1 环境探查与导航快速摸清战场3.1.1 pwd, cd, ls我在哪我要去哪这有什么pwd(Print Working Directory)打印当前工作目录。简单但极其重要。尤其是在通过跳板机连接多层目录时随时pwd一下避免操作错目录。$ pwd /home/tester/project/logscd(Change Directory)切换目录。常用技巧cd ~回到家目录。cd -回到上一个所在的目录在两个目录间快速切换时非常方便。cd ..返回上级目录。ls(List)列出目录内容。测试人员必须精通它的参数。ls -l以长格式显示包含权限、所有者、大小、修改时间。最常用。ls -la显示所有文件包括隐藏文件以.开头的。ls -lh以人类可读的格式K, M, G显示文件大小。ls -ltr按时间倒序排列最新修改的文件在最后。查看最新日志文件时巨好用。ls *.log通配符查找所有日志文件。测试场景上线后需要检查服务器上的应用部署情况。连接服务器后$ pwd /home/admin $ cd /opt/myapp/ $ ls -ltr total 16 drwxr-xr-x 2 admin admin 4096 Mar 10 09:00 config drwxr-xr-x 3 admin admin 4096 Mar 10 09:00 lib -rw-r--r-- 1 admin admin 123 Mar 12 15:30 app.jar # 看这是最新的应用jar包 drwxr-xr-x 2 admin admin 4096 Mar 12 15:28 logs一眼就能看出app.jar的更新时间确认部署是否成功。3.1.2 uname, df, free系统健康初检uname -a打印所有系统信息。用于确认服务器操作系统版本、内核版本。当某个bug只出现在特定Linux发行版时这个信息是关键。$ uname -a Linux test-server 5.4.0-100-generic #113-Ubuntu SMP Thu Feb 3 18:43:29 UTC 2022 x86_64 x86_64 x86_64 GNU/Linuxdf -h查看磁盘空间使用情况-h人类可读。测试环境经常因为日志写满导致服务挂掉定期检查是好习惯。$ df -h Filesystem Size Used Avail Use% Mounted on /dev/vda1 50G 45G 2.9G 94% / # 注意根目录使用率94%了快满了注意看到Use%超过90%就要警惕需要联系运维或自己清理日志(/var/log/目录常是罪魁祸首)。free -h查看内存使用情况。做性能测试时这是监控内存泄漏的基础命令。$ free -h total used free shared buff/cache available Mem: 7.7G 3.2G 1.1G 345M 3.4G 3.9G Swap: 2.0G 0B 2.0G关注available列它表示系统可用内存包含缓存比free列更真实。3.2 文件与内容操作高效处理测试资产3.2.1 文件增删改查touch, mkdir, rm, cp, mvtouch filename创建一个空文件或更新已有文件的时间戳。常用于快速创建测试用的空配置文件或标记文件。mkdir -p dir1/dir2创建目录。-p参数可以递归创建多层目录避免因父目录不存在而失败。准备测试用例的目录结构时常用。rm(Remove)危险命令慎用rm file.log删除文件。rm -r directory/递归删除目录及其下所有内容。rm -rf directory/强制递归删除无提示。这是著名的“删库跑路”命令之一在服务器上使用前务必pwd和ls双重确认路径安全技巧习惯使用rm -i交互式删除或先mv到临时目录如/tmp。cp source dest复制。cp -r source_dir/ dest_dir/递归复制目录。cp app.conf app.conf.bak复制一个备份文件修改配置文件前的标准操作。mv source dest移动或重命名。mv old_name.log new_name.log或mv file.log /tmp/。3.2.2 内容查看与搜索cat, less, tail, grep核心中的核心这是测试人员查看日志、分析结果的主力武器必须玩得溜。cat连接并打印整个文件内容。适合看小文件。$ cat test_result.json注意千万不要用cat查看巨大的日志文件比如几个G的终端会卡死。用less或tail。less分页查看文件支持上下翻页、搜索。查看大文件的首选。进入less后按空格向下翻页按b向上翻页按/后输入关键词搜索n下一个N上一个按q退出。tail查看文件尾部内容。监控实时日志的神器。tail -f application.log-f(follow) 参数是精髓。它会持续输出文件新增的内容用于实时监控日志输出。按CtrlC退出。tail -n 100 application.log查看最后100行。tail -n 100 application.log从第100行开始查看到最后。组合技tail -f application.log | grep -i error实时监控并只过滤出包含“error”的行不区分大小写。head查看文件头部内容。head -n 20 file.csv查看CSV文件的前20行了解数据结构。grep(Global Regular Expression Print)文本搜索工具。测试排查问题的“显微镜”。基础搜索grep NullPointerException error.log在日志中搜索异常。常用参数-i忽略大小写。grep -i timeout log.txt-n显示匹配行的行号。grep -n error app.log方便定位。-v反向选择显示不匹配的行。grep -v DEBUG app.log只看非DEBUG级别的日志。-r递归搜索目录下的所有文件。grep -r userId:123 /opt/app/logs/-A 3 -B 2显示匹配行及之后3行(-A)、之前2行(-B)的上下文。极其有用能看到错误发生前后的日志。$ grep -n -A 2 -B 1 Transaction failed payment.log 1045: 2023-10-27 14:30:22 INFO - Processing payment for order 789 1046: 2023-10-27 14:30:23 ERROR - Transaction failed: Insufficient balance. # 匹配行 1047: 2023-10-27 14:30:23 INFO - Rolling back transaction. # 后两行 1048: 2023-10-27 14:30:24 WARN - Notifying user.正则表达式更强大的模式匹配。grep ^2023-10-27 app.log查找以“2023-10-27”开头的行按日期过滤。grep error\|exception\|fatal app.log查找包含error或exception或fatal的行。grep -E [0-9]{3}-[0-9]{8} data.txt使用扩展正则(-E)匹配电话号码模式如123-45678901。3.2.3 文件传输scp在本地和测试服务器之间传输文件。格式scp [参数] 源文件 目标路径。从本地上传至服务器$ scp ./localtest.zip tester192.168.1.100:/home/tester/从服务器下载到本地$ scp tester192.168.1.100:/opt/app/logs/error.tar.gz ./Downloads/常用参数-r递归传输整个目录。-P port指定端口注意是大写P因为小写-p已被保留用于保留文件属性。$ scp -P 2222 ./script.sh userhost:/tmp/3.3 进程与网络诊断定位问题的“听诊器”3.3.1 进程管理ps, killps(Process Status)查看进程。ps aux最常用的组合查看系统所有用户的详细进程信息。重点关注USER,PID,%CPU,%MEM,COMMAND列。ps -ef | grep java经典管道组合查找所有Java进程。$ ps aux | grep nginx root 1234 0.0 0.1 12345 6789 ? Ss Oct26 0:00 nginx: master process www-data 5678 0.0 0.0 23456 1234 ? S Oct26 0:05 nginx: worker process这里找到了Nginx的主进程PID 1234和工作进程。kill终止进程。kill PID发送SIGTERM信号15请求进程正常退出。首选方式。kill -9 PID发送SIGKILL信号9强制立即终止进程。这是“杀手锏”进程无法捕获或忽略可能导致数据丢失或状态不一致仅在kill PID无效时使用。实操心得先ps找到进程PID尝试kill PID等待几秒。如果进程还在再用kill -9 PID。对于像nginx、java这样的服务通常有启动脚本(systemctl或service命令)来优雅地重启比直接kill更好。3.3.2 网络诊断ping, telnet/nc, netstat/ssping测试网络连通性。ping -c 4 baidu.com发送4个包测试到百度的连通性和延迟。telnet或nc(netcat)测试远端服务器的特定端口是否开放、服务是否可连接。这是测试接口服务可达性的基本功。telnet 192.168.1.100 8080如果端口开放且服务正常会显示连接成功可能是一个空白光标或服务横幅。如果连接被拒绝或超时则说明端口未开或网络不通。更推荐使用ncnc -zv 192.168.1.100 8080(-z扫描-v详细信息)输出更清晰。netstat或ss查看网络连接、路由表、接口统计等。ss是更现代、更快的替代品语法类似。netstat -tlnp或ss -tlnp查看本机监听的所有TCP端口及其对应的进程。-tTCP,-l监听,-n数字显示端口,-p显示进程信息。$ ss -tlnp State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 128 *:22 *:* users:((sshd,pid123,fd3)) LISTEN 0 100 127.0.0.1:3306 *:* users:((mysqld,pid456,fd14))可以看到SSH服务在22端口监听MySQL在3306端口监听仅本地可访问。3.4 权限与安装部署掌控环境的“钥匙”3.4.1 权限管理chmod, chownLinux下文件权限是安全基石测试人员常因权限问题导致脚本无法执行。chmod(Change Mode)修改文件权限。权限用数字表示r(读)4,w(写)2,x(执行)1。chmod 755 script.sh给script.sh设置权限为rwxr-xr-x所有者可读可写可执行组用户和其他用户可读可执行。这是可执行脚本的常见权限。chmod x script.sh给所有用户增加执行权限。更简单的写法。chown(Change Owner)修改文件所有者和所属组。chown tester:testgroup file.log将file.log的所有者改为tester所属组改为testgroup。当你用sudo从别处拷贝文件后可能需要用它来改回普通用户权限。3.4.2 包管理yum/apt-get根据Linux发行版选择用于安装软件。CentOS/RHEL$ sudo yum update # 更新软件包列表 $ sudo yum install curl # 安装curl工具常用于测试HTTP接口 $ sudo yum install jq # 安装jq强大的JSON处理命令行工具测试API返回值解析神器Ubuntu/Debian$ sudo apt-get update $ sudo apt-get install curl $ sudo apt-get install jq注意在测试服务器上安装软件前最好确认是否会影响现有服务或使用虚拟环境。3.4.3 归档解压tar测试中经常需要打包日志或解压安装包。解压tar -xzvf package.tar.gz-x解压。-z处理gzip压缩.gz后缀。-v显示详细过程。-f指定文件名。打包压缩tar -czvf logs.tar.gz /path/to/logs/-c创建归档。4. 测试工作流中的命令组合实战单独的命令是工具组合起来才能形成工作流解决复杂问题。下面我模拟几个完整的测试场景看如何串联使用这些命令。4.1 场景一线上问题紧急排查用户反馈支付失败定位服务首先你需要找到支付服务跑在哪台服务器、哪个进程上。$ ps aux | grep -i payment # 查找包含“payment”的进程 appuser 5678 2.3 5.6 1023456 89012 ? Sl 14:30 5:23 java -jar payment-service.jar找到了PID是5678运行用户是appuser。查看实时日志通常日志在特定目录。假设你知道日志路径直接tail -f。$ cd /opt/services/payment/logs/ $ tail -f payment-app.log | grep -A 5 -B 5 ERROR # 实时监控并高亮错误及其上下文如果日志文件太大先看最近的错误$ tail -n 500 payment-app.log | grep -n ERROR | tail -20 # 看最后500行里最后20个错误的行号 $ sed -n 1230,1245p payment-app.log # 假设1230-1245行是关键用sed精确查看这一段分析发现是数据库连接问题需要检查数据库服务状态和网络。$ ss -tlnp | grep :3306 # 检查MySQL 3306端口是否在监听 $ telnet localhost 3306 # 测试从本机能否连上MySQL $ df -h # 顺便看看是不是磁盘满了导致数据库写不了收集证据将关键日志时间段打包准备发给开发。$ grep -n 2023-10-27 14:30 payment-app.log /tmp/payment_issue.log # 提取特定时间日志 $ tar -czvf /tmp/payment_logs_$(date %Y%m%d_%H%M%S).tar.gz /tmp/payment_issue.log # 打包并加上时间戳4.2 场景二搭建自动化测试环境连接服务器并确认环境$ uname -a $ java -version # 假设需要Java环境 $ python3 --version创建测试专用目录和文件$ mkdir -p ~/autotest/{scripts,data,reports} # 一次性创建多级目录结构 $ cd ~/autotest $ touch scripts/test_api.py $ cp /tmp/test_data.csv data/ # 从临时目录拷贝测试数据安装必要依赖$ sudo apt-get install python3-pip # 安装pip $ pip3 install requests pytest # 安装Python测试库编写脚本并赋予执行权限$ vim scripts/run_test.sh # 用vim编辑一个启动脚本 # 脚本内容略... $ chmod x scripts/run_test.sh从本地同步脚本到服务器# 在你的本地机器上执行 $ scp -r ~/projects/autotest_scripts/* testertest-server:~/autotest/scripts/4.3 场景三日常健康检查与清理检查磁盘空间防止日志爆盘$ df -h $ du -sh /var/log/* 2/dev/null | sort -hr | head -10 # 查看/var/log下哪个目录最大清理旧的日志文件保留最近7天$ find /opt/app/logs/ -name *.log.* -mtime 7 -exec rm {} \; # 谨慎操作最好先换成 ls 确认 $ find /opt/app/logs/ -name *.log.* -mtime 7 -ls # 安全做法先列出要删除的文件确认检查关键服务进程$ ps aux | grep -E (nginx|mysql|redis|java.*yourApp) | grep -v grep5. 高频问题排查与避坑指南在实际操作中你肯定会遇到各种问题。这里我总结了一些最常见的“坑”和解决技巧。5.1 权限不足 (Permission denied)现象执行脚本或访问文件时提示Permission denied。排查ls -l filename查看文件权限。你需要r读或x执行权限。id或whoami查看当前用户。解决如果是自己的文件chmod x script.sh或chmod 600 private.key设置更安全的权限。如果是需要sudo权限的系统文件在命令前加sudo但需谨慎。如果是其他用户的文件且你不在文件所属组联系文件所有者(chown)或管理员。重要安全原则不要图省事直接用chmod 777给所有用户所有权限或总是用sudo。遵循最小权限原则。5.2 命令找不到 (command not found)现象输入命令后提示bash: xxx: command not found。排查检查命令是否拼写错误。该命令是否已安装which command或type command查看命令路径。解决使用包管理器安装sudo yum install command或sudo apt-get install command。有时命令在特定用户的PATH环境变量中可以尝试用绝对路径执行如/usr/local/bin/your_command。5.3 磁盘空间不足 (No space left on device)现象无法创建文件或服务报错。排查df -h确认哪个分区满了。du -sh /path/* | sort -hr定位该分区下的大目录。测试环境常见元凶/var/log/系统日志/tmp/临时文件应用自己的日志目录。解决清理日志sudo truncate -s 0 /var/log/somelarge.log清空文件内容但保留文件比rm安全。删除旧的日志归档文件find /path/to/logs -name *.log.*.gz -mtime 30 -delete删除30天前的压缩日志。联系运维扩容磁盘如果是云服务器。5.4 进程卡死或资源占用过高现象服务无响应top或htop查看发现某个进程CPU或MEM占用率异常。排查top动态查看进程资源占用按P按CPU排序按M按内存排序。ps aux --sort-%cpu | head -10查看CPU占用前十的进程。解决先尝试优雅终止kill PID。如果无效使用强制终止kill -9 PID。如果是Java应用可以先用jstack PID thread_dump.log导出线程堆栈发给开发分析后再kill。5.5 网络连接问题现象测试接口超时或连接失败。排查四步法本地环回ping 127.0.0.1检查本地网络栈是否正常。网关/外网ping 8.8.8.8检查是否能出公网。域名解析ping baidu.com检查DNS是否正常。特定端口telnet target_host target_port或nc -zv target_host target_port检查目标服务端口是否开放。进阶如果telnet不通但ping通可能是防火墙(iptables或firewalld)或安全组规则拦截。5.6 文件内容搜索效率低下痛点在几十G的日志里找特定时间的错误用grep直接扫太慢。技巧先限时grep 2023-10-27 14: huge.log比直接搜error快因为先过滤了时间范围。用zgrep直接在.gz压缩文件上搜索无需解压。zgrep error app.log.20231027.gz。结合find在多日日志文件中搜索。$ find /logs -name app*.log -mtime -5 -exec grep -l NullPointerException {} \; # 找到最近5天内包含异常的文件名掌握这20个命令及其组合足以让你在测试工作中游刃有余。但Linux的世界远不止于此awk,sed,find,curl等是更强大的进阶工具。我的建议是先把这20个用到烂熟于心形成肌肉记忆。当你发现某个重复性工作用手动执行这些命令很繁琐时那就是你该学习Shell脚本自动化的时候了。把这些命令写进.sh脚本里让你的测试效率再上一个台阶。记住工具是为人服务的清晰的排查思路比记住所有命令参数更重要。每次解决问题后花一分钟想想这个过程能否用命令或脚本固化下来久而久之你就会建立起自己强大的测试支持体系。