返回文章列表

Linux命令行基础教程

Linux是服务器领域最流行的操作系统,也是开发者必须掌握的技能。命令行是Linux的精髓,掌握命令行操作能极大提高工作效率。本教程将系统介绍Linux常用命令,帮助你快速上手。

一、Linux简介与终端

Linux是一个开源的类Unix操作系统内核。常见的Linux发行版包括Ubuntu、CentOS、Debian、Arch Linux等。

打开终端

终端基本概念

# 终端提示符说明
username@hostname:~$
# |       |      | |
# |       |      | └── $ 普通用户,# root用户
# |       |      └── 当前目录(~表示家目录)
# |       └── 主机名
# └── 用户名

# SSH连接远程服务器
ssh username@server_ip
ssh -p 2222 username@server_ip  # 指定端口
ssh -i ~/.ssh/id_rsa username@server_ip  # 使用密钥登录

二、文件操作(ls/cd/pwd/mkdir/rm/cp/mv)

文件操作是Linux最基本也是最重要的操作。

# ===== ls:列出目录内容 =====
ls                      # 列出当前目录文件
ls -l                   # 长格式(显示权限、大小、时间等)
ls -a                   # 显示隐藏文件(以.开头的文件)
ls -la                  # 长格式 + 隐藏文件
ls -lh                  # 文件大小以人类可读格式显示(KB/MB/GB)
ls -lt                  # 按修改时间排序
ls -lS                  # 按文件大小排序
ls -lr                  # 逆序排列
ls -R                   # 递归显示子目录
ls *.py                 # 只显示Python文件
ls /home /var           # 同时列出多个目录

# ls -l 输出解读:
# drwxr-xr-x 2 user group 4.0K Jan 15 10:30 mydir
# |          |  |    |     |    |             |
# 权限       链接数 所有者 所属组 大小          修改时间  文件名
#
# 权限说明: d目录 rwx所有者 r-x所属组 r-x其他人
# r=读(4) w=写(2) x=执行(1)

# ===== pwd:显示当前目录 =====
pwd                     # 显示当前工作目录的绝对路径

# ===== cd:切换目录 =====
cd /home/user           # 切换到绝对路径
cd documents            # 切换到相对路径(当前目录下的documents)
cd ..                   # 返回上一级目录
cd ../..                # 返回上两级目录
cd ~                    # 回到家目录
cd                      # 回到家目录(等同于cd ~)
cd -                    # 返回上一次所在的目录
cd ~/projects           # 家目录下的projects

# ===== mkdir:创建目录 =====
mkdir mydir             # 创建单个目录
mkdir -p a/b/c          # 递归创建多级目录
mkdir dir1 dir2 dir3    # 同时创建多个目录
mkdir -m 755 mydir      # 创建时指定权限

# ===== touch:创建空文件 =====
touch file.txt          # 创建空文件
touch file1.txt file2.txt  # 创建多个文件
touch -t 202401011200 file.txt  # 修改文件时间戳

# ===== cp:复制文件和目录 =====
cp file.txt backup.txt          # 复制文件
cp -i file.txt backup.txt       # 交互式(覆盖前询问)
cp -r mydir mydir_backup        # 递归复制目录
cp -v file.txt /tmp/            # 显示复制过程
cp -p file.txt /tmp/            # 保留属性(权限、时间戳)
cp *.txt /backup/               # 复制所有txt文件

# ===== mv:移动/重命名文件 =====
mv oldname.txt newname.txt      # 重命名
mv file.txt /tmp/               # 移动文件到/tmp
mv -i file.txt /tmp/            # 覆盖前询问
mv -v file.txt /tmp/            # 显示移动过程
mv dir1/ dir2/                  # 移动目录

# ===== rm:删除文件 =====
rm file.txt                     # 删除文件
rm -i file.txt                  # 交互式删除(询问确认)
rm -f file.txt                  # 强制删除(不询问)
rm -r mydir                     # 递归删除目录
rm -rf mydir                    # 强制递归删除(危险!)
rm *.log                        # 删除所有log文件
rm -- "-file.txt"               # 删除以-开头的文件

