Linux,是现代服务器操作系统的事实标准。无论是Web服务器、数据库服务器、云服务器,还是嵌入式设备、移动设备(Android),都能看到Linux的身影。作为一个程序员,尤其是后端程序员,掌握Linux常用命令,是必备的技能。

我自己,从大学开始接触Linux,到现在工作,每天都在和Linux打交道。从最初的害怕命令行,到现在的熟练使用,Linux命令,已经成了我工作中不可或缺的工具。无论是管理服务器、部署应用、排查问题,还是处理文件、分析日志、编写脚本,Linux命令都能大大提高效率。

今天,分享Linux常用命令详解,从文件操作、系统管理、网络操作、文本处理,到Shell脚本,帮你从入门到精通,掌握Linux命令。

Linux简介

Linux,是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。

Linux的核心,是Linux内核(Kernel),由林纳斯·托瓦兹(Linus Torvalds)在1991年创建。加上GNU项目的各种工具和软件,组成了完整的Linux操作系统(严格来说,应该叫GNU/Linux)。

Linux的特点:

  • 开源免费:源代码开放,免费使用
  • 稳定可靠:服务器可以连续运行几年不重启
  • 安全:多用户权限机制,病毒少
  • 多用户多任务:支持多个用户同时登录,同时运行多个任务
  • 强大的命令行:命令行功能强大,效率高
  • 广泛的硬件支持:支持各种硬件架构
  • 丰富的软件生态:有大量的开源软件

常见的Linux发行版:

  • 服务器端:CentOS、Red Hat Enterprise Linux(RHEL)、Ubuntu Server、Debian、SUSE
  • 桌面端:Ubuntu Desktop、Fedora、Linux Mint、Debian、Arch Linux
  • 移动端:Android(基于Linux内核)

2015年,服务器端最流行的是CentOS(尤其是CentOS 6/7)和Ubuntu Server。我自己,服务器主要用CentOS,开发机用Ubuntu。

一、文件和目录操作

文件和目录操作,是Linux最基础、最常用的命令。

1. ls:列出目录内容

ls                  # 列出当前目录内容
ls -l               # 长格式列出,显示详细信息
ls -a               # 显示所有文件,包括隐藏文件
ls -la              # 长格式显示所有文件
ls -lh              # 长格式,文件大小以人类可读格式显示(K/M/G)
ls -lt              # 按修改时间排序,最新的在前
ls -R               # 递归列出子目录内容
ls /etc             # 列出/etc目录内容

ls -l输出的含义:

-rw-r--r-- 1 root root 4096 Sep 25 10:00 filename
  • 第一位:文件类型(-普通文件,d目录,l符号链接,b块设备,c字符设备)
  • 第2-4位:所有者权限(r读,w写,x执行)
  • 第5-7位:所属组权限
  • 第8-10位:其他用户权限
  • 第11位:硬链接数
  • 所有者
  • 所属组
  • 文件大小
  • 最后修改时间
  • 文件名

2. cd:切换目录

cd /etc             # 切换到/etc目录
cd ..               # 切换到上一级目录
cd -                # 切换到上一次所在的目录
cd ~                # 切换到当前用户的家目录
cd                  # 不带参数,也是切换到家目录
cd /var/log         # 切换到/var/log目录

3. pwd:显示当前目录

pwd                 # 显示当前所在目录的绝对路径

4. mkdir:创建目录

mkdir dirname       # 创建目录
mkdir -p a/b/c      # 递归创建多级目录
mkdir -m 755 dir    # 创建目录并设置权限

5. rmdir:删除空目录

rmdir dirname       # 删除空目录(只能删除空目录)
rmdir -p a/b/c      # 递归删除空目录

6. rm:删除文件或目录

rm filename         # 删除文件
rm -r dirname       # 递归删除目录及其内容
rm -f filename      # 强制删除,不提示
rm -rf dirname      # 强制递归删除目录(危险!慎用!)
rm -i filename      # 删除前提示确认

注意:rm -rf 是非常危险的命令,删除后不可恢复!使用时一定要确认路径正确,尤其是rm -rf / 会删除整个系统!

7. cp:复制文件或目录

cp file1 file2      # 复制file1为file2
cp file /dir/       # 复制文件到目录
cp -r dir1 dir2     # 递归复制目录
cp -p file1 file2   # 复制时保留文件属性(权限、时间等)
cp -a dir1 dir2     # 归档复制,保留所有属性,递归复制
cp -i file1 file2   # 覆盖前提示

8. mv:移动或重命名

mv file1 file2      # 重命名(file1改为file2)
mv file /dir/       # 移动文件到目录
mv dir1 dir2        # 重命名目录或移动目录
mv -i file1 file2   # 覆盖前提示
mv -f file1 file2   # 强制移动,不提示

9. touch:创建空文件或修改时间戳

touch filename      # 创建空文件(如果文件不存在)
touch file1 file2   # 创建多个空文件
touch -a filename   # 只修改访问时间
touch -m filename   # 只修改修改时间
touch -t 201509251000 filename  # 设置指定时间

10. find:查找文件

