Linux 查看系统日志 Linux
Linux 查看系统日志
排查问题先看日志,这些命令要记住。
1. 系统日志位置
/var/log/messages # 系统主日志
/var/log/syslog # Debian/Ubuntu 系统日志
/var/log/boot.log # 启动日志
/var/log/cron # 定时任务日志
/var/log/secure # 安全日志(登录、sudo等)
/var/log/nginx/ # Nginx 日志
/var/log/httpd/ # Apache 日志
/var/log/mysql/ # MySQL 日志
2. 基本查看命令
cat:查看全部
cat /var/log/messages
tail:看末尾几行(最常用)
# 看最后10行
tail /var/log/messages
# 看最后20行
tail -n 20 /var/log/messages
# 实时跟踪日志(最常用)
tail -f /var/log/messages
head:看开头几行
head -n 10 /var/log/messages
3. 搜索日志
grep:搜索关键词
# 搜索错误信息
grep "error" /var/log/messages
# 不区分大小写
grep -i "error" /var/log/messages
# 显示行号
grep -n "error" /var/log/messages
# 反向匹配(不包含error)
grep -v "debug" /var/log/messages
结合管道
# 实时日志里搜索错误
tail -f /var/log/messages | grep "error"
# 搜索最近的nginx错误
tail -n 1000 /var/log/nginx/error.log | grep "500"
4. journalctl 查看 systemd 日志
# 查看全部日志
journalctl
# 看最后100行
journalctl -n 100
# 实时跟踪
journalctl -f
# 按服务查看
journalctl -u nginx
# 按时间查看
journalctl --since "1 hour ago"
journalctl --since "2024-01-01" --until "2024-01-02"
5. 常用排查场景
1)服务器登录失败
grep "Failed password" /var/log/secure
2)服务起不来
systemctl status nginx
journalctl -u nginx -n 50
3)磁盘满了
df -h
du -sh /var/log/*
4)定时任务没执行
cat /var/log/cron
6. 日志清理
手动删除大日志
# 查看日志大小
du -sh /var/log/*
# 清空日志(不删除文件)
> /var/log/messages
# 删除旧日志
rm /var/log/messages.1
logrotate 自动切割
- Linux 自带日志切割工具
- 配置文件在 /etc/logrotate.conf
- 一般不用管,自动轮转
总结
Linux 查看日志要点:
- 日志都在 /var/log/ 目录
- tail -f 实时看日志最常用
- grep 搜索关键词
- journalctl 查 systemd 服务日志
- 排查问题先看错误日志
- 日志太大要及时清理
- 系统自动轮转不用手动管
运维排查,看日志是第一步。
Linux 文件权限详解 Linux
Linux 文件权限详解
Linux 权限是基础,搞不懂经常出问题。
1. 查看权限
ls -l
输出:
-rw-r--r-- 1 root root 1000 Oct 8 10:00 test.txt
2. 权限含义
第一位:文件类型
-
- 普通文件
- d 目录
- l 软链接
后面9位:分3组
- 第1组:所有者权限
- 第2组:所属组权限
- 第3组:其他人权限
3个字母:
- r 读(4)
- w 写(2)
- x 执行(1)
比如 rw-r--r--:
- 所有者:读写(6)
- 组:只读(4)
- 其他人:只读(4)
3. 修改权限 chmod
数字方式:
# 所有者读写执行,组读执行,其他人读执行
chmod 755 test.sh
# 所有人只读
chmod 444 test.txt
字母方式:
# 给所有者加执行权限
chmod u+x test.sh
# 给组加写权限
chmod g+w test.txt
# 去掉其他人的读权限
chmod o-r test.txt
4. 修改所有者 chown
# 修改所有者
chown www:www test.txt
# 递归修改目录
chown -R www:www /www/wwwroot
5. 常用权限
- 目录:755(所有者读写执行,其他人读执行)
- 普通文件:644(所有者读写,其他人只读)
- 脚本文件:755
6. 常见问题
1)网站打不开:
- 检查目录权限是不是 755
- 检查文件权限是不是 644
- 检查所有者是不是 www
2)上传不了文件:
- 检查目录有没有写权限
3)脚本执行不了:
- 检查有没有执行权限
总结
Linux 文件权限要点:
- r=4, w=2, x=1
- chmod 修改权限
- chown 修改所有者
- 目录 755,文件 644
- 权限不对经常出问题
做运维,权限一定要搞懂。
Linux 防火墙配置详解 Linux
Linux 防火墙配置详解
服务器安全第一步就是防火墙,学会配置很重要。
1. firewalld(CentOS 7+)
查看状态:
systemctl status firewalld
开启/关闭:
# 开启
systemctl start firewalld
# 关闭
systemctl stop firewalld
# 开机自启
systemctl enable firewalld
2. 开放端口
开放单个端口:
firewall-cmd --zone=public --add-port=80/tcp --permanent
开放多个端口:
firewall-cmd --zone=public --add-port=80-90/tcp --permanent
重新加载生效:
firewall-cmd --reload
3. 查看端口
# 查看所有开放端口
firewall-cmd --list-ports
# 查看某个端口是否开放
firewall-cmd --query-port=80/tcp
4. 关闭端口
firewall-cmd --zone=public --remove-port=80/tcp --permanent
firewall-cmd --reload
5. iptables(旧版)
查看规则:
iptables -L -n
开放端口:
iptables -I INPUT -p tcp --dport 80 -j ACCEPT
保存规则:
service iptables save
6. 常用端口
# 常用端口
22 SSH
80 HTTP
443 HTTPS
3306 MySQL
6379 Redis
8080 Tomcat
7. 常见问题
1)端口开了还是访问不了:
- 检查云服务商安全组
- 检查服务器内部防火墙
2)远程连接不上:
- 检查 22 端口是否开放
- 检查 sshd 是否启动
总结
Linux 防火墙要点:
- firewalld 管理端口
- --permanent 永久生效
- --reload 重新加载
- 记得开放安全组
- 常用端口按需开放
做运维,防火墙是基本功。
Linux 查看系统资源 Linux
Linux 查看系统资源
服务器卡了慢了,得知道哪个进程占资源多。整理常用的查看命令。
1. 查看内存使用
# 查看内存使用情况
free -h
# 持续查看
free -h 1
输出说明:
- total:总内存
- used:已使用
- free:空闲
- buff/cache:缓存
- available:可用
2. 查看 CPU 负载
# 查看 CPU 信息
top
# 按 q 退出
top 常用快捷键:
- P:按 CPU 排序
- M:按内存排序
- 1:查看每个核心
3. 查看磁盘使用
# 查看磁盘空间
df -h
# 查看目录大小
du -sh /www/
# 查看当前目录下每个文件大小
du -sh *
4. 查看进程
# 查看所有进程
ps aux
# 查看 PHP 进程
ps aux | grep php
# 查看端口占用
netstat -tlnp
5. 查看系统信息
# 查看系统版本
cat /etc/os-release
# 查看内核版本
uname -a
# 查看 CPU 核心数
nproc
# 查看内存大小
cat /proc/meminfo | head -5
6. 查找大文件
# 查找大于100M的文件
find / -type f -size +100M
# 查找最近7天修改的文件
find /www -type f -mtime -7
7. 常用场景
网站卡了:
- top 看 CPU 和内存
- df -h 看磁盘满没满
- 看日志
内存不够用:
- free -h 看内存
- top 按 M 排序找占内存大的进程
总结
常用命令记这几个:
- 内存:free -h
- CPU:top
- 磁盘:df -h / du -sh
- 进程:ps aux
- 端口:netstat
做运维这些命令天天用,必须熟。
Linux查看系统运行级别,multi-user.target详解 Linux
前言
经常听到别人说"运行级别 3"、"运行级别 5",这是什么意思?CentOS7 之后用 systemd 代替了老的 SysVinit,运行级别也变成了 target。本文讲一下怎么查看和切换系统运行级别。
老的运行级别(SysVinit)
老系统(CentOS6 之前)用数字表示运行级别:
| 级别 | 含义 |
|---|---|
| 0 | 关机 |
| 1 | 单用户模式(救援模式) |
| 2 | 多用户模式(无 NFS) |
| 3 | 完全多用户模式(命令行,服务器常用) |
| 4 | 未使用 |
| 5 | 图形界面模式 |
| 6 | 重启 |
新的 target(systemd)
CentOS7 之后用 target 代替了数字运行级别:
| target | 对应老级别 | 含义 |
|---|---|---|
| poweroff.target | 0 | 关机 |
| rescue.target | 1 | 救援模式 |
| multi-user.target | 3 | 命令行模式(服务器常用) |
| graphical.target | 5 | 图形界面模式 |
| reboot.target | 6 | 重启 |
查看当前运行级别
systemctl 命令
systemctl get-default
输出:
multi-user.target
就是当前默认的运行级别是命令行模式。
老命令(还能用)
runlevel
输出类似:
N 3
第一个是上次运行级别(N 表示没有),第二个是当前运行级别。
切换运行级别
临时切换(重启后恢复)
systemctl isolate 目标target
比如从图形界面切到命令行:
systemctl isolate multi-user.target
或者从命令行切到图形界面:
systemctl isolate graphical.target
永久切换(重启后生效)
systemctl set-default 目标target
比如默认启动到命令行模式:
systemctl set-default multi-user.target
默认启动到图形界面:
systemctl set-default graphical.target
常用操作
进入救援模式
系统出问题了进不去?进救援模式:
systemctl rescue
进入紧急模式
更底层的救援模式:
systemctl emergency
关机
systemctl poweroff
或者:
systemctl halt
重启
systemctl reboot
常见坑
坑1:图形界面切命令行后黑屏
执行了 isolate multi-user.target,屏幕黑了。
原因: 这是正常的,切到命令行模式就是黑屏,只有终端提示符。
解决: 输入用户名密码登录就行。
坑2:设置了 multi-user.target 但还是进图形界面
执行了 set-default multi-user.target,但重启后还是进图形界面。
原因: 可能有多个桌面管理器在抢着启动。
解决: 确认一下:
systemctl get-default
应该显示 multi-user.target。如果不对,再执行一次。
坑3:把运行级别设成 0 或 6 了
不小心设成了 poweroff.target 或 reboot.target。
后果: 一开就关机或者一开就重启,无限循环。
解决: 进救援模式改回来。
总结
| 命令 | 作用 |
|---|---|
systemctl get-default |
查看当前默认运行级别 |
systemctl set-default multi-user.target |
设置为命令行模式 |
systemctl set-default graphical.target |
设置为图形界面模式 |
systemctl isolate multi-user.target |
临时切到命令行 |
systemctl isolate graphical.target |
临时切到图形界面 |
runlevel |
老命令查看运行级别 |
服务器一般用 multi-user.target(命令行模式),更省资源、更稳定。
遇到问题加QQ23979811 协助处理
Linux查看端口被哪个进程占用,lsof命令 Linux
前言
启动服务的时候提示 "Address already in use",端口被占了,但不知道被哪个进程占了?这时候就需要用 lsof 或者 netstat 命令来查一下。本文讲一下怎么用。
lsof 命令
安装
CentOS 最小化安装可能没有 lsof:
yum install -y lsof
查看某个端口被哪个进程占用
lsof -i:端口号
比如看 80 端口被谁占了:
lsof -i:80
输出类似:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
nginx 1234 root 6u IPv4 12345 0t0 TCP *:http (LISTEN)
重点看:
PID:进程号COMMAND:进程名
知道了 PID 之后,想杀掉就用 kill PID。
查看所有正在监听的端口
lsof -i -P -n | grep LISTEN
输出所有处于监听状态的端口和对应的进程。
netstat 命令
安装
来自 net-tools 包:
yum install -y net-tools
查看端口被哪个进程占用
netstat -tlnp | grep 端口号
比如看 80 端口:
netstat -tlnp | grep :80
输出类似:
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1234/nginx
最后一列就是 PID/进程名。
参数解释
| 参数 | 含义 |
|---|---|
-t |
显示 TCP 连接 |
-l |
只显示监听状态的 |
-n |
显示数字,不解析域名 |
-p |
显示进程名和 PID |
查看所有监听端口
netstat -tlnp
fuser 命令
查看端口被哪个进程占用
fuser 端口号/tcp
比如:
fuser 80/tcp
输出:
80/tcp: 1234
直接显示 PID,简单粗暴。
杀掉占用端口的进程
fuser -k 80/tcp
直接把占用 80 端口的进程杀掉。
常见场景
场景1:启动 Nginx 提示端口被占
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
查一下:
lsof -i:80
发现是旧的 nginx 进程没杀掉,直接杀:
kill 1234
或者:
fuser -k 80/tcp
场景2:3306 端口不知道被谁占了
lsof -i:3306
发现是 MySQL 进程,正常的。
场景3:找出所有被占用的端口
netstat -tlnp
列出所有正在监听的端口。
常见坑
坑1:lsof 命令找不到
执行 lsof 提示 command not found。
原因: 没装 lsof 包。
解决:
yum install -y lsof
坑2:普通用户看不到其他用户的进程
用普通用户执行 lsof,看不到 root 的进程。
原因: 权限不够。
解决: 加 sudo 或者切 root:
sudo lsof -i:80
坑3:端口明明没被占但提示被占
服务明明没启动,但启动时提示端口被占。
原因: 可能有 TIME_WAIT 状态的连接还没释放。
解决: 等一会儿再试,或者改端口。
坑4:杀了进程端口还是没释放
杀掉进程了,但端口还是显示被占。
原因: 进程还在退出中,等几秒就好了。
总结
| 命令 | 作用 |
|---|---|
lsof -i:端口号 |
查看端口被哪个进程占用 |
netstat -tlnp \| grep :端口号 |
用 netstat 查端口 |
fuser 端口号/tcp |
查看端口对应的 PID |
fuser -k 端口号/tcp |
杀掉占用端口的进程 |
最常用的就是 lsof -i:端口号,一眼就能看到进程名和 PID。
遇到问题加QQ23979811 协助处理
Linux上传下载文件,rz和sz命令使用 Linux
前言
经常需要从本地电脑上传文件到服务器,或者把服务器上的文件下载到本地。除了用 FTP 工具,还有更简单的 rz 和 sz 命令,直接在终端里就能操作。本文讲一下怎么用。
安装 lrzsz
rz 和 sz 命令来自 lrzsz 包,CentOS 最小化安装可能没有:
yum install -y lrzsz
Ubuntu 的话:
apt install -y lrzsz
rz 上传文件(从本地上传到服务器)
基本用法
直接输入:
rz
执行后会弹出一个文件选择窗口,选你要上传的文件,点确定就开始上传了。
注意: 文件会上传到你当前所在的目录。
指定文件名
上传后直接改成指定名字:
rz -y 新文件名
-y 是覆盖同名文件。
上传多个文件
执行 rz 之后在文件选择窗口可以按住 Ctrl 多选。
sz 下载文件(从服务器下载到本地)
下载单个文件
sz 文件名
比如下载 index.html:
sz index.html
执行后会弹出保存窗口,选保存位置就开始下载了。
下载多个文件
sz 文件1 文件2 文件3
比如:
sz a.txt b.txt c.txt
下载整个目录(先打包)
sz 不能直接下载目录,要先打包:
tar -zcvf backup.tar.gz /var/www/html
sz backup.tar.gz
常见使用场景
场景1:上传配置文件
# 先进入要上传的目录
cd /etc/nginx/conf.d/
# 上传
rz
选本地的 nginx 配置文件,上传完就直接放到这个目录了。
场景2:下载日志文件
# 进入日志目录
cd /var/log/nginx/
# 下载访问日志
sz access.log
场景3:上传压缩包
本地把项目打包成 zip,然后:
cd /var/www/html/
rz
选本地的项目 zip 文件,上传完再解压。
常见坑
坑1:rz 命令找不到
执行 rz 提示 command not found。
原因: 没装 lrzsz 包。
解决:
yum install -y lrzsz
坑2:上传的文件不知道去哪了
执行了 rz,但不知道文件上传到哪了。
原因: 文件上传到你当前所在的目录。
解决: 上传前先 pwd 看一下当前目录在哪。
坑3:用了某些 SSH 工具不支持 rz/sz
有些 SSH 客户端(比如 Windows 自带的 cmd)不支持 rz/sz。
原因: rz/sz 需要终端支持 ZModem 协议。
解决: 用支持的 SSH 工具,比如 Xshell、SecureCRT、FinalShell、MobaXterm。
坑4:大文件上传慢
上传几百 M 的文件特别慢。
原因: rz/sz 走的是 SSH 通道,速度不快。
解决: 大文件用 SFTP 或者专门的传输工具(FileZilla)更快。
坑5:上传的文件是乱码
上传完中文文件名变成乱码。
原因: 编码问题。
解决: 用英文文件名,或者先打包成 zip 再上传。
总结
| 命令 | 作用 |
|---|---|
rz |
从本地上传文件到服务器 |
sz 文件名 |
从服务器下载文件到本地 |
前提: 要先装 lrzsz 包,而且 SSH 工具要支持 ZModem 协议。
小文件用 rz/sz 很方便,大文件还是用 SFTP 吧。
遇到问题加QQ23979811 协助处理
Linux查看所有服务,systemctl命令大全 Linux
前言
CentOS7 之后用 systemctl 管理服务,代替了老的 service 和 chkconfig 命令。本文把常用的 systemctl 命令都整理出来,新手照着用就行。
查看服务
查看所有服务
systemctl list-units --type=service
列出所有正在运行的服务。
查看所有服务(包括没运行的)
systemctl list-unit-files --type=service
查看正在运行的服务
systemctl list-units --type=service --state=running
查看某个服务状态
systemctl status 服务名
比如看 nginx 状态:
systemctl status nginx
输出会显示服务是否在运行、PID、内存占用、最近日志等。
启动和停止服务
启动服务
systemctl start 服务名
比如:
systemctl start nginx
停止服务
systemctl stop 服务名
比如:
systemctl stop nginx
重启服务
systemctl restart 服务名
比如:
systemctl restart nginx
重载配置(不重启)
修改了配置文件后,用 reload 重载,不用重启:
systemctl reload 服务名
比如:
systemctl reload nginx
平滑重启(reload 不行就用这个)
systemctl reload-or-restart 服务名
设置开机自启
开启开机自启
systemctl enable 服务名
比如:
systemctl enable nginx
关闭开机自启
systemctl disable 服务名
比如:
systemctl disable nginx
查看是否开机自启
systemctl is-enabled 服务名
输出 enabled 就是开机自启,disabled 就是不是。
其他常用操作
查看服务是否在运行
systemctl is-active 服务名
输出 active 就是在运行,inactive 就是没运行。
查看服务日志
journalctl -u 服务名
比如看 nginx 日志:
journalctl -u nginx
实时看服务日志
journalctl -u 服务名 -f
和 tail -f 一样,实时输出最新日志。
查看服务开机自启状态
systemctl list-unit-files --type=service | grep enabled
列出所有开机自启的服务。
常见服务名
| 服务名 | 对应服务 |
|---|---|
| nginx | Nginx 网页服务 |
| httpd | Apache 网页服务 |
| mysqld | MySQL 数据库 |
| firewalld | 防火墙 |
| crond | 定时任务 |
| sshd | SSH 远程连接 |
| php-fpm | PHP 解析 |
| redis | Redis 缓存 |
常见坑
坑1:服务名写错了
执行 systemctl 报错 Unit xxx.service could not be found。
原因: 服务名写错了。
解决: 先列一下所有服务,找到正确的服务名:
systemctl list-unit-files --type=service | grep 关键词
坑2:启动了服务但还是访问不了
服务显示 active,但外部还是访问不了。
原因: 防火墙没开端口,或者服务本身配置错了。
解决: 先看防火墙开了没,再看服务日志:
journalctl -u 服务名
坑3:开机自启了但重启后没起来
设置了 enable,但重启后服务还是没启动。
原因: 服务配置有问题,启动失败了。
解决: 看日志找原因:
journalctl -u 服务名
坑4:用了老命令 service
执行 service nginx start 能用,但不推荐了。
原因: 这是老命令,新系统都用 systemctl。
解决: 换成 systemctl start nginx。
总结
| 操作 | 命令 |
|---|---|
| 查看所有服务 | systemctl list-units --type=service |
| 查看服务状态 | systemctl status 服务名 |
| 启动服务 | systemctl start 服务名 |
| 停止服务 | systemctl stop 服务名 |
| 重启服务 | systemctl restart 服务名 |
| 重载配置 | systemctl reload 服务名 |
| 开机自启 | systemctl enable 服务名 |
| 关闭开机自启 | systemctl disable 服务名 |
| 查看日志 | journalctl -u 服务名 |
systemctl 就这几个常用命令,记住就够用了。
遇到问题加QQ23979811 协助处理
Linux怎么修改主机名,永久生效方法 Linux
前言
新装好的服务器默认主机名是 localhost 或者一串乱七八糟的字符,不好区分。怎么改成自己想要的名字,而且重启后还生效?本文讲一下。
查看当前主机名
先看看现在主机名是什么:
hostname
输出类似:
localhost.localdomain
修改主机名的方法
方法一:hostnamectl(推荐,CentOS7+)
这是最方便的方法,一条命令永久生效:
hostnamectl set-hostname 新主机名
比如改成 web-server:
hostnamectl set-hostname web-server
注意: 主机名只能用小写字母、数字、横杠(-),不能用下划线、中文、空格。
方法二:修改配置文件
编辑 /etc/hostname 文件:
vi /etc/hostname
把里面的内容改成新的主机名,保存退出。
然后重启生效:
reboot
或者不重启,手动让它生效:
hostname 新主机名
方法三:临时修改
只改当前运行时的主机名,重启后就恢复:
hostname 新主机名
注意: 这个只是临时生效,重启后还是原来的。
修改后验证
重新登录一下 SSH,或者执行:
bash
让当前 shell 生效,然后看:
hostname
应该显示新的主机名了。
同时修改 hosts
有些服务(比如 MySQL)会用到主机名,最好同时把 /etc/hosts 也改一下:
vi /etc/hosts
找到类似这一行:
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
在后面加上新主机名:
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 web-server
保存退出。
常见坑
坑1:改了主机名但命令行没变
执行了 hostnamectl set-hostname,但命令行前面还是显示旧的。
原因: 当前 shell 会话没刷新。
解决: 退出重新登录 SSH,或者执行 bash 开个新 shell。
坑2:重启后又变回原来的
改了主机名,重启之后又变回去了。
原因: 只执行了 hostname 新名字(临时修改),没改配置文件。
解决: 用 hostnamectl set-hostname 新名字 永久修改。
坑3:主机名有大写或者下划线
主机名用了大写字母或者下划线,有些服务报错。
原因: 主机名规范要求只能用小写字母、数字、横杠。
正确写法: web-server-01
错误写法: Web_Server_01
坑4:改了主机名导致服务连不上
改了主机名之后,某些服务连不上数据库或者其他服务。
原因: 那些服务里配置的还是旧主机名。
解决: 把相关服务的配置里的主机名也改过来,或者同时改 /etc/hosts 做映射。
总结
| 方法 | 命令 | 是否永久 |
|---|---|---|
| hostnamectl | hostnamectl set-hostname 新名字 |
是(推荐) |
| 修改 /etc/hostname | 编辑文件后重启 | 是 |
| hostname | hostname 新名字 |
否(临时) |
推荐用 hostnamectl set-hostname,一条命令搞定,永久生效。
遇到问题加QQ23979811 协助处理
Linux查看网卡信息,ip addr和ifconfig命令 Linux
前言
想知道服务器有几块网卡、IP 地址是多少、MAC 地址是多少?Linux 下有两个常用命令:ip addr 和 ifconfig。本文讲一下它们的用法和区别。
ip addr 命令(推荐)
现在新的 Linux 系统都推荐用 ip 命令,功能比 ifconfig 更强大。
查看所有网卡信息
ip addr
或者简写:
ip a
输出类似:
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:16:3e:12:34:56 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.100/24 brd 192.168.1.255 scope global eth0
valid_lft forever preferred_lft forever
输出解释
| 字段 | 含义 |
|---|---|
lo |
本地回环网卡 |
eth0 |
物理网卡名称 |
state UP |
网卡状态是开启的 |
link/ether |
MAC 地址 |
inet |
IP 地址 |
/24 |
子网掩码(255.255.255.0) |
只看 IP 地址
不想看那么多信息,只看 IP:
ip addr show eth0 | grep inet
或者更简洁:
ip a s eth0
只看 IPv4 地址
ip -4 addr
查看网卡统计信息
ip -s link
能看到收发包、丢包等统计信息。
ifconfig 命令(老命令)
ifconfig 是老命令,来自 net-tools 包,现在慢慢被淘汰了,但很多老用户还是习惯用。
安装
CentOS 最小化安装可能没有:
yum install -y net-tools
查看所有网卡
ifconfig
输出类似:
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.1.100 netmask 255.255.255.0 broadcast 192.168.1.255
ether 00:16:3e:12:34:56 txqueuelen 1000 (Ethernet)
RX packets 12345 bytes 1234567 (1.2 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 6789 bytes 987654 (987.6 KB)
TX errors 0 dropped 0 overruns 0 carrier 0
只看某个网卡
ifconfig eth0
查看 lo 网卡
ifconfig 默认不显示 lo(回环网卡),要看的话加 -a:
ifconfig -a
ip 和 ifconfig 的区别
| 对比项 | ip addr | ifconfig |
|---|---|---|
| 新老 | 新命令,推荐 | 老命令,逐步淘汰 |
| 包 | iproute2 包(默认装) | net-tools 包(要单独装) |
| 功能 | 更强大 | 基本够用 |
| 输出 | 信息更全 | 简洁 |
其他常用命令
查看路由表
ip route
或者老命令:
route -n
查看 DNS 配置
cat /etc/resolv.conf
查看网卡连接状态
cat /sys/class/net/eth0/carrier
输出 1 表示网线插着,0 表示没插。
查看网卡速率
ethtool eth0 | grep Speed
常见坑
坑1:ifconfig 命令找不到
执行 ifconfig 提示 command not found。
原因: CentOS7 最小化安装不带 net-tools 包。
解决:
yum install -y net-tools
或者直接用 ip addr,不用装包。
坑2:网卡名不是 eth0
新系统网卡名可能是 ens33、ens33、enp0s3 之类的。
原因: CentOS7 用了新的网卡命名规则。
解决: 先 ip addr 看一下实际网卡名是什么,然后替换。
坑3:IP 地址不对
看到的 IP 地址和你预期的不一样。
原因: 可能有多个网卡,或者是云服务器的内网 IP,不是公网 IP。
解决: 先 ip addr 看所有网卡,确认哪个是你要的。
坑4:网卡 down 了
网卡状态是 DOWN,连不上网。
解决: 手动开启:
ip link set eth0 up
或者:
ifconfig eth0 up
总结
| 命令 | 作用 |
|---|---|
ip addr |
查看所有网卡信息(推荐) |
ip a |
简写 |
ip a s eth0 |
只看 eth0 网卡 |
ifconfig |
老命令查看网卡 |
ifconfig eth0 |
只看 eth0 |
ip route |
查看路由表 |
现在都推荐用 ip addr,功能更全,还不用额外装包。
遇到问题加QQ23979811 协助处理
Linux查看历史命令,history命令使用技巧 Linux
前言
在服务器上敲了很多命令,突然想找之前执行过的某条命令,怎么办?history 命令就能帮你查看历史命令。本文讲一下 history 的常用用法和技巧。
基本用法
查看历史命令
history
输出会列出你执行过的所有命令,每条前面有个编号,比如:
100 yum install -y wget
101 systemctl restart nginx
102 df -h
执行第 N 条历史命令
用 !编号 直接执行:
!101
就会重新执行第 101 条命令。
执行上一条命令
几种方式都行:
!!
或者按向上方向键,再回车。
搜索历史命令
输入开头几个字母,然后按 Ctrl + R:
(reverse-i-search)`sys': systemctl restart nginx
会搜索你输入过的包含这个关键词的历史命令,找到之后回车执行。
再按一次 Ctrl + R 会继续往前找下一个匹配的。
常用技巧
只看最近 N 条
history 10
只看最近 10 条命令。
搜索历史命令里的关键词
history | grep 关键词
比如找所有包含 nginx 的命令:
history | grep nginx
执行最近一条以某个关键词开头的命令
!关键词
比如最近一条以 yum 开头的命令:
!yum
会直接执行最近一次输入的 yum 开头的命令。
替换上一条命令里的内容
比如上一条命令是 cp file1.txt file2.txt,想改成 mv file1.txt file2.txt:
^cp^mv
这样就把上一条命令里的 cp 替换成 mv 再执行。
清空历史命令
清空当前会话的历史
history -c
注意:这个只是清空当前内存里的历史,还没写入文件。
清空历史文件
history -w
把当前内存里的历史写入文件(覆盖掉旧的)。
彻底清空
history -c
history -w
两步一起执行,彻底清空所有历史命令。
删除某一条历史命令
history -d 编号
比如删除第 100 条:
history -d 100
历史命令保存在哪
历史命令默认保存在:
~/.bash_history
每个用户都有自己的 .bash_history 文件。
查看历史文件
cat ~/.bash_history
修改历史记录条数
默认记录 1000 条,可以改:
echo "HISTSIZE=10000" >> /etc/profile
echo "HISTFILESIZE=10000" >> /etc/profile
source /etc/profile
改成记录 10000 条。
常见坑
坑1:history 看不到刚执行的命令
刚执行完的命令,history 里没有。
原因: 历史命令是在退出会话的时候才写入文件的,当前会话的历史在内存里。
解决: 执行 history 就能看到当前会话的所有命令,包括刚执行的。
坑2:history -c 清不干净
执行了 history -c,但重新登录后又出来了。
原因: 只清了内存,没清文件。
解决: 还要执行 history -w 写入文件。
坑3:别人 history 能看到我输的密码
不小心在命令行里输了密码,比如 mysql -uroot -p123456,history 里就有了。
解决:
- 执行完之后赶紧删掉那条历史:
history -d 编号 - 以后输密码不要直接写在命令里,用交互式输入:
mysql -uroot -p,然后回车再输密码
坑4:多开几个终端,历史命令对不上
开了多个 SSH 窗口,在这个窗口执行的命令,另一个窗口 history 里看不到。
原因: 每个终端会话有自己的内存历史,退出时才写入文件。
解决: 这是正常现象,不用纠结。
总结
| 命令 | 作用 |
|---|---|
history |
查看历史命令 |
history 10 |
只看最近 10 条 |
!101 |
执行第 101 条历史命令 |
!! |
执行上一条命令 |
!yum |
执行最近一条 yum 开头的命令 |
history \| grep nginx |
搜索包含 nginx 的历史命令 |
history -c |
清空当前会话历史 |
Ctrl + R |
搜索历史命令 |
日常用得最多的就是 Ctrl + R 搜索 和 history | grep,效率很高。
遇到问题加QQ23979811 协助处理
Linux 压缩命令大全 Linux
Linux 常用压缩命令大全
Linux 下压缩解压命令很多,记不住每次都要搜,整理一份常用清单。
1. tar 命令(最常用)
tar 是 Linux 最常用的打包工具,可以配合不同压缩格式。
打包不压缩:
# 打包
tar -cvf blog.tar /www/wwwroot/blog/
# 解包
tar -xvf blog.tar
参数说明:
- -c:创建打包文件
- -x:解包
- -v:显示过程
- -f:指定文件名
2. tar.gz 格式(最常用)
# 压缩
tar -zcvf blog.tar.gz /www/wwwroot/blog/
# 解压
tar -zxvf blog.tar.gz
# 解压到指定目录
tar -zxvf blog.tar.gz -C /data/backup/
-z 就是用 gzip 压缩,这是最常用的格式。
3. tar.bz2 格式(压缩率更高)
# 压缩(体积更小,但更慢)
tar -jcvf blog.tar.bz2 /www/wwwroot/blog/
# 解压
tar -jxvf blog.tar.bz2
4. zip 格式
# 压缩
zip -r blog.zip /www/wwwroot/blog/
# 解压
unzip blog.zip
# 解压到指定目录
unzip blog.zip -d /data/backup/
Windows 用户常用 zip 格式,跨平台方便。
5. gz 格式
# 压缩(单个文件)
gzip file.log
# 解压
gunzip file.log.gz
gzip 只能压单个文件,一般和 tar 配合用。
6. 查看压缩包内容
# 查看 tar 包内容
tar -tvf blog.tar
# 查看 tar.gz 包内容
tar -ztvf blog.tar.gz
# 查看 zip 包内容
unzip -l blog.zip
7. 常用场景示例
备份网站文件:
tar -zcvf backup_$(date +%Y%m%d).tar.gz /www/wwwroot/blog/
备份数据库:
mysqldump -u root -p123456 blog | gzip > db_$(date +%Y%m%d).sql.gz
传输文件压缩:
tar -zcvf - /www/wwwroot/blog/ | ssh root@192.168.1.100 "tar -zxvf - -C /backup/"
8. 总结
| 格式 | 压缩率 | 速度 | 命令 |
|---|---|---|---|
| tar.gz | 中 | 快 | tar -z |
| tar.bz2 | 高 | 慢 | tar -j |
| zip | 中 | 中 | zip/unzip |
| tar | 无 | 最快 | tar |
日常用 tar.gz 就够了,跨平台用 zip,追求小体积用 bz2。
Linux怎么查看当前在线用户,踢出用户命令 Linux
前言
服务器是多人用的,有时候需要看看谁在线上,或者把某个挂机的用户踢下线。Linux 自带了几个命令可以查看当前在线用户,本文就讲一下怎么用。
查看在线用户
who 命令
最简单的命令,直接看谁在线:
who
输出类似:
root pts/0 2026-10-06 09:00 (192.168.1.100)
zhangsan pts/1 2026-10-06 09:15 (192.168.1.101)
lisi pts/2 2026-10-06 09:20 (192.168.1.102)
每一列分别是:用户名、终端、登录时间、来源 IP。
w 命令
比 who 更详细,还能看到用户在干嘛:
w
输出类似:
09:30:00 up 2:15, 3 users, load average: 0.00, 0.01, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 192.168.1.100 09:00 5.00s 0.03s 0.01s w
zhangsan pts/1 192.168.1.101 09:15 15.00s 0.02s 0.00s bash
lisi pts/2 192.168.1.102 09:20 1:30 0.01s 0.01s top
多了几列:
LOGIN@:登录时间IDLE:空闲时间JCPU:该终端所有进程用的 CPU 时间PCPU:当前进程用的 CPU 时间WHAT:当前在跑什么命令
users 命令
只看用户名,重复的就重复显示:
users
输出:
root zhangsan lisi
last 命令
看历史登录记录:
last
会列出最近登录过的用户,包括用户名、终端、来源 IP、登录时间、退出时间、总共在线多久。
踢出用户
pkill 踢出某个用户
比如把 zhangsan 踢下线:
pkill -u zhangsan
这会杀掉 zhangsan 的所有进程,直接把他踢下线。
杀掉某个终端
先看 who,找到要踢的人的终端,比如 pts/1:
who
然后杀掉这个终端:
pkill -t pts/1
或者:
kill -9 $(ps -t pts/1 -o pid=)
踢所有非 root 用户
警告!这会把其他所有登录的人都踢掉:
pkill -u -root
常见坑
坑1:把自己踢下线了
执行 pkill 的时候把自己的终端也杀掉了,SSH 直接断开。
解决: 踢人的时候确认一下自己的终端,别把自己踢了:
who am i
先看自己是哪个终端,然后踢别人的时候避开自己的终端。
坑2:踢了用户但他又登回来了
踢了之后用户马上又登上来了,没用。
解决: 如果是恶意用户,直接改密码或者封 IP:
# 改密码
passwd 用户名
# 封 IP
firewall-cmd --permanent --add-rich-rule="rule family='ipv4' source address='192.168.1.101' reject"
firewall-cmd --reload
坑3:看不到图形界面登录的用户
who 只看终端登录的,图形界面登录的可能看不到。
解决: 用 last 看历史记录,或者看 /var/log/auth.log(CentOS 是 /var/log/secure)。
总结
查看在线用户的常用命令:
| 命令 | 作用 |
|---|---|
who |
看谁在线 |
w |
看谁在线 + 在干嘛 |
users |
只看用户名 |
last |
看历史登录记录 |
pkill -u 用户名 |
踢出某个用户 |
pkill -t pts/1 |
杀掉某个终端 |
日常运维用 w 就够了,信息最全。
遇到问题加QQ23979811 协助处理
Linux服务管理,systemctl常用命令汇总 Linux
前言
CentOS7 装完软件,怎么启动?怎么开机自启?服务挂了怎么查日志?这些都需要用到 systemctl 命令。CentOS7 开始用 systemd 代替了原来的 service 命令,systemctl 就是 systemd 的管理工具。本文就把 systemctl 常用命令汇总一下,日常管理服务够用了。
启动和停止服务
启动服务
systemctl start nginx
停止服务
systemctl stop nginx
重启服务
systemctl restart nginx
重新加载配置
systemctl reload nginx
注意: reload 和 restart 的区别:
reload:不重启进程,重新加载配置,不中断服务restart:重启进程,会短暂中断服务
查看服务状态
查看服务状态
systemctl status nginx
输出会显示服务是不是在运行、PID、内存占用、最近的日志等。
查看服务是不是在运行
systemctl is-active nginx
输出 active 就是在运行,inactive 就是没运行。
查看服务是不是开机自启
systemctl is-enabled nginx
输出 enabled 就是开机自启,disabled 就是不自启。
开机自启管理
设置开机自启
systemctl enable nginx
取消开机自启
systemctl disable nginx
同时启动并设置开机自启
systemctl enable --now nginx
一条命令搞定,不用分两步。
查看日志
查看服务日志
journalctl -u nginx
实时跟踪日志
journalctl -u nginx -f
和 tail -f 类似,实时滚动显示日志。
查看最近100行日志
journalctl -u nginx -n 100
查看今天的日志
journalctl -u nginx --since today
查看指定时间的日志
journalctl -u nginx --since "2026-10-05 10:00:00" --until "2026-10-05 11:00:00"
查看所有服务
列出所有正在运行的服务
systemctl list-units --type=service
列出所有服务(包括没运行的)
systemctl list-unit-files --type=service
按状态过滤
systemctl list-units --type=service --state=running
常用服务管理示例
启动 Nginx 并设置开机自启
systemctl start nginx
systemctl enable nginx
或者一条命令:
systemctl enable --now nginx
重启 Nginx
systemctl restart nginx
查看 Nginx 状态
systemctl status nginx
查看 Nginx 日志
journalctl -u nginx -f
常见坑
坑1:还在用 service 命令
CentOS6 用 service nginx start,CentOS7 开始用 systemctl start nginx。老命令还能用,但新系统推荐用 systemctl。
坑2:改了配置不生效
改了 Nginx 配置,忘了 reload,结果配置没生效。
解决: 改完配置记得 reload:
systemctl reload nginx
坑3:服务启动失败不知道为啥
服务启动失败,只看状态不知道具体原因。
解决: 看日志:
journalctl -u nginx
坑4:重启服务器后服务没自启
装完软件启动了,但没设置开机自启,重启之后服务就没了。
解决: 装完软件记得设置开机自启:
systemctl enable nginx
总结
systemctl 常用命令:
| 命令 | 作用 |
|---|---|
systemctl start 服务名 |
启动服务 |
systemctl stop 服务名 |
停止服务 |
systemctl restart 服务名 |
重启服务 |
systemctl reload 服务名 |
重新加载配置 |
systemctl status 服务名 |
查看服务状态 |
systemctl enable 服务名 |
设置开机自启 |
systemctl disable 服务名 |
取消开机自启 |
systemctl is-active 服务名 |
查看是否在运行 |
systemctl is-enabled 服务名 |
查看是否开机自启 |
journalctl -u 服务名 -f |
实时查看日志 |
记住这几个,CentOS7+ 日常管理服务就够用了。
遇到问题加QQ23979811 协助处理
Linux软件包管理,yum常用命令汇总 Linux
前言
CentOS 装软件怎么装?装完怎么卸?找不到某个软件包名怎么办?这些都需要用到 yum 命令。yum 是 CentOS/RHEL 系统的软件包管理器,自动解决依赖关系,比 rpm 好用多了。本文就把 yum 常用命令汇总一下,装软件、卸软件、查软件都能用。
安装软件
安装软件包
yum install nginx -y
-y 表示自动确认,不用手动输 y。
安装多个软件包
yum install nginx mysql php -y
重新安装
yum reinstall nginx -y
软件装坏了想重装,用这个。
卸载软件
卸载软件包
yum remove nginx -y
卸载并删除依赖
yum autoremove nginx -y
把安装 nginx 时自动装上的依赖也一起删掉。
更新软件
更新所有软件
yum update -y
注意: 这个会把所有软件都更新一遍,包括内核。生产环境慎用,可能会把系统搞挂。
更新某个软件
yum update nginx -y
只更新 nginx。
检查哪些软件可以更新
yum check-update
查找软件
搜索软件包
yum search nginx
模糊搜索,输出所有名字或描述里包含 nginx 的包。
查找文件属于哪个包
yum provides /usr/sbin/nginx
你知道某个文件路径,但不知道是哪个包装的,用这个查。
查看软件包信息
yum info nginx
输出软件包的详细信息:版本、大小、描述等。
查看已安装软件
列出所有已安装的包
yum list installed
太多了可以配合 grep:
yum list installed | grep nginx
查看某个软件装没装
yum list installed nginx
仓库管理
查看已启用的仓库
yum repolist
查看所有仓库(包括禁用的)
yum repolist all
清理缓存
yum clean all
yum 下载的包会缓存下来,占磁盘空间。定期清理一下。
重建缓存
yum makecache
常用场景
场景1:装 Nginx
yum install nginx -y
systemctl start nginx
systemctl enable nginx
场景2:不知道软件包名
想装个下载工具,但不知道叫什么。
yum search wget
或者:
yum search curl
场景3:某个命令找不到
输入 ifconfig 提示 command not found,不知道是哪个包装的。
yum provides ifconfig
会告诉你是 net-tools 包提供的,装一下:
yum install net-tools -y
场景4:软件版本太旧
CentOS7 自带的软件版本都比较老,比如 Nginx 是 1.20。想用新版本,需要加第三方源。
装 EPEL 源:
yum install epel-release -y
装完 EPEL 源之后,就能装更多软件包了。
常见坑
坑1:yum install 不加 -y
不加 -y 的话,安装到一半会停下来问你 Is this ok [y/d/N],自动化脚本里很容易卡在这里。
解决: 命令后面加 -y:
yum install nginx -y
坑2:yum update 把系统搞挂了
生产环境跑了 yum update -y,结果内核更新了,重启之后服务起不来。
解决: 生产环境不要随便 yum update,要更新就单独更新某个软件:
yum update nginx -y
坑3:找不到软件包
用默认源搜不到某个软件,比如 Docker、Node.js 这些。
解决: 加第三方源,比如 EPEL:
yum install epel-release -y
坑4:yum 缓存满了
yum 缓存的包占了很多磁盘空间。
解决: 定期清理:
yum clean all
总结
yum 常用命令:
| 命令 | 作用 |
|---|---|
yum install 包名 -y |
安装软件 |
yum remove 包名 -y |
卸载软件 |
yum update 包名 -y |
更新软件 |
yum search 关键词 |
搜索软件 |
yum provides 文件路径 |
查文件属于哪个包 |
yum info 包名 |
查看软件包信息 |
yum list installed |
列出已安装的包 |
yum repolist |
查看仓库列表 |
yum clean all |
清理缓存 |
记住这几个,CentOS 日常装软件就够用了。
遇到问题加QQ23979811 协助处理
Linux文件权限详解,chmod和chown命令使用 Linux
前言
Nginx 报 403 Forbidden?文件改完了不生效?权限不对导致各种奇怪问题?Linux 的文件权限是新手最容易搞混的地方。什么是 rwx?755 和 644 有什么区别?chown 和 chmod 分别是干嘛的?本文就把 Linux 文件权限讲明白,让你一看就懂。
查看文件权限
用 ls -l 查看文件详细信息:
ls -l /var/www/html/index.html
输出示例:
-rw-r--r-- 1 nginx nginx 1234 Oct 5 10:30 /var/www/html/index.html
权限字符串详解
最开头的 -rw-r--r-- 就是权限,拆解一下:
- rw- r-- r--
① ② ③ ④
- ① 文件类型:
-是普通文件,d是目录,l是链接 - ② 所有者权限(user):
rw-= 可读可写,不可执行 - ③ 所属组权限(group):
r--= 只读 - ④ 其他人权限(other):
r--= 只读
rwx 含义
| 字符 | 含义 | 数字 |
|---|---|---|
r |
读(read) | 4 |
w |
写(write) | 2 |
x |
执行(execute) | 1 |
所以:
rwx= 4+2+1 = 7rw-= 4+2+0 = 6r--= 4+0+0 = 4r-x= 4+0+1 = 5
常用权限数字
| 数字 | 权限 | 说明 |
|---|---|---|
| 755 | rwxr-xr-x | 所有者可读写执行,其他人可读执行(常用目录、脚本) |
| 644 | rw-r--r-- | 所有者可读写,其他人只读(常用文件) |
| 700 | rwx------ | 只有所有者能读写执行(私密文件) |
| 600 | rw------- | 只有所有者能读写(私密文件) |
| 777 | rwxrwxrwx | 所有人都能读写执行(不安全,尽量别用) |
记住两个最常用的:
- 目录用
755 - 文件用
644
chmod 修改权限
数字方式
chmod 755 /var/www/html
把目录权限改成 755。
chmod 644 /var/www/html/index.html
把文件权限改成 644。
递归修改
chmod -R 755 /var/www/html/
把目录下所有文件和子目录都改成 755。
注意: 递归修改的时候要小心,一般文件应该是 644,目录是 755。如果全部改成 755,文件就能执行了,不安全。
字母方式
chmod u+x script.sh
给所有者加执行权限。
chmod g+w file.txt
给所属组加写权限。
chmod o-r file.txt
去掉其他人的读权限。
u:所有者g:所属组o:其他人+:加权限-:减权限
chown 修改所有者
修改文件所有者
chown nginx /var/www/html/index.html
把文件所有者改成 nginx。
修改所有者和所属组
chown nginx:nginx /var/www/html/index.html
所有者改成 nginx,所属组也改成 nginx。
递归修改
chown -R nginx:nginx /var/www/html/
把整个目录的所有者和所属组都改成 nginx。
实际应用场景
场景1:Nginx 报 403
Nginx 访问网站报 403 Forbidden,一般是权限不对。
ls -l /var/www/html/index.html
看所有者和权限。如果文件是 root 的,Nginx 进程读不到,就会 403。
chown nginx:nginx /var/www/html/index.html
chmod 644 /var/www/html/index.html
场景2:脚本不能执行
写了个 shell 脚本,运行提示 Permission denied。
chmod +x script.sh
加执行权限就能跑了。
场景3:目录权限不对
网站目录权限不对,上传的图片打不开。
chmod -R 755 /var/www/html/
chown -R nginx:nginx /var/www/html/
常见坑
坑1:chmod 777 解决一切
很多人一遇到权限问题就 chmod 777,这是最懒也最不安全的做法。777 意味着所有人都能读写执行,黑客上传个木马就直接跑了。
正确做法: 文件用 644,目录用 755,所有者设成运行服务的用户。
坑2:只改权限不改所有者
权限对了,但所有者不对,服务还是读不到文件。
解决: 权限和所有者都要对。比如 Nginx 运行用户是 nginx,文件所有者也要是 nginx。
坑3:递归 chmod 把文件也改成 755
chmod -R 755 把所有文件都改成可执行了,不安全。
正确做法: 目录用 755,文件用 644。可以用 find 分开改:
find /var/www/html -type d -exec chmod 755 {} \;
find /var/www/html -type f -exec chmod 644 {} \;
坑4:改了权限不生效
改了权限但还是不对,看看是不是有 SELinux 在捣乱。
解决: 先临时关掉 SELinux 测试:
setenforce 0
如果关了就好了,说明是 SELinux 的问题。
总结
Linux 文件权限核心:
- rwx = 4+2+1
- 目录用 755,文件用 644
- chmod 改权限,chown 改所有者
- 不要随便用 777
记住两个最常用的:目录 755,文件 644。遇到权限问题先 ls -l 看看,再改,别上来就 777。
遇到问题加QQ23979811 协助处理
Linux用户和组管理,useradd和groupadd命令使用 Linux
前言
服务器上需要给开发人员开个账号?或者给不同的人分配不同的权限?这就需要用到 Linux 的用户和组管理。Linux 是多用户系统,每个用户有自己的家目录和权限。学会用户和组管理,是运维的基本功。本文就讲一下怎么创建、删除、修改用户和组。
创建用户
基本创建
useradd testuser
这样就创建了一个叫 testuser 的用户。默认会:
- 创建一个同名的组
- 创建家目录
/home/testuser - 指定 shell 为
/bin/bash
设置密码
passwd testuser
输入两次密码就好了。注意: 新建的用户默认是不能登录的,必须设密码才能登录。
创建用户时指定参数
useradd -m -s /bin/bash -G wheel testuser
参数说明:
-m:自动创建家目录-s /bin/bash:指定默认 shell-G wheel:把用户加入 wheel 组(可以用 sudo)
查看用户信息
id testuser
输出用户的 UID、GID、所属组。
cat /etc/passwd
查看所有用户。
删除用户
userdel testuser
这样只删用户,不删家目录。
如果要连家目录一起删:
userdel -r testuser
注意: -r 会把用户的家目录和邮件都删掉,小心操作。
修改用户
修改用户名
usermod -n newname oldname
修改用户的家目录
usermod -d /home/newhome testuser
把用户加入某个组
usermod -aG wheel testuser
-aG 表示追加到组,不要只用 -G,不然会把原来的组都覆盖掉。
锁定用户
usermod -L testuser
锁定后用户不能登录。
解锁用户
usermod -U testuser
组管理
创建组
groupadd developers
删除组
groupdel developers
查看用户属于哪些组
groups testuser
把用户加入组
usermod -aG developers testuser
从组里删除用户
gpasswd -d testuser developers
sudo 权限
把用户加入 wheel 组(CentOS 默认支持 sudo 的组)
usermod -aG wheel testuser
这样 testuser 就可以用 sudo 执行 root 命令了。
编辑 sudoers 文件
visudo
在文件里添加:
testuser ALL=(ALL) ALL
这样 testuser 也有 sudo 权限。
注意: 一定要用 visudo 编辑,不要直接改 /etc/sudoers,改坏了 sudo 就用不了了。
查看登录历史
谁在线
w
历史登录记录
last
谁在执行 sudo
lastcomm
实际应用场景
场景1:给开发人员开账号
useradd -m -s /bin/bash dev01
passwd dev01
usermod -aG developers dev01
场景2:给运维开 sudo 权限
useradd -m -s /bin/bash ops01
passwd ops01
usermod -aG wheel ops01
场景3:删除离职员工账号
userdel -r olduser
常见坑
坑1:userdel 没加 -r,家目录还在
只删了用户,家目录 /home/testuser 还在,占着磁盘空间。
解决: 删用户的时候加 -r:
userdel -r testuser
坑2:usermod -G 把原来的组覆盖了
用 -G 而不是 -aG,结果用户原来的组都没了,只剩新的组。
解决: 追加组用 -aG:
usermod -aG developers testuser
坑3:新建用户不能登录
创建了用户,但没设密码,结果不能登录。
解决: 创建完用户一定要设密码:
passwd testuser
坑4:visudo 改错了
直接用 vi 改 /etc/sudoers,改错了导致 sudo 用不了。
解决: 一定要用 visudo 命令编辑,它会检查语法。
总结
用户和组管理的核心命令:
- useradd:创建用户
- passwd:设置密码
- userdel -r:删除用户(连家目录)
- usermod -aG:把用户加入组
- groupadd:创建组
- groups:查看用户属于哪些组
- visudo:编辑 sudo 权限
用户管理是 Linux 安全的基础,每个用户用自己的账号,不要所有人都用 root。
遇到问题加QQ23979811 协助处理
Linux查看和修改系统时间,date和timedatectl命令 Linux
前言
服务器时间不对?日志时间戳对不上?定时任务不准?这些问题都和系统时间有关。Linux 服务器的时间很重要,日志、定时任务、证书过期时间都依赖系统时间。时间不准会出各种奇怪的问题。本文就讲一下怎么查看和修改 Linux 系统时间,以及怎么设置时区。
查看系统时间
方法一:date 命令
date
输出示例:
Mon Oct 5 10:30:45 CST 2026
CST 就是中国标准时间(China Standard Time)。
方法二:timedatectl 命令(推荐)
timedatectl
输出示例:
Local time: Mon 2026-10-05 10:30:45 CST
Universal time: Mon 2026-10-05 02:30:45 UTC
RTC time: Mon 2026-10-05 02:30:46
Time zone: Asia/Shanghai (CST, +0800)
System clock synchronized: yes
NTP service: active
RTC in local TZ: no
这个命令显示的信息更全:本地时间、UTC时间、硬件时间、时区、是否同步、NTP服务状态。
设置时区
查看当前时区
timedatectl
看 Time zone 那行。
查看所有可用时区
timedatectl list-timezones
或者:
ls /usr/share/zoneinfo/
设置时区为上海
timedatectl set-timezone Asia/Shanghai
这是最常用的,国内服务器一般都设成这个。
验证
timedatectl
看 Time zone 那行是不是变成了 Asia/Shanghai。
手动设置时间
不推荐手动设置
一般情况下,时间不准了应该用 NTP 自动同步,不要手动设。手动设的时间过一段时间又会不准。
但如果确实需要手动设:
设置日期和时间
date -s "2026-10-05 10:30:45"
只设置时间
date -s "10:30:45"
只设置日期
date -s "2026-10-05"
NTP 时间同步
安装 NTP 服务
CentOS7 用 chronyd:
yum install chrony -y
启动并设置开机自启
systemctl start chronyd
systemctl enable chronyd
查看同步状态
timedatectl
看 System clock synchronized: yes 就是同步成功了。
手动同步一次
chronyc makestep
常见时间格式
date 命令可以格式化输出:
输出年月日
date +%Y-%m-%d
输出:
2026-10-05
输出时分秒
date +%H:%M:%S
输出完整日期时间
date +"%Y-%m-%d %H:%M:%S"
时间戳
date +%s
输出 Unix 时间戳(秒数)。
从时间戳转换
date -d @1728100000
实际应用场景
场景1:日志时间不对
看日志发现时间戳不对,先查系统时间:
date
如果时间不对,改时区:
timedatectl set-timezone Asia/Shanghai
场景2:定时任务不准
crontab 定时任务执行时间不对,先看系统时间:
date
时间不对就同步 NTP。
场景3:证书过期时间不对
SSL 证书过期时间对不上,也是系统时间的问题。
场景4:脚本里用到时间戳
写脚本的时候需要获取当前时间戳:
now=$(date +%s)
常见坑
坑1:时区不对导致日志时间差8小时
服务器装完默认是 UTC 时区,比北京时间晚8小时。
解决: 设置成上海时区:
timedatectl set-timezone Asia/Shanghai
坑2:改了时间但硬件时间没同步
手动改了系统时间,重启之后又变回去了,因为硬件时间(RTC)没改。
解决: 用 NTP 同步就不用管这个,NTP 会自动同步硬件时间。
坑3:NTP 服务没启动
装了 NTP 但没启动,时间还是不同步。
解决:
systemctl start chronyd
systemctl enable chronyd
坑4:手动设时间后过一会儿又不准了
手动设的时间不准,因为系统时钟会漂移。
解决: 用 NTP 自动同步,不要手动设。
总结
查看和修改系统时间的核心命令:
- date:快速看当前时间
- timedatectl:看完整时间信息(时区、NTP同步状态)
- timedatectl set-timezone Asia/Shanghai:设置时区
- chronyd:NTP时间同步服务
服务器时间一定要准,用 NTP 自动同步,不要手动设。国内服务器时区设成 Asia/Shanghai。
遇到问题加QQ23979811 协助处理
Linux添加Swap交换分区,解决内存不足问题 Linux
前言
服务器内存不够用了?MySQL 启动就报内存不足?或者运行着运行着就被 OOM Killer 杀进程了?这时候除了加内存条,还有个应急办法——加 Swap 交换分区。Swap 就是把磁盘的一部分当内存用,虽然慢,但能救急。本文就讲一下怎么在 Linux 下添加 Swap 交换分区。
什么是 Swap
Swap 交换分区,就是把磁盘的一部分空间当作内存来用。当物理内存不够的时候,系统会把不常用的内存数据换到磁盘上,腾出物理内存给正在用的进程。
注意: Swap 只是应急方案,不能当内存用。磁盘比内存慢几百倍,如果频繁使用 Swap,系统会非常卡。
第一步:查看当前 Swap 情况
先看看现在有没有 Swap,多大:
free -h
输出示例:
total used free shared buff/cache available
Mem: 1.8Gi 1.2Gi 200Mi 50Mi 400Mi 300Mi
Swap: 0B 0B 0B
上面的例子里 Swap 是 0B,说明没有配置 Swap。
也可以看:
swapon -s
第二步:创建 Swap 文件
我们用文件的方式创建 Swap,比分区方式灵活,随时可以删。
1. 创建一个 2G 的 Swap 文件
dd if=/dev/zero of=/swapfile bs=1M count=2048
参数说明:
if=/dev/zero:输入源,零设备of=/swapfile:输出文件bs=1M:块大小1Mcount=2048:2048块,也就是2G
2. 设置文件权限
chmod 600 /swapfile
必须设置成 600,不然系统不认。
3. 格式化成 Swap
mkswap /swapfile
输出会显示:
Setting up swapspace version 1, size = 2097151 KiB
no label, UUID=xxxx-xxxx
第三步:启用 Swap
swapon /swapfile
查看是否启用成功:
free -h
现在应该能看到 Swap 那行有数值了。
第四步:配置开机自动挂载
写入 /etc/fstab,重启后自动启用。
vi /etc/fstab
在最后一行添加:
/swapfile swap swap defaults 0 0
第五步:调整 Swap 使用优先级
Linux 默认是尽量用物理内存,Swap 只用在内存不够的时候。这个策略一般不用改。
如果想调整 Swap 的使用倾向,可以改 /etc/sysctl.conf:
vm.swappiness = 10
swappiness 值范围是 0~100:
0:尽量不用 Swap100:积极使用 Swap10:推荐值,内存不够才用 Swap
改完执行:
sysctl -p
常见操作
查看 Swap 使用情况
swapon -s
关闭 Swap
swapoff /swapfile
删除 Swap
swapoff /swapfile
rm /swapfile
然后把 /etc/fstab 里那行也删掉。
实际应用场景
场景1:MySQL 启动报内存不足
MySQL 启动的时候需要加载很多数据到内存,如果内存不够会直接启动失败。加个 Swap 就能启动了。
场景2:临时跑大任务
有时候要临时跑个大任务,内存不够,加个 Swap 救急。
场景3:防止 OOM Killer 杀进程
内存不够的时候,系统会用 OOM Killer 杀掉占内存最多的进程。加个 Swap 能缓冲一下,避免直接被杀。
常见坑
坑1:Swap 文件权限不对
创建完 Swap 文件之后忘了 chmod 600,结果 swapon 报错。
解决: 一定要先设置权限:
chmod 600 /swapfile
坑2:/etc/fstab 写错了
和挂载硬盘一样,/etc/fstab 写错了重启会进不去系统。
解决: 改完先执行 swapon -a 测试一下。
坑3:Swap 太大了影响性能
Swap 不是越大越好。如果 Swap 用得很频繁,系统会非常卡,因为磁盘比内存慢几百倍。
建议: Swap 大小设成物理内存的 0.5~2 倍就够了。比如 2G 内存,Swap 设 2~4G 就行。
坑4:SSD 上放 Swap 还好,机械硬盘上放 Swap 很卡
如果是机械硬盘,频繁读写 Swap 会非常卡。SSD 还好一点。
总结
添加 Swap 的完整流程:
- dd 创建 Swap 文件
- chmod 600 设置权限
- mkswap 格式化
- swapon 启用
- 写 /etc/fstab 开机自动挂载
- 调整 swappiness 优先级
Swap 只是应急方案,真正解决内存不足还是要加物理内存。但应急的时候,Swap 确实能救一命。
遇到问题加QQ23979811 协助处理
Linux添加新硬盘并挂载,fdisk和mkfs分区格式化 Linux
前言
服务器磁盘满了,加了一块新硬盘,但不知道怎么用?新硬盘插上去之后,Linux 是不能直接用的,需要先分区、格式化、挂载,最后还要配置开机自动挂载。整个流程看起来复杂,其实就几步。本文就以 CentOS7 为例,完整讲一下新硬盘从插入到挂载的全过程。
第一步:查看新硬盘有没有识别到
加完硬盘之后,先看看系统有没有识别到。
fdisk -l
输出会列出所有磁盘设备。一般系统盘是 /dev/sda,新硬盘就是 /dev/sdb、/dev/sdc 这样。
找到新硬盘,大小和你加的硬盘一致的那个就是。比如新硬盘是100G,找大小100G的那个设备。
注意: 千万别搞错设备名!格式化错了盘,数据就全没了。一定要确认大小对得上。
第二步:给新硬盘分区
用 fdisk 命令给新硬盘分区。这里我们分一个主分区,用完全部空间。
fdisk /dev/sdb
进入 fdisk 交互界面,按以下步骤操作:
1. 输入 n 创建新分区
Command (m for help): n
2. 选择主分区
Select (default p): p
3. 分区号选默认1
Partition number (1-4, default 1): 1
4. 起始扇区选默认
直接回车:
First sector (2048-209715199, default 2048): 回车
5. 结束扇区选默认(用完全部空间)
直接回车:
Last sector, +sectors or +size{K,M,G} (2048-209715199, default 209715199): 回车
6. 输入 w 保存退出
Command (m for help): w
这样就分好区了,分区设备是 /dev/sdb1。
第三步:格式化分区
分完区之后,需要格式化成文件系统。一般用 ext4 或 xfs。
CentOS7 默认用 xfs:
mkfs.xfs /dev/sdb1
如果要用 ext4:
mkfs.ext4 /dev/sdb1
等待格式化完成,一般很快,几十秒就好。
第四步:创建挂载目录
先创建一个目录用来挂载新硬盘:
mkdir /data
第五步:挂载分区
把分区挂载到刚才创建的目录:
mount /dev/sdb1 /data
查看挂载结果:
df -h
输出里应该能看到 /dev/sdb1 挂载在 /data 目录。
第六步:配置开机自动挂载
上面的挂载重启之后就没了,需要写入 /etc/fstab 才能开机自动挂载。
1. 查看分区的 UUID
blkid /dev/sdb1
输出示例:
/dev/sdb1: UUID="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" TYPE="xfs"
复制这个 UUID。
2. 编辑 /etc/fstab
vi /etc/fstab
在最后一行添加:
UUID=刚才复制的UUID /data xfs defaults 0 0
各字段含义:
- 第一列:设备UUID
- 第二列:挂载点
- 第三列:文件系统类型(xfs 或 ext4)
- 第四列:挂载参数(defaults 就够了)
- 第五列:dump备份标记(0表示不备份)
- 第六列:开机检查顺序(0表示不检查)
3. 测试配置是否正确
mount -a
如果没有报错,说明配置正确。如果报错了,千万别重启!重启可能进不去系统。
常见坑
坑1:格式化错了盘
这是最危险的坑!格式化错了盘,数据就全没了。
解决: 格式化之前一定要确认设备名是对的,用 fdisk -l 看大小,确认大小和你加的新硬盘一致再操作。
坑2:/etc/fstab 写错了,重启进不去系统
如果 /etc/fstab 写错了,重启的时候会卡在挂载界面,进不去系统。
解决: 改完 /etc/fstab 之后一定要先跑 mount -a 测试,确认没报错再重启。
坑3:挂载目录里有文件
如果挂载目录里已经有文件了,挂载之后原来的文件就看不到了(不是删了,是被覆盖了)。
解决: 挂载之前确认挂载目录是空的,或者先把原来的文件移走。
坑4:用设备名写 fstab,重启后变了
如果用 /dev/sdb1 写 fstab,下次重启之后硬盘顺序变了,可能就挂载错了。
解决: 用 UUID 写 fstab,UUID 是唯一的,不会变。
总结
新硬盘挂载的完整流程:
- fdisk -l:确认新硬盘设备名
- fdisk /dev/sdb:分区
- mkfs.xfs /dev/sdb1:格式化
- mkdir /data:创建挂载目录
- mount /dev/sdb1 /data:临时挂载
- blkid 查UUID:获取UUID
- 写 /etc/fstab:配置开机自动挂载
- mount -a:测试配置
整个流程走一遍以后,加硬盘就是熟练活了。
遇到问题加QQ23979811 协助处理