# ===== ln:创建链接 =====
ln file.txt hardlink.txt        # 硬链接(共享inode)
ln -s file.txt softlink.txt     # 软链接(符号链接,类似快捷方式)
ln -s /opt/app/bin/app /usr/local/bin/app  # 创建全局可访问的链接

三、文件查看(cat/less/head/tail/grep)

# ===== cat:查看文件内容 =====
cat file.txt                # 显示整个文件
cat -n file.txt             # 显示行号
cat -b file.txt             # 只给非空行编号
cat file1.txt file2.txt     # 连接多个文件
cat file.txt > new.txt      # 重定向到新文件
cat >> file.txt             # 追加内容(Ctrl+D结束)

# ===== less:分页查看(适合大文件)=====
less file.txt
# less中的操作:
# 空格/f   向下翻页
# b       向上翻页
# j/k     上下滚动
# /word   向下搜索word
# ?word   向上搜索word
# n/N     下一个/上一个搜索结果
# g/G     跳到开头/结尾
# q       退出

# ===== head:查看文件开头 =====
head file.txt               # 默认前10行
head -20 file.txt           # 前20行
head -c 100 file.txt        # 前100字节
head -n -5 file.txt         # 除最后5行外的所有内容

# ===== tail:查看文件末尾 =====
tail file.txt               # 默认最后10行
tail -20 file.txt           # 最后20行
tail -f /var/log/syslog     # 实时追踪文件变化(查看日志)
tail -f -n 50 app.log       # 从最后50行开始实时追踪
tail --pid=1234 -f app.log  # 进程1234结束后停止追踪

# ===== grep:文本搜索 =====
grep "error" log.txt        # 搜索包含error的行
grep -i "error" log.txt     # 不区分大小写
grep -n "error" log.txt     # 显示行号
grep -c "error" log.txt     # 只显示匹配行数
grep -v "error" log.txt     # 显示不匹配的行
grep -r "error" /var/log/   # 递归搜索目录
grep -E "error|warning" log.txt  # 正则表达式(或)
grep -A 3 "error" log.txt   # 匹配行后额外显示3行
grep -B 3 "error" log.txt   # 匹配行前额外显示3行
grep -C 3 "error" log.txt   # 匹配行前后各3行
grep --color=auto "error" log.txt  # 高亮匹配内容
grep -rn "TODO" src/        # 递归搜索并显示行号
grep -l "pattern" *.txt     # 只显示包含匹配的文件名

# ===== 其他文件查看命令 =====
wc file.txt                 # 行数、单词数、字节数
wc -l file.txt              # 只显示行数
wc -w file.txt              # 只显示单词数

sort file.txt               # 排序
sort -r file.txt            # 逆序排序
sort -n file.txt            # 按数字排序
sort -u file.txt            # 排序并去重

uniq file.txt               # 去除连续重复行
sort file.txt | uniq        # 排序后去重
sort file.txt | uniq -c     # 去重并统计出现次数
sort file.txt | uniq -c | sort -rn  # 按出现次数排序

cut -d',' -f1,3 data.csv    # 按逗号分割,取第1和3列
cut -c1-10 file.txt         # 取每行第1-10个字符

tr 'a-z' 'A-Z' < file.txt   # 小写转大写
tr -d ' ' < file.txt        # 删除所有空格

四、权限管理(chmod/chown)

Linux的权限系统是安全性的基础。每个文件都有所有者、所属组和其他人的读写执行权限。

# ===== chmod:修改文件权限 =====
# 权限数字表示法:
# r=4, w=2, x=1
# 7 = rwx (4+2+1) 读写执行
# 6 = rw- (4+2)   读写
# 5 = r-x (4+1)   读执行
# 4 = r-- (4)     只读
# 0 = --- (0)     无权限

# 数字方式设置权限
chmod 755 script.sh         # rwxr-xr-x(所有者完全,其他人读执行)
chmod 644 file.txt          # rw-r--r--(所有者读写,其他人只读)
chmod 777 public/           # rwxrwxrwx(所有人完全权限,不安全)
chmod 600 secret.key        # rw-------(仅所有者读写)
chmod 700 ~/.ssh            # rwx------(SSH目录推荐权限)