find /path -name "*.txt"         # 按文件名查找
find /path -iname "*.txt"        # 按文件名查找(不区分大小写)
find /path -type f                # 查找普通文件
find /path -type d                # 查找目录
find /path -size +10M             # 查找大于10M的文件
find /path -size -1M              # 查找小于1M的文件
find /path -mtime -7              # 查找7天内修改过的文件
find /path -mtime +30             # 查找30天前修改过的文件
find /path -user root              # 查找属于root用户的文件
find /path -perm 755               # 查找权限为755的文件
find /path -name "*.log" -exec rm {} \;  # 查找并删除(危险!)
find /path -name "*.txt" -exec cp {} /backup/ \;  # 查找并复制

11. ln:创建链接

ln file link        # 创建硬链接
ln -s file link     # 创建符号链接(软链接)
ln -sf file link    # 强制创建符号链接,覆盖已存在的

硬链接和软链接的区别:

  • 硬链接:指向同一个inode,删除原文件不影响硬链接,不能跨文件系统,不能链接目录
  • 软链接:类似Windows的快捷方式,指向文件路径,删除原文件软链接失效,能跨文件系统,能链接目录

12. chmod:修改文件权限

chmod 755 filename  # 设置权限为rwxr-xr-x
chmod +x filename    # 给所有用户添加执行权限
chmod u+x filename   # 给所有者添加执行权限
chmod g+w filename   # 给所属组添加写权限
chmod o-r filename   # 给其他用户去掉读权限
chmod -R 755 dir     # 递归修改目录下所有文件的权限

权限数字表示:

  • r(读)= 4
  • w(写)= 2
  • x(执行)= 1
  • 7 = rwx(4+2+1)
  • 6 = rw-(4+2)
  • 5 = r-x(4+1)
  • 4 = r--
  • 0 = ---

13. chown:修改文件所有者

chown user filename       # 修改文件所有者
chown user:group filename # 修改所有者和所属组
chown -R user dir         # 递归修改目录下所有文件的所有者

14. chgrp:修改文件所属组

chgrp group filename      # 修改文件所属组
chgrp -R group dir        # 递归修改

15. file:查看文件类型

file filename         # 查看文件类型

16. stat:查看文件详细信息

stat filename         # 查看文件的详细信息(inode、权限、大小、时间等)

二、查看文件内容

1. cat:查看文件内容

cat filename          # 查看文件内容
cat -n filename       # 显示行号
cat -b filename       # 显示行号(空行不编号)
cat file1 file2       # 合并显示多个文件
cat > filename        # 创建文件并输入内容(Ctrl+D结束)
cat >> filename       # 追加内容到文件

2. more:分页查看文件

more filename         # 分页查看文件
# 操作:空格下一页,Enter下一行,q退出,/搜索

3. less:分页查看文件(更强大)

less filename         # 分页查看文件
# 操作:空格下一页,b上一页,Enter下一行,k上一行,q退出,/搜索,n下一个匹配,N上一个匹配,g跳到开头,G跳到结尾
less -N filename      # 显示行号

less比more更强大,支持上下翻页,搜索,大文件查看效率高。

4. head:查看文件开头

head filename         # 查看文件前10行
head -n 20 filename   # 查看文件前20行
head -c 100 filename  # 查看文件前100字节

5. tail:查看文件结尾

tail filename         # 查看文件最后10行
tail -n 20 filename   # 查看文件最后20行
tail -f filename      # 实时跟踪文件新增内容(查看日志常用)
tail -F filename      # 实时跟踪,文件被截断或重命名后重新打开
tail -n +100 filename # 从第100行开始显示到结尾

tail -f 是查看日志最常用的命令,可以实时看到日志的新增内容。

6. wc:统计文件

wc filename           # 统计行数、单词数、字节数
wc -l filename        # 统计行数
wc -w filename        # 统计单词数
wc -c filename        # 统计字节数
wc -m filename        # 统计字符数

7. sort:排序文件内容

sort filename         # 按字母顺序排序
sort -r filename      # 逆序排序
sort -n filename      # 按数字排序
sort -u filename      # 排序并去重
sort -k 2 filename    # 按第2列排序
sort -t ',' -k 2 filename  # 以逗号分隔,按第2列排序

8. uniq:去重

uniq filename         # 去除相邻的重复行(需要先排序)
uniq -c filename      # 去重并显示重复次数
uniq -d filename      # 只显示重复的行
uniq -u filename      # 只显示不重复的行

注意:uniq只能去除相邻的重复行,所以通常和sort配合使用:sort filename | uniq

9. grep:文本搜索

