Linux命令行基础教程
Linux是服务器领域最流行的操作系统,也是开发者必须掌握的技能。命令行是Linux的精髓,掌握命令行操作能极大提高工作效率。本教程将系统介绍Linux常用命令,帮助你快速上手。
一、Linux简介与终端
Linux是一个开源的类Unix操作系统内核。常见的Linux发行版包括Ubuntu、CentOS、Debian、Arch Linux等。
打开终端
- Ubuntu/Debian:Ctrl + Alt + T
- CentOS/RHEL:应用程序 -> 系统 -> 终端
- macOS:Command + 空格,输入"Terminal"
- Windows:使用WSL(Windows Subsystem for Linux)或SSH连接远程服务器
终端基本概念
# 终端提示符说明
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命令行的核心知识:
- 了解了Linux系统和终端的基本概念
- 掌握了文件操作命令:ls、cd、pwd、mkdir、rm、cp、mv
- 学会了文件查看命令:cat、less、head、tail、grep
- 理解了Linux权限系统,掌握chmod和chown的使用
- 学会了进程管理:ps、kill、top及后台运行
- 掌握了管道和重定向,能组合命令完成复杂任务
- 了解了软件安装方法:apt、yum、源码编译
- 通过Python应用部署实战综合运用了所有知识
学习建议:
- 多用man命令查看帮助:man ls、man grep
- 命令加--help查看简明帮助:ls --help
- 尽量使用命令行而非图形界面
- 学习Vim或Nano编辑器的基本操作
- 编写Shell脚本自动化重复任务
- 多实践,在真实环境中使用Linux