# 符号方式设置权限
chmod u+x script.sh         # 给所有者添加执行权限
chmod u-x script.sh         # 移除所有者执行权限
chmod g+w file.txt          # 给所属组添加写权限
chmod o-r file.txt          # 移除其他人读权限
chmod a+r file.txt          # 给所有人添加读权限
chmod u+x,g+w file.txt      # 同时设置多个
chmod +x script.sh          # 等同于a+x

# 递归修改目录及子内容权限
chmod -R 755 /var/www/

# ===== chown:修改文件所有者 =====
chown user file.txt             # 修改所有者
chown user:group file.txt       # 修改所有者和所属组
chown :group file.txt           # 只修改所属组
chown -R user:group /var/www/   # 递归修改
chown user.user file.txt        # 用户名和组名相同时的简写

# ===== chgrp:修改所属组 =====
chgrp developers file.txt
chgrp -R developers /project/

# ===== umask:设置默认权限掩码 =====
umask                    # 查看当前umask
umask 022                # 设置umask
# 文件默认权限: 666 - 022 = 644 (rw-r--r--)
# 目录默认权限: 777 - 022 = 755 (rwxr-xr-x)

# ===== 特殊权限 =====
chmod +t /tmp            # 粘滞位(只有所有者能删除自己的文件)
chmod g+s /shared        # SGID(新文件继承组)
chmod u+s /usr/bin/app   # SUID(以文件所有者身份执行)

# 查看特殊权限
ls -ld /tmp              # drwxrwxrwt 中的t表示粘滞位
ls -l /usr/bin/sudo      # -rwsr-xr-x 中的s表示SUID

五、进程管理(ps/kill/top)

# ===== ps:查看进程 =====
ps                       # 当前shell的进程
ps aux                   # 所有进程(BSD语法)
ps -ef                   # 所有进程(System V语法)
ps aux | grep python     # 查找Python进程
ps -u username           # 查看指定用户的进程
ps -p 1234               # 查看指定PID的进程

# ps aux 输出解读:
# USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
# user 1234  2.5  1.2 ...  S   10:30 0:05 python app.py

# ===== top:实时进程监控 =====
top                      # 交互式进程查看器
# top中的操作:
# P   按CPU排序
# M   按内存排序
# N   按PID排序
# T   按运行时间排序
# k   杀死进程(输入PID)
# 1   显示各CPU核心信息
# q   退出

# ===== htop:增强版top(需要安装) =====
htop                     # 彩色界面,支持鼠标操作

# ===== kill:结束进程 =====
kill 1234                # 发送TERM信号(优雅关闭)
kill -9 1234             # 发送KILL信号(强制杀死)
kill -15 1234            # 发送TERM信号(同kill 1234)
kill -HUP 1234           # 挂起信号(常用于重载配置)
kill -l                  # 列出所有信号

# killall:按进程名杀死
killall python           # 杀死所有python进程
killall -9 nginx         # 强制杀死所有nginx进程
killall -u username      # 杀死指定用户的所有进程

# pkill:按模式匹配杀死
pkill -f "python app.py" # 杀死匹配命令行的进程
pkill -u username python # 杀死指定用户的python进程

# ===== 后台运行 =====
# 命令后加 & 放到后台运行
python app.py &
# [1] 12345  ([1]是作业号,12345是PID)

# 查看后台作业
jobs                     # 列出后台作业
jobs -l                  # 显示PID
fg %1                    # 将作业1调到前台
bg %1                    # 让作业1在后台继续运行
Ctrl+Z                   # 暂停前台进程并放到后台
Ctrl+C                   # 终止前台进程

# nohup:终端关闭后继续运行
nohup python app.py > app.log 2>&1 &

# ===== 查看端口占用 =====
netstat -tlnp            # 查看所有监听端口
netstat -tlnp | grep 80  # 查看80端口
ss -tlnp                 # netstat的现代替代品
lsof -i :80              # 查看80端口的进程
lsof -i -P -n | grep LISTEN  # 查看所有监听端口