grep "pattern" filename       # 在文件中搜索匹配的行
grep -i "pattern" filename    # 不区分大小写搜索
grep -v "pattern" filename    # 显示不匹配的行
grep -n "pattern" filename    # 显示行号
grep -c "pattern" filename    # 统计匹配的行数
grep -r "pattern" /dir        # 递归搜索目录下所有文件
grep -l "pattern" /dir/*      # 只显示包含匹配的文件名
grep -A 3 "pattern" filename  # 显示匹配行及后3行
grep -B 3 "pattern" filename  # 显示匹配行及前3行
grep -C 3 "pattern" filename  # 显示匹配行及前后各3行
grep -E "pattern1|pattern2" filename  # 扩展正则,匹配pattern1或pattern2
grep "pattern" file1 file2    # 在多个文件中搜索

grep是Linux中最常用的文本搜索工具,功能强大,支持正则表达式。

10. awk:文本处理工具

awk是一个强大的文本处理工具,可以进行复杂的文本分析和处理。

awk '{print $1}' filename      # 打印每行的第1列
awk '{print $1, $3}' filename  # 打印第1列和第3列
awk -F ':' '{print $1}' /etc/passwd  # 以冒号分隔,打印第1列
awk '{print NR, $0}' filename  # 打印行号和整行
awk '{sum += $1} END {print sum}' filename  # 求和第1列
awk 'NR>10' filename           # 打印第10行之后的内容
awk '/pattern/' filename        # 打印匹配pattern的行(类似grep)
awk '$3 > 100' filename        # 打印第3列大于100的行
awk '{if($3>100) print $1}' filename  # 条件判断

awk的基本结构:awk '模式 {动作}' 文件

  • 常用内置变量:$0整行,$1第1列,NF列数,NR行号,FS字段分隔符,OFS输出字段分隔符
  • BEGIN:处理前执行,END:处理后执行

11. sed:流编辑器

sed是一个流编辑器,可以对文本进行替换、删除、插入等操作。

sed 's/old/new/' filename       # 替换每行第一个匹配
sed 's/old/new/g' filename      # 全局替换
sed 's/old/new/2' filename      # 替换每行第2个匹配
sed '2s/old/new/' filename      # 只替换第2行
sed -i 's/old/new/g' filename   # 直接修改文件(危险!)
sed '2d' filename                # 删除第2行
sed '2,5d' filename              # 删除第2到5行
sed '/pattern/d' filename        # 删除匹配的行
sed '2a\new line' filename       # 在第2行后追加
sed '2i\new line' filename       # 在第2行前插入
sed '2c\new line' filename       # 替换第2行
sed -n '2,5p' filename           # 打印第2到5行
sed -n '/pattern/p' filename     # 打印匹配的行(类似grep)

注意:sed -i 会直接修改文件,使用前最好备份。

三、系统管理

1. uname:查看系统信息

uname                # 显示内核名称
uname -a             # 显示所有系统信息
uname -r             # 显示内核版本
uname -m             # 显示机器硬件架构

2. hostname:查看/设置主机名

hostname             # 查看主机名
hostname newname     # 临时设置主机名(重启失效)

3. whoami:显示当前用户名

whoami               # 显示当前登录的用户名

4. who:显示登录用户

who                  # 显示当前登录的用户
who -a               # 显示详细信息

5. w:显示登录用户及操作

w                    # 显示登录用户及其正在执行的操作

6. date:显示/设置时间

date                 # 显示当前时间
date +"%Y-%m-%d %H:%M:%S"  # 格式化显示时间
date -s "2015-09-25 10:00:00"  # 设置时间(需要root)
date +%s             # 显示时间戳(秒)

7. cal:显示日历

cal                  # 显示当前月日历
cal 2015             # 显示2015年日历
cal 9 2015           # 显示2015年9月日历

8. uptime:显示系统运行时间

uptime               # 显示系统运行时间、用户数、平均负载

输出示例:10:00:00 up 10 days, 2:30, 2 users, load average: 0.10, 0.20, 0.30

  • 系统运行了10天2小时30分
  • 当前2个用户登录
  • 1分钟、5分钟、15分钟平均负载分别为0.10、0.20、0.30

9. free:查看内存使用

free                 # 查看内存使用情况(KB)
free -m              # 以MB为单位
free -g              # 以GB为单位
free -h              # 人类可读格式

输出包括:total(总内存)、used(已使用)、free(空闲)、shared(共享)、buff/cache(缓存)、available(可用)

10. df:查看磁盘使用

df                   # 查看磁盘使用情况
df -h                # 人类可读格式(K/M/G)
df -T                # 显示文件系统类型
df -i                # 显示inode使用情况

11. du:查看目录/文件大小

du                   # 显示当前目录下各子目录大小
du -h                # 人类可读格式
du -sh /dir          # 显示目录总大小
du -sh /*            # 显示根目录下各目录大小
du -h --max-depth=1  # 显示1层深度的目录大小

12. top:实时显示系统进程

top                  # 实时显示系统进程和资源使用
# 操作:q退出,P按CPU排序,M按内存排序,T按时间排序,k杀死进程,renice调整优先级
top -c               # 显示完整命令
top -u username      # 只显示某用户的进程
top -p PID           # 只显示指定PID的进程

top是最常用的系统监控工具,可以实时查看CPU、内存、进程等信息。

13. ps:查看进程

ps                   # 显示当前终端的进程
ps aux               # 显示所有进程(BSD风格)
ps -ef               # 显示所有进程(System V风格)
ps -ef | grep nginx  # 查找nginx进程
ps -u username       # 显示某用户的进程
ps -p PID            # 显示指定PID的进程

ps aux输出列:USER(用户)、PID(进程ID)、%CPU(CPU使用率)、%MEM(内存使用率)、VSZ(虚拟内存)、RSS(物理内存)、TTY(终端)、STAT(状态)、START(启动时间)、TIME(CPU时间)、COMMAND(命令)

进程状态:R运行,S睡眠,D不可中断睡眠,T停止,Z僵尸,X死亡

14. kill:杀死进程

kill PID             # 发送TERM信号终止进程
kill -9 PID          # 发送KILL信号强制杀死进程
kill -l              # 列出所有信号
killall nginx        # 按名称杀死所有nginx进程
pkill nginx          # 按名称匹配杀死进程

常用信号:1(HUP挂起/重载)、2(INT中断,Ctrl+C)、9(KILL强制杀死)、15(TERM终止,默认)、18(CONT继续)、19(STOP停止)

15. shutdown:关机

shutdown -h now      # 立即关机
shutdown -h +10      # 10分钟后关机
shutdown -h 22:00    # 22:00关机
shutdown -r now      # 立即重启
shutdown -c           # 取消关机

其他关机/重启命令:

halt                 # 关机
poweroff             # 关机
reboot               # 重启
init 0               # 关机
init 6               # 重启

16. useradd:添加用户

useradd username     # 添加用户
useradd -m username  # 添加用户并创建家目录
useradd -s /bin/bash username  # 指定shell
useradd -g group username      # 指定所属组
useradd -G group1,group2 username  # 指定附加组

17. passwd:修改密码

passwd               # 修改当前用户密码
passwd username      # 修改指定用户密码(需要root)

18. userdel:删除用户

userdel username     # 删除用户
userdel -r username  # 删除用户并删除家目录

19. usermod:修改用户

usermod -aG group username   # 将用户添加到组
usermod -s /bin/bash username  # 修改用户shell
usermod -l newname oldname    # 修改用户名

20. groupadd/groupdel/groupmod:组管理

groupadd groupname   # 添加组
groupdel groupname   # 删除组
groupmod -n newname oldname  # 修改组名

21. su:切换用户

su                   # 切换到root(需要root密码)
su -                 # 切换到root并加载环境变量
su username          # 切换到指定用户
su - username        # 切换到指定用户并加载环境变量

22. sudo:以root权限执行

sudo command         # 以root权限执行命令
sudo -u user command # 以指定用户权限执行
sudo -i              # 切换到root shell
sudo -l              # 列出当前用户的sudo权限

23. crontab:定时任务

crontab -l           # 列出当前用户的定时任务
crontab -e           # 编辑当前用户的定时任务
crontab -r           # 删除当前用户的定时任务
crontab -u user -l   # 列出指定用户的定时任务

crontab格式:分 时 日 月 周 命令

  • 分:0-59
  • 时:0-23
  • 日:1-31
  • 月:1-12
  • 周:0-7(0和7都是周日)

示例:

0 2 * * * /path/to/script.sh    # 每天凌晨2点执行
*/5 * * * * /path/to/script.sh  # 每5分钟执行
0 0 * * 0 /path/to/script.sh    # 每周日凌晨0点执行
0 0 1 * * /path/to/script.sh    # 每月1号凌晨0点执行

四、网络操作

1. ifconfig:查看/配置网络接口

ifconfig             # 查看所有网络接口
ifconfig eth0        # 查看eth0接口
ifconfig eth0 192.168.1.100 netmask 255.255.255.0  # 设置IP(临时)
ifconfig eth0 up     # 启用接口
ifconfig eth0 down   # 禁用接口

注意:CentOS 7以后,ifconfig默认不安装,需要安装net-tools包,推荐使用ip命令。

2. ip:网络配置工具(新一代)

ip addr              # 查看所有网络接口和IP
ip addr show eth0    # 查看eth0接口
ip link              # 查看网络链路状态
ip link set eth0 up  # 启用接口
ip link set eth0 down  # 禁用接口
ip route             # 查看路由表
ip route add default via 192.168.1.1  # 添加默认网关
ip neigh             # 查看ARP表

3. ping:测试网络连通性

ping 192.168.1.1     # ping指定IP
ping www.baidu.com   # ping域名
ping -c 4 192.168.1.1  # 发送4个包后停止
ping -i 2 192.168.1.1  # 每隔2秒发一个包
ping -s 1024 192.168.1.1  # 指定包大小1024字节

4. netstat:查看网络连接

netstat              # 查看所有网络连接
netstat -t           # 只显示TCP连接
netstat -u           # 只显示UDP连接
netstat -l           # 只显示监听端口
netstat -tl          # 显示TCP监听端口
netstat -tulnp       # 显示所有监听端口和进程(常用!)
netstat -an          # 显示所有连接和端口,不解析名称
netstat -rn          # 显示路由表
netstat -i           # 显示网络接口统计

netstat -tulnp 是最常用的,查看所有监听的TCP/UDP端口及对应的进程。

注意:CentOS 7以后,netstat默认不安装,推荐使用ss命令。

5. ss:查看网络连接(新一代)

ss                   # 查看所有连接
ss -t                 # 只显示TCP
ss -u                 # 只显示UDP
ss -l                 # 只显示监听
ss -tl                # 显示TCP监听
ss -tulnp             # 显示所有监听端口和进程
ss -s                 # 显示连接统计

6. curl:命令行HTTP客户端

curl http://example.com           # 发送GET请求
curl -I http://example.com        # 只显示响应头
curl -i http://example.com        # 显示响应头和内容
curl -o file.html http://example.com  # 下载保存为文件
curl -O http://example.com/file.zip   # 下载保存为原文件名
curl -X POST http://example.com/api  # 发送POST请求
curl -d "key=value" http://example.com  # POST发送数据
curl -H "Content-Type: application/json" -d '{"key":"value"}' http://example.com  # 发送JSON
curl -u user:pass http://example.com  # 基本认证
curl -L http://example.com        # 跟随重定向
curl -k https://example.com       # 忽略SSL证书验证
curl -v http://example.com        # 显示详细过程
curl --connect-timeout 10 http://example.com  # 连接超时10秒