# ===== 查看系统资源 =====
free -h                  # 内存使用情况
df -h                    # 磁盘使用情况
du -sh /var/log/         # 目录大小
du -h --max-depth=1 /    # 各目录大小
uptime                   # 系统运行时间和负载
uname -a                 # 系统信息
who                      # 登录用户
w                        # 登录用户及活动

六、管道与重定向

管道和重定向是Linux命令行的精髓,可以将多个命令组合完成复杂任务。

# ===== 标准输入输出 =====
# 每个进程有三个标准流:
# stdin  (0) - 标准输入
# stdout (1) - 标准输出
# stderr (2) - 标准错误

# ===== 输出重定向 =====
echo "hello" > file.txt          # 覆盖写入
echo "world" >> file.txt         # 追加写入
ls > files.txt                   # 将ls输出保存到文件
ls /nonexist 2> error.txt        # 只重定向错误
ls /home /nonexist > output.txt 2>&1  # 标准输出和错误都重定向
ls /home /nonexist &> output.txt # 同上(bash简写)
ls > /dev/null                   # 丢弃输出(黑洞)

# ===== 输入重定向 =====
sort < file.txt                  # 从文件读取输入
mysql < backup.sql               # 从文件恢复数据库
cat << EOF                       # 多行输入(here document)
第一行
第二行
EOF

# ===== 管道(|)=====
# 将前一个命令的输出作为后一个命令的输入
ls | grep ".txt"                 # 列出txt文件
cat log.txt | grep "error"       # 查找错误日志
ps aux | grep python | grep -v grep  # 查找Python进程
ls -l | wc -l                    # 统计文件数
cat file.txt | sort | uniq -c | sort -rn | head -10  # 找出出现最多的10行

# ===== 常用管道组合 =====
# 查找最耗CPU的10个进程
ps aux | sort -k3 -rn | head -10

# 查找最耗内存的10个进程
ps aux | sort -k4 -rn | head -10

# 统计各状态HTTP请求数量
cat access.log | awk '{print $9}' | sort | uniq -c | sort -rn

# 查找最大的10个文件
du -ah / | sort -rh | head -10

# 查找并删除7天前的日志
find /var/log -name "*.log" -mtime +7 -exec rm {} \;

# ===== xargs:将输入作为参数 =====
echo "file1 file2 file3" | xargs touch  # 创建3个文件
find . -name "*.py" | xargs grep "TODO" # 在所有py文件中搜索TODO
find . -name "*.pyc" | xargs rm         # 删除所有pyc文件
find . -name "*.py" | xargs wc -l       # 统计所有py文件行数
cat urls.txt | xargs wget               # 下载URL列表
echo "1 2 3 4 5" | xargs -n1 echo       # 每行一个输出

# ===== tee:同时输出到屏幕和文件 =====
ls | tee files.txt                # 输出到屏幕并保存到文件
ls | tee -a files.txt             # 追加到文件
command 2>&1 | tee output.log     # 包括错误输出

七、软件安装(apt/yum)

# ===== Ubuntu/Debian (apt) =====
sudo apt update                # 更新软件包列表
sudo apt upgrade               # 升级所有已安装的软件
sudo apt install nginx         # 安装软件
sudo apt install -y nginx      # 自动确认安装
sudo apt remove nginx          # 卸载软件(保留配置)
sudo apt purge nginx           # 卸载软件(删除配置)
sudo apt autoremove            # 清理不需要的依赖
sudo apt search python         # 搜索软件
sudo apt show nginx            # 显示软件信息
apt list --installed           # 列出已安装的软件
apt list --upgradable          # 列出可升级的软件

# ===== CentOS/RHEL (yum/dnf) =====
sudo yum update                # 更新所有软件
sudo yum install nginx         # 安装软件
sudo yum install -y nginx      # 自动确认
sudo yum remove nginx          # 卸载软件
sudo yum search python         # 搜索软件
sudo yum info nginx            # 显示软件信息
yum list installed             # 列出已安装的软件
# CentOS 8+ 使用dnf替代yum
sudo dnf install nginx

# ===== 从源码编译安装 =====
# 下载源码
wget https://example.com/app-1.0.tar.gz
tar xzf app-1.0.tar.gz
cd app-1.0