curl是非常强大的命令行HTTP客户端,调试API、下载文件都非常方便。

7. wget:命令行下载工具

wget http://example.com/file.zip       # 下载文件
wget -O newname.zip http://example.com/file.zip  # 下载并重命名
wget -c http://example.com/file.zip    # 断点续传
wget -b http://example.com/file.zip    # 后台下载
wget -i urls.txt                        # 从文件读取URL批量下载
wget --limit-rate=100k http://example.com/file.zip  # 限速下载
wget -np -r -l 1 http://example.com    # 递归下载网站

8. ssh:远程登录

ssh user@192.168.1.100      # 登录远程主机
ssh -p 2222 user@192.168.1.100  # 指定端口
ssh -i key.pem user@192.168.1.100  # 指定私钥
ssh -o StrictHostKeyChecking=no user@192.168.1.100  # 不检查主机密钥

9. scp:远程复制文件

scp file.txt user@192.168.1.100:/path/  # 本地文件复制到远程
scp user@192.168.1.100:/path/file.txt ./  # 远程文件复制到本地
scp -r dir user@192.168.1.100:/path/      # 递归复制目录
scp -P 2222 file.txt user@192.168.1.100:/path/  # 指定端口

10. rsync:远程同步(更强大)

rsync -avz /local/dir/ user@192.168.1.100:/remote/dir/  # 同步本地到远程
rsync -avz user@192.168.1.100:/remote/dir/ /local/dir/   # 同步远程到本地
rsync -avz --delete /local/dir/ user@192.168.1.100:/remote/dir/  # 同步并删除目标多余文件
rsync -avz --progress /local/dir/ user@192.168.1.100:/remote/dir/  # 显示进度

rsync参数:-a归档模式,-v详细输出,-z压缩传输,--delete删除目标多余文件,--progress显示进度

11. dig/nslookup:DNS查询

dig www.baidu.com           # 查询域名DNS
dig www.baidu.com A         # 查询A记录
dig www.baidu.com MX        # 查询MX记录
dig www.baidu.com NS        # 查询NS记录
dig -x 192.168.1.1          # 反向查询
nslookup www.baidu.com      # 查询DNS
nslookup 192.168.1.1        # 反向查询

12. traceroute:路由追踪

traceroute www.baidu.com    # 追踪到目标的路由
traceroute -n www.baidu.com # 不解析域名,只显示IP

13. tcpdump:抓包工具

tcpdump                    # 抓取所有网络包
tcpdump -i eth0            # 指定网卡
tcpdump port 80            # 抓取80端口的包
tcpdump host 192.168.1.1  # 抓取指定主机的包
tcpdump -i eth0 -w file.pcap  # 保存到文件
tcpdump -r file.pcap       # 读取文件
tcpdump -nn -i eth0 port 80  # 不解析,显示IP和端口

14. iptables:防火墙

iptables -L                 # 查看规则
iptables -L -n              # 不解析,显示IP
iptables -F                 # 清空规则
iptables -A INPUT -p tcp --dport 80 -j ACCEPT  # 允许80端口
iptables -A INPUT -p tcp --dport 22 -j ACCEPT   # 允许22端口
iptables -A INPUT -s 192.168.1.0/24 -j ACCEPT  # 允许指定网段
iptables -A INPUT -j DROP   # 丢弃其他所有(注意顺序!)
iptables -D INPUT -p tcp --dport 80 -j ACCEPT  # 删除规则
service iptables save        # 保存规则(CentOS 6)
iptables-save > /etc/sysconfig/iptables  # 保存规则

注意:配置iptables时,一定要先允许SSH端口(22),否则可能把自己锁在外面!CentOS 7默认使用firewalld。

15. firewall-cmd:firewalld防火墙(CentOS 7)

firewall-cmd --state                    # 查看状态
firewall-cmd --list-all                 # 查看所有规则
firewall-cmd --list-ports               # 查看开放端口
firewall-cmd --permanent --add-port=80/tcp  # 永久开放80端口
firewall-cmd --permanent --remove-port=80/tcp  # 永久关闭80端口
firewall-cmd --permanent --add-service=http  # 永久开放http服务
firewall-cmd --reload                   # 重新加载配置

五、软件包管理

1. RPM包管理(CentOS/RHEL)

rpm -ivh package.rpm       # 安装rpm包
rpm -e package              # 卸载包
rpm -qa                     # 查询所有已安装包
rpm -qa | grep nginx        # 查询是否安装了nginx
rpm -qi package             # 查看包信息
rpm -ql package             # 查看包安装的文件
rpm -qf /path/to/file       # 查看文件属于哪个包
rpm -Uvh package.rpm        # 升级包

2. YUM包管理(CentOS/RHEL)

yum install package         # 安装包
yum install -y package      # 安装包,自动确认
yum remove package          # 卸载包
yum update package          # 更新包
yum update                  # 更新所有包
yum list installed          # 列出已安装包
yum list available          # 列出可安装包
yum list all                # 列出所有包
yum info package            # 查看包信息
yum search keyword          # 搜索包
yum clean all               # 清除缓存
yum makecache               # 生成缓存
yum provides /path/to/file  # 查看文件属于哪个包
yum groupinstall "Group Name"  # 安装包组

3. DNF包管理(CentOS 8+/Fedora)

DNF是YUM的下一代,用法和YUM基本一致:

dnf install package
dnf remove package
dnf update
dnf search keyword

4. APT包管理(Debian/Ubuntu)

apt-get update              # 更新软件源
apt-get install package     # 安装包
apt-get install -y package  # 安装包,自动确认
apt-get remove package      # 卸载包(保留配置)
apt-get purge package       # 卸载包(删除配置)
apt-get update              # 更新包列表
apt-get upgrade             # 升级所有包
apt-get dist-upgrade        # 升级系统
apt-cache search keyword    # 搜索包
apt-cache show package      # 查看包信息
dpkg -l                     # 列出已安装包
dpkg -i package.deb         # 安装deb包
dpkg -r package             # 卸载包

六、压缩和解压

1. tar:打包压缩

tar -cvf archive.tar /dir       # 打包(不压缩)
tar -xvf archive.tar             # 解包
tar -czvf archive.tar.gz /dir    # 打包并gzip压缩
tar -xzvf archive.tar.gz         # 解压tar.gz
tar -cjvf archive.tar.bz2 /dir   # 打包并bzip2压缩
tar -xjvf archive.tar.bz2        # 解压tar.bz2
tar -cJvf archive.tar.xz /dir    # 打包并xz压缩
tar -xJvf archive.tar.xz         # 解压tar.xz
tar -tzvf archive.tar.gz          # 查看压缩包内容
tar -xzvf archive.tar.gz -C /dir  # 解压到指定目录
tar -czvf archive.tar.gz --exclude='*.log' /dir  # 排除某些文件

tar参数:-c创建,-x解压,-t查看,-v详细输出,-f指定文件名,-z gzip,-j bzip2,-J xz,-C指定目录,--exclude排除

2. gzip/gunzip:gzip压缩

gzip file                # 压缩文件(生成file.gz,原文件删除)
gzip -d file.gz          # 解压
gunzip file.gz           # 解压
gzip -c file > file.gz   # 压缩,保留原文件
gzip -r dir              # 压缩目录下所有文件

3. zip/unzip:zip压缩

zip archive.zip file1 file2   # 压缩文件
zip -r archive.zip /dir        # 递归压缩目录
zip -r archive.zip /dir -x "*.log"  # 排除文件
unzip archive.zip               # 解压
unzip archive.zip -d /dir       # 解压到指定目录
unzip -l archive.zip            # 查看压缩包内容
unzip -t archive.zip            # 测试压缩包完整性

4. bzip2/bunzip2

bzip2 file               # 压缩(生成file.bz2)
bunzip2 file.bz2         # 解压
bzip2 -d file.bz2        # 解压

5. xz/unxz

xz file                  # 压缩(生成file.xz,压缩率最高)
unxz file.xz             # 解压
xz -d file.xz            # 解压

七、其他常用命令

1. echo:输出

echo "Hello World"       # 输出字符串
echo -e "line1\nline2"   # 支持转义字符
echo $PATH                # 输出环境变量
echo "text" > file        # 覆盖写入文件
echo "text" >> file       # 追加写入文件

2. history:查看命令历史

history                  # 查看所有历史命令
history 10               # 查看最近10条
!100                     # 执行第100条命令
!!                       # 执行上一条命令
!ls                      # 执行最近一条以ls开头的命令
history -c               # 清空历史

3. clear:清屏

clear                    # 清屏(快捷键Ctrl+L)

4. man:查看帮助

man ls                   # 查看ls命令的手册
man -k keyword           # 搜索相关命令
man 5 passwd             # 查看第5节(配置文件)

5. alias:别名

alias                    # 查看所有别名
alias ll='ls -la'        # 设置别名
unalias ll               # 取消别名

可以把常用别名写入~/.bashrc,永久生效。

6. which:查找命令位置

which nginx              # 查找nginx命令位置
which php                # 查找php命令位置

7. whereis:查找命令、源码、man手册

whereis nginx            # 查找nginx的二进制、源码、man手册

8. locate:查找文件(基于数据库)

locate filename          # 快速查找文件
updatedb                 # 更新文件数据库

locate比find快,但依赖数据库,新文件可能搜不到,需要updatedb更新。

9. watch:周期性执行命令

watch -n 1 'netstat -tulnp'  # 每秒执行一次
watch -d 'ls -la'             # 高亮变化

10. nohup:后台运行

nohup command &          # 后台运行,忽略挂断信号
nohup command > log.txt 2>&1 &  # 后台运行并重定向输出

11. &:后台运行

command &                # 后台运行
jobs                     # 查看后台任务
fg %1                    # 将后台任务调到前台
bg %1                    # 将暂停的任务放到后台

12. xargs:参数传递

cat urls.txt | xargs wget        # 批量下载
find . -name "*.log" | xargs rm  # 批量删除(危险!)
echo "a b c" | xargs mkdir       # 创建多个目录

13. cut:截取文本

cut -d ':' -f 1 /etc/passwd      # 以冒号分隔,取第1列
cut -c 1-5 filename               # 取每行第1-5个字符

14. tr:字符转换