# 编译三步曲
./configure                   # 配置
make                          # 编译
sudo make install             # 安装

# ===== 其他安装方式 =====
# pip (Python包管理)
pip install requests
pip install -r requirements.txt
pip3 install flask --user

# npm (Node.js包管理)
npm install express
npm install -g nodemon        # 全局安装

# snap (通用包管理器)
sudo snap install code --classic
sudo snap list

# 下载安装二进制
wget https://example.com/app
chmod +x app
sudo mv app /usr/local/bin/

八、实战案例:部署一个Python应用

综合运用以上知识,我们来在Linux服务器上部署一个Python Web应用。

# ============================================================
# 完整的Python应用部署流程
# ============================================================

# ===== 第1步:系统准备 =====

# 更新系统
sudo apt update && sudo apt upgrade -y

# 安装基础依赖
sudo apt install -y python3 python3-pip python3-venv nginx git curl

# 验证版本
python3 --version
pip3 --version
nginx -v
git --version

# ===== 第2步:创建部署用户 =====

# 创建专用用户(不用root运行应用)
sudo useradd -m -s /bin/bash deploy
sudo passwd deploy
# 切换到deploy用户
su - deploy

# ===== 第3步:创建项目目录结构 =====

# 创建目录
mkdir -p ~/myapp/logs ~/myapp/venv
cd ~/myapp

# 从Git克隆代码
git clone https://github.com/user/myapp.git src
cd src

# ===== 第4步:配置Python虚拟环境 =====

# 创建虚拟环境
python3 -m venv ~/myapp/venv

# 激活虚拟环境
source ~/myapp/venv/bin/activate

# 验证(应该显示venv路径)
which python
# /home/deploy/myapp/venv/bin/python

# 安装依赖
pip install -r requirements.txt
pip install gunicorn  # WSGI服务器

# ===== 第5步:测试应用 =====

# 先手动测试
python app.py
# 或使用gunicorn
gunicorn --bind 0.0.0.0:8000 app:app

# 在另一个终端测试
curl http://localhost:8000
# Ctrl+C 停止测试

# ===== 第6步:创建systemd服务 =====

# 退出deploy用户,回到有sudo权限的用户
exit

# 创建systemd服务文件
sudo nano /etc/systemd/system/myapp.service
# /etc/systemd/system/myapp.service 内容:
[Unit]
Description=My Python App
After=network.target

[Service]
User=deploy
Group=deploy
WorkingDirectory=/home/deploy/myapp/src
Environment="PATH=/home/deploy/myapp/venv/bin"
ExecStart=/home/deploy/myapp/venv/bin/gunicorn --workers 3 --bind 127.0.0.1:8000 app:app
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target
# ===== 第7步:启动和管理服务 =====

# 重新加载systemd
sudo systemctl daemon-reload

# 启动服务
sudo systemctl start myapp

# 设置开机自启
sudo systemctl enable myapp

# 查看状态
sudo systemctl status myapp

# 查看日志
sudo journalctl -u myapp -f          # 实时日志
sudo journalctl -u myapp --since today  # 今天的日志
sudo journalctl -u myapp -n 100      # 最近100行

# 重启/停止服务
sudo systemctl restart myapp
sudo systemctl stop myapp

# ===== 第8步:配置Nginx反向代理 =====

# 创建Nginx配置
sudo nano /etc/nginx/sites-available/myapp
# /etc/nginx/sites-available/myapp 内容:
server {
    listen 80;
    server_name your-domain.com;

    location / {
        proxy_pass http://127.0.0.1:8000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    location /static/ {
        alias /home/deploy/myapp/src/static/;
        expires 30d;
    }

    # 日志
    access_log /var/log/nginx/myapp_access.log;
    error_log /var/log/nginx/myapp_error.log;
}
# 启用站点
sudo ln -s /etc/nginx/sites-available/myapp /etc/nginx/sites-enabled/

# 测试Nginx配置
sudo nginx -t

# 重载Nginx
sudo systemctl reload nginx

# ===== 第9步:配置防火墙 =====

# 查看防火墙状态
sudo ufw status