echo "hello" | tr 'a-z' 'A-Z'    # 转大写
echo "HELLO" | tr 'A-Z' 'a-z'    # 转小写
echo "a:b:c" | tr ':' '\n'       # 冒号替换为换行
cat file | tr -d '\r'             # 删除Windows换行符

15. tee:输出到屏幕和文件

command | tee file.txt            # 输出到屏幕并写入文件
command | tee -a file.txt         # 追加

16. diff:比较文件

diff file1 file2                  # 比较两个文件
diff -u file1 file2               # 统一格式输出
diff -r dir1 dir2                 # 递归比较目录

17. patch:打补丁

patch < patch.diff                # 打补丁
patch -p1 < patch.diff            # 打补丁(忽略1层目录)
patch -R < patch.diff             # 撤销补丁

18. lnstat:网络统计

lnstat                            # 网络统计信息

19. vmstat:虚拟内存统计

vmstat                            # 虚拟内存、进程、CPU统计
vmstat 1                          # 每秒刷新
vmstat 1 5                        # 每秒刷新,共5次

20. iostat:IO统计

iostat                            # CPU和IO统计
iostat -x                         # 详细IO统计
iostat 1                          # 每秒刷新

21. sar:系统活动报告

sar                               # 查看CPU历史统计
sar -u 1 5                        # 每秒采样,共5次
sar -r                            # 内存统计
sar -n DEV                         # 网络统计
sar -b                             # IO统计

sar需要安装sysstat包,可以查看历史系统性能数据。

八、Shell脚本基础

Shell脚本,是将一系列Linux命令写入一个文件,批量执行。掌握Shell脚本,能大大提高自动化运维的效率。

1. 第一个脚本

#!/bin/bash
# 这是注释
echo "Hello World!"
  • 第一行#!/bin/bash指定解释器
  • #开头是注释
  • 保存为hello.sh,执行chmod +x hello.sh添加执行权限,./hello.sh执行

2. 变量

#!/bin/bash
name="Zhang San"          # 定义变量(等号两边不能有空格)
echo $name                # 使用变量
echo ${name}              # 也可以这样
echo "My name is $name"   # 双引号内解析变量
echo 'My name is $name'   # 单引号内不解析变量

# 特殊变量
echo $0                   # 脚本名
echo $1                   # 第一个参数
echo $2                   # 第二个参数
echo $#                   # 参数个数
echo $@                   # 所有参数
echo $?                   # 上一条命令的退出状态(0成功,非0失败)
echo $$                   # 当前进程PID

3. 条件判断

#!/bin/bash
# if语句
if [ $1 -gt 18 ]; then
    echo "成年人"
elif [ $1 -gt 12 ]; then
    echo "青少年"
else
    echo "儿童"
fi

# 常用比较运算符
# 数字:-eq等于,-ne不等于,-gt大于,-lt小于,-ge大于等于,-le小于等于
# 字符串:=等于,!=不等于,-z空串,-n非空串
# 文件:-e存在,-f普通文件,-d目录,-r可读,-w可写,-x可执行

# 逻辑运算
if [ $a -gt 10 ] && [ $a -lt 20 ]; then
    echo "a在10到20之间"
fi

if [ $a -eq 1 ] || [ $a -eq 2 ]; then
    echo "a是1或2"
fi

# case语句
case $1 in
    start)
        echo "启动服务"
        ;;
    stop)
        echo "停止服务"
        ;;
    restart)
        echo "重启服务"
        ;;
    *)
        echo "用法: $0 {start|stop|restart}"
        ;;
esac

4. 循环

#!/bin/bash
# for循环
for i in 1 2 3 4 5; do
    echo $i
done

for i in {1..10}; do
    echo $i
done

for file in *.txt; do
    echo $file
done

for ((i=0; i<10; i++)); do
    echo $i
done

# while循环
i=0
while [ $i -lt 10 ]; do
    echo $i
    i=$((i+1))
done

# until循环(条件为假时执行)
i=0
until [ $i -ge 10 ]; do
    echo $i
    i=$((i+1))
done

# break和continue
for i in {1..10}; do
    if [ $i -eq 5 ]; then
        break  # 跳出循环
    fi
    echo $i
done

for i in {1..10}; do
    if [ $i -eq 5 ]; then
        continue  # 跳过本次循环
    fi
    echo $i
done

5. 函数

#!/bin/bash
# 定义函数
function greet() {
    echo "Hello, $1!"
    return 0  # 返回值(0-255)
}

# 调用函数
greet "Zhang San"

# 函数返回值
function add() {
    return $(($1 + $2))
}
add 3 5
echo "3+5=$?"

# 局部变量
function test() {
    local name="local"  # 局部变量
    echo $name
}

6. 数组

#!/bin/bash
# 定义数组
arr=("apple" "banana" "orange")

# 访问元素
echo ${arr[0]}          # 第一个元素
echo ${arr[@]}          # 所有元素
echo ${#arr[@]}         # 数组长度
echo ${!arr[@]}         # 所有索引

# 遍历数组
for item in ${arr[@]}; do
    echo $item
done

# 修改元素
arr[0]="pear"

# 添加元素
arr+=("grape")

7. 常用脚本示例

备份脚本

#!/bin/bash
# 备份网站文件
BACKUP_DIR="/backup"
SRC_DIR="/var/www/html"
DATE=$(date +%Y%m%d_%H%M%S)

mkdir -p $BACKUP_DIR
tar -czvf $BACKUP_DIR/backup_$DATE.tar.gz $SRC_DIR

# 删除7天前的备份
find $BACKUP_DIR -name "backup_*.tar.gz" -mtime +7 -delete

echo "备份完成: backup_$DATE.tar.gz"

监控脚本

#!/bin/bash
# 监控磁盘使用率
THRESHOLD=80
df -h | grep -vE '^Filesystem|tmpfs|cdrom' | while read line; do
    usage=$(echo $line | awk '{print $5}' | cut -d'%' -f1)
    partition=$(echo $line | awk '{print $6}')
    if [ $usage -ge $THRESHOLD ]; then
        echo "警告: $partition 使用率 $usage% 超过阈值 $THRESHOLD%"
        # 可以发送邮件告警
    fi
done

批量处理

#!/bin/bash
# 批量修改文件扩展名
for file in *.txt; do
    mv "$file" "${file%.txt}.md"
done

九、实用技巧

1. 命令快捷键

  • Ctrl + C:终止当前命令
  • Ctrl + Z:暂停当前命令(放到后台)
  • Ctrl + D:退出当前Shell(EOF)
  • Ctrl + L:清屏
  • Ctrl + A:光标移到行首
  • Ctrl + E:光标移到行尾
  • Ctrl + U:删除光标前所有字符
  • Ctrl + K:删除光标后所有字符
  • Ctrl + W:删除光标前一个单词
  • Ctrl + R:搜索历史命令
  • Tab:自动补全命令或文件名
  • !!:执行上一条命令
  • !$:上一条命令的最后一个参数

2. 管道和重定向

# 管道:将前一个命令的输出作为后一个命令的输入
cat file.txt | grep "error" | wc -l

# 重定向
command > file     # 标准输出覆盖写入文件
command >> file    # 标准输出追加写入文件
command < file     # 从文件读取输入
command 2> file    # 标准错误覆盖写入
command 2>> file   # 标准错误追加
command &> file    # 标准输出和错误都写入
command > file 2>&1  # 标准错误重定向到标准输出

3. 命令替换

# 两种方式
date1=$(date +%Y%m%d)
date2=`date +%Y%m%d`
echo $date1 $date2

4. 后台执行

command &          # 后台执行
nohup command &    # 后台执行,忽略挂断
command > log 2>&1 &  # 后台执行并重定向输出

5. 查看系统版本

cat /etc/redhat-release   # CentOS/RHEL
cat /etc/os-release        # 通用
cat /etc/issue             # Debian/Ubuntu
uname -a                   # 内核信息

6. 查看CPU信息

cat /proc/cpuinfo          # CPU详细信息
lscpu                      # CPU架构信息
nproc                      # CPU核心数

7. 查看内存信息

cat /proc/meminfo          # 内存详细信息
free -h                    # 内存使用

8. 查看开机启动项

chkconfig --list           # CentOS 6
systemctl list-unit-files  # CentOS 7

9. 服务管理

# CentOS 6
service nginx start
service nginx stop
service nginx restart
service nginx status
chkconfig nginx on         # 开机启动
chkconfig nginx off        # 取消开机启动

# CentOS 7
systemctl start nginx
systemctl stop nginx
systemctl restart nginx
systemctl status nginx
systemctl enable nginx     # 开机启动
systemctl disable nginx    # 取消开机启动

10. 日志查看

# 系统日志
tail -f /var/log/messages   # CentOS系统日志
tail -f /var/log/syslog     # Ubuntu系统日志
tail -f /var/log/secure     # 安全日志
tail -f /var/log/cron       # 定时任务日志

# 服务日志
tail -f /var/log/nginx/access.log
tail -f /var/log/nginx/error.log
tail -f /var/log/mysqld.log

总结

Linux命令,是程序员和运维人员的必备技能。掌握常用的Linux命令,能大大提高工作效率,也能更好地管理和维护服务器。

核心要点:

  1. 文件和目录操作:ls、cd、pwd、mkdir、rm、cp、mv、touch、find、ln、chmod、chown
  2. 查看文件内容:cat、more、less、head、tail、wc、sort、uniq、grep、awk、sed
  3. 系统管理:uname、hostname、whoami、date、uptime、free、df、du、top、ps、kill、shutdown、用户管理、crontab
  4. 网络操作:ifconfig/ip、ping、netstat/ss、curl、wget、ssh、scp、rsync、dig、traceroute、tcpdump、iptables/firewalld
  5. 软件包管理:rpm/yum/dnf(CentOS)、apt/dpkg(Ubuntu)
  6. 压缩解压:tar、gzip、zip、bzip2、xz
  7. 其他:echo、history、man、alias、which、whereis、locate、watch、nohup、xargs、cut、tr、tee、diff、vmstat、iostat、sar
  8. Shell脚本:变量、条件判断、循环、函数、数组、常用脚本示例
  9. 实用技巧:快捷键、管道重定向、命令替换、后台执行、系统信息查看、服务管理、日志查看

Linux命令,博大精深,需要在实际使用中不断学习和积累。不要死记硬背,要理解每个命令的作用和用法,在实际工作中多使用,多练习,自然就能熟练掌握。

"工欲善其事,必先利其器。"希望这篇文章,能帮你掌握Linux常用命令,让你的工作更加高效和轻松。