# 开放必要端口
sudo ufw allow 22        # SSH
sudo ufw allow 80        # HTTP
sudo ufw allow 443       # HTTPS

# 启用防火墙
sudo ufw enable

# ===== 第10步:配置HTTPS(使用Let's Encrypt)=====

# 安装certbot
sudo apt install -y certbot python3-certbot-nginx

# 获取SSL证书
sudo certbot --nginx -d your-domain.com

# 自动续期(certbot会自动设置)
sudo systemctl status certbot.timer

# ===== 日常运维命令 =====

# 查看应用日志
sudo journalctl -u myapp -f --since "10 min ago"

# 查看Nginx日志
sudo tail -f /var/log/nginx/myapp_error.log
sudo tail -f /var/log/nginx/myapp_access.log

# 查看系统资源
htop                    # CPU和内存
df -h                   # 磁盘
free -h                 # 内存

# 查看应用进程
ps aux | grep gunicorn

# 查看端口监听
sudo ss -tlnp | grep -E '8000|80|443'

# 更新应用代码
cd ~/myapp/src
git pull origin main
source ~/myapp/venv/bin/activate
pip install -r requirements.txt  # 如果依赖有变化
deactivate
sudo systemctl restart myapp

# 查看应用是否正常运行
curl -I http://localhost:8000
curl -I http://localhost

常用命令速查表

# ===== 文件操作 =====
ls -la                  # 列出所有文件(含隐藏)
cd /path                # 切换目录
pwd                     # 当前路径
mkdir -p a/b/c          # 递归创建目录
rm -rf dir              # 强制删除目录
cp -r src dst           # 递归复制
mv old new              # 移动/重命名
find / -name "*.log"    # 查找文件
ln -s target link       # 创建软链接

# ===== 文件查看 =====
cat file                # 查看文件
less file               # 分页查看
head -20 file           # 前20行
tail -f file            # 实时查看末尾
grep "pattern" file     # 搜索内容
wc -l file              # 统计行数

# ===== 权限 =====
chmod 755 file          # 修改权限
chown user:group file   # 修改所有者
sudo command            # 以管理员执行

# ===== 进程 =====
ps aux                  # 查看所有进程
top                     # 实时监控
kill -9 PID             # 强制结束进程
jobs                    # 后台作业
nohup cmd &             # 后台运行

# ===== 网络 =====
curl url                # HTTP请求
wget url                # 下载文件
netstat -tlnp           # 查看端口
ss -tlnp                # 查看端口(现代版)
scp file user@host:path # 远程复制文件
ssh user@host           # SSH连接

# ===== 压缩解压 =====
tar czf archive.tar.gz dir/   # 压缩
tar xzf archive.tar.gz        # 解压
zip -r archive.zip dir/       # zip压缩
unzip archive.zip             # zip解压

# ===== 系统信息 =====
uname -a                # 系统信息
df -h                   # 磁盘使用
free -h                 # 内存使用
uptime                  # 运行时间
whoami                  # 当前用户
date                    # 当前时间

总结

本教程系统介绍了Linux命令行的核心知识:

  1. 了解了Linux系统和终端的基本概念
  2. 掌握了文件操作命令:ls、cd、pwd、mkdir、rm、cp、mv
  3. 学会了文件查看命令:cat、less、head、tail、grep
  4. 理解了Linux权限系统,掌握chmod和chown的使用
  5. 学会了进程管理:ps、kill、top及后台运行
  6. 掌握了管道和重定向,能组合命令完成复杂任务
  7. 了解了软件安装方法:apt、yum、源码编译
  8. 通过Python应用部署实战综合运用了所有知识

学习建议:

动手挑战

学到这里,不妨动手试一试以下练习,巩固你的理解:

  1. 基础练习:回顾本文核心概念,用自己的话总结关键知识点。
  2. 进阶实践:将文中的示例代码运行一遍,尝试修改参数观察变化。
  3. 拓展思考:想一想这个技术/方法还能应用在哪些场景中?

小贴士:遇到问题时,先独立思考,再查阅资料,最后请教他人——这是成长最快的学习方式。

赞赏支持

本文更新于 2026-08-22,环境 Python 3.12