Linux常用命令学习
目录
- Linux基础概述
1.1 什么是Linux?
1.2 Linux的优点 - 基本命令与文件操作
2.1 文件和目录管理
2.2 查看文件内容
2.3 文本编辑器
2.4 查找文件和内容 - 用户和权限管理
3.1 用户和组管理
3.2 文件权限 - 软件包管理
4.1 Debian/Ubuntu系统
4.2 Red Hat/CentOS系统 - 网络管理
5.1 查看网络配置
5.2 网络工具
5.3 SSH管理 - 进程管理
6.1 查看进程
6.2 管理进程 - Shell脚本与自动化
7.1 编写Shell脚本
7.2 使用Cron作业 - 日志管理
8.1 查看和管理日志文件
8.2 使用日志工具 - Docker与容器管理
9.1 安装Docker
9.2 基本Docker命令
9.3 管理容器和镜像 - 版本控制与Git
10.1 在Linux上使用Git
10.2 Git常用命令 - 安全管理
11.1 使用防火墙
11.2 安全更新与升级 - 环境变量与配置管理
12.1 设置环境变量
12.2 配置文件管理 - 性能监控与优化
13.1 使用性能监控工具
13.2 优化系统性能 - 文件传输与备份
14.1 使用rsync - 其他有用的工具
15.1 tmux与screen
15.2 SSH密钥管理 - 远程管理与部署
16.1 使用Ansible
16.2 部署应用 - 常见问题与解决方法
17.1 如何回滚到之前的状态?
17.2 如何撤销未提交的更改?
17.3 如何解决磁盘空间不足? - 总结
1. Linux基础概述
1.1 什么是Linux?
Linux是一种开源的类Unix操作系统内核,广泛应用于服务器、嵌入式系统、桌面计算机等各种设备。Linux以其稳定性、高效性和安全性著称,是后端开发和运维的首选操作系统之一。
关键特性:
- 开源:源代码公开,任何人都可以查看、修改和分发。
- 多用户、多任务:支持多个用户同时操作,并能同时运行多个任务。
- 高度可定制:用户可以根据需求定制内核和系统组件。
- 广泛支持:支持多种硬件架构和软件应用。
1.2 Linux的优点
- 稳定性高:适合长时间运行的服务器环境,崩溃和重启频率低。
- 安全性强:内置的权限管理和安全机制,减少潜在的安全威胁。
- 性能优越:高效的资源管理和调度,适合高负载应用。
- 社区支持:庞大的开源社区提供丰富的资源和支持。
- 成本低:免费使用和分发,减少企业成本。
2. 基本命令与文件操作
掌握基本的Linux命令是进行后端开发和运维的基础。以下内容涵盖文件和目录管理、查看文件内容、文本编辑器以及查找文件和内容等常用操作。
2.1 文件和目录管理
ls
:列出目录内容
基本用法:
ls
常用选项:
-l
:以长格式显示,包含权限、所有者、大小、修改时间等信息。-a
:显示所有文件,包括隐藏文件(以.
开头)。-h
:以人类可读的格式显示文件大小(如KB、MB)。
示例:
ls -lah
cd
:改变当前工作目录
基本用法:
cd <目录路径>
示例:
cd /var/www/html
返回上一级目录:
cd ..
返回主目录:
cd ~
cp
:复制文件或目录
基本用法:
cp <源文件> <目标文件>
复制目录:
cp -r <源目录> <目标目录>
示例:
cp app.py app_backup.py
cp -r src/ src_backup/
mv
:移动或重命名文件或目录
基本用法:
mv <源文件> <目标文件>
移动目录:
mv <源目录> <目标目录>
示例:
mv app.py /var/www/html/
mv old_name.py new_name.py
rm
:删除文件或目录
基本用法:
rm <文件>
删除目录:
rm -r <目录>
强制删除(不提示):
rm -rf <目录>
示例:
rm app_backup.py
rm -rf src_backup/
mkdir
和 rmdir
:创建和删除目录
创建目录:
mkdir <目录名>
创建多级目录:
mkdir -p /path/to/directory
删除空目录:
rmdir <目录名>
示例:
mkdir logs
mkdir -p /var/www/html/project
rmdir empty_directory
2.2 查看文件内容
cat
:连接并显示文件内容
基本用法:
cat <文件>
示例:
cat README.md
less
和 more
:分页查看文件内容
使用less
:
less <文件>
- 支持向前和向后浏览。
- 使用
q
退出。
使用more
:
more <文件>
- 仅支持向前浏览。
- 使用
q
退出。
示例:
less /var/log/syslog
more /var/log/syslog
head
和 tail
:查看文件的开头和结尾部分
查看文件开头的10行:
head <文件>
查看文件开头的指定行数:
head -n 20 <文件>
查看文件结尾的10行:
tail <文件>
查看文件结尾的指定行数:
tail -n 20 <文件>
实时查看文件新增内容(适用于日志文件):
tail -f <文件>
示例:
head -n 5 /etc/passwd
tail -f /var/log/nginx/access.log
2.3 文本编辑器
vim
:高级文本编辑器
基本用法:
vim <文件>
基本操作:
- 进入编辑模式:按
i
键。 - 保存并退出:按
Esc
键,然后输入:wq
并回车。 - 不保存退出:按
Esc
键,然后输入:q!
并回车。
示例:
vim app.py
nano
:简单易用的文本编辑器
基本用法:
nano <文件>
基本操作:
- 编辑文本:直接开始输入。
- 保存文件:按
Ctrl + O
,然后回车。 - 退出编辑器:按
Ctrl + X
。
示例:
nano README.md
2.4 查找文件和内容
find
:查找文件和目录
基本用法:
find <起始目录> -name <文件名>
按类型查找:
find <起始目录> -type <类型>
f
:文件d
:目录
按大小查找:
find <起始目录> -size +100M
示例:
find /var/www -name "*.log"
find . -type d -name "src"
find / -size +500M
grep
:在文件中搜索文本
基本用法:
grep "<搜索模式>" <文件>
常用选项:
-i
:忽略大小写。-r
:递归搜索目录。-n
:显示匹配行的行号。-v
:反向匹配,显示不匹配的行。-A
和-B
:显示匹配行前后指定行数的内容。
示例:
grep "ERROR" /var/log/syslog
grep -i "warning" *.log
grep -r "TODO" ./src
grep -n "main" app.py
locate
:快速查找文件
安装locate
(如果未安装):
sudo apt-get install mlocate # Debian/Ubuntu
sudo yum install mlocate # Red Hat/CentOS
更新数据库:
sudo updatedb
使用locate
查找文件:
locate <文件名>
示例:
locate app.py
注意:locate
依赖预先构建的文件数据库,可能不会立即反映最新的文件变化。
3. 用户和权限管理
在团队协作中,合理管理用户和权限至关重要,确保系统的安全性和资源的合理使用。
3.1 用户和组管理
添加新用户
命令:
sudo adduser <用户名>
示例:
sudo adduser john
修改用户信息
修改用户组:
sudo usermod -aG <组名> <用户名>
示例:
sudo usermod -aG sudo john
添加新组
命令:
sudo groupadd <组名>
示例:
sudo groupadd developers
删除用户
命令:
sudo deluser <用户名>
示例:
sudo deluser john
删除组
命令:
sudo groupdel <组名>
示例:
sudo groupdel developers
3.2 文件权限
查看文件权限
命令:
ls -l <文件>
示例:
ls -l app.py
输出示例:
-rw-r--r-- 1 john developers 2048 Apr 10 12:34 app.py
解释:
-rw-r--r--
:文件权限1
:硬链接数john
:所有者developers
:所属组2048
:文件大小(字节)Apr 10 12:34
:修改时间app.py
:文件名
修改文件权限
使用chmod
命令:
chmod <权限> <文件>
权限表示:
-
数字表示法(如
755
)7
:读、写、执行(4+2+1)5
:读、执行(4+1)0
:无权限
-
符号表示法(如
u+x
)
示例:
chmod 755 script.sh
chmod u+x script.sh
修改文件所有者和所属组
使用chown
命令:
sudo chown <所有者>:<所属组> <文件>
示例:
sudo chown john:developers app.py
仅修改所有者:
sudo chown john app.py
仅修改所属组:
sudo chown :developers app.py
修改目录及其内容的权限
使用-R
选项递归修改:
chmod -R <权限> <目录>
sudo chown -R <所有者>:<所属组> <目录>
示例:
chmod -R 755 /var/www/html
sudo chown -R john:developers /var/www/html
注意:递归修改权限和所有者时需谨慎,避免错误地更改系统关键目录的权限。
4. 软件包管理
在Linux系统中,软件包管理器用于安装、更新和删除软件包。不同的Linux发行版使用不同的包管理器。
4.1 Debian/Ubuntu系统
使用apt
和apt-get
更新软件包列表:
sudo apt update
升级已安装的软件包:
sudo apt upgrade
安装新软件包:
sudo apt install <软件包名>
卸载软件包:
sudo apt remove <软件包名>
示例:
sudo apt update
sudo apt upgrade
sudo apt install nginx
sudo apt remove apache2
清理未使用的包:
sudo apt autoremove
4.2 Red Hat/CentOS系统
使用yum
和dnf
更新软件包列表:
sudo yum check-update # CentOS 7及以前
sudo dnf check-update # CentOS 8及以后
升级已安装的软件包:
sudo yum update # CentOS 7及以前
sudo dnf upgrade # CentOS 8及以后
安装新软件包:
sudo yum install <软件包名> # CentOS 7及以前
sudo dnf install <软件包名> # CentOS 8及以后
卸载软件包:
sudo yum remove <软件包名> # CentOS 7及以前
sudo dnf remove <软件包名> # CentOS 8及以后
示例:
sudo yum check-update
sudo yum update
sudo yum install httpd
sudo yum remove nginx
清理未使用的包:
sudo yum autoremove # CentOS 7及以前
sudo dnf autoremove # CentOS 8及以后
5. 网络管理
网络管理是后端开发中不可或缺的一部分,包括查看网络配置、使用网络工具以及SSH管理等。
5.1 查看网络配置
ifconfig
和 ip
命令
使用ifconfig
(需要安装net-tools
):
ifconfig
使用ip
命令(推荐):
ip addr show
示例:
ip addr show eth0
查看路由表
使用route
命令(需要安装net-tools
):
route -n
使用ip
命令:
ip route show
示例:
ip route show
5.2 网络工具
ping
:测试网络连接
基本用法:
ping <主机名或IP>
示例:
ping google.com
ping 8.8.8.8
停止ping
:按Ctrl + C
netstat
和 ss
:查看网络连接
使用netstat
(需要安装net-tools
):
netstat -tuln
使用ss
命令(推荐):
ss -tuln
解释:
-t
:TCP连接-u
:UDP连接-l
:监听状态-n
:以数字形式显示端口
示例:
ss -tuln
traceroute
:追踪路由
安装traceroute
:
sudo apt install traceroute # Debian/Ubuntu
sudo yum install traceroute # Red Hat/CentOS
基本用法:
traceroute <主机名或IP>
示例:
traceroute github.com
curl
和 wget
:下载和测试HTTP请求
使用curl
:
curl <URL>
常用选项:
-I
:仅获取HTTP头部。-X
:指定HTTP方法(如GET
、POST
)。-d
:发送数据(用于POST
请求)。
示例:
curl -I https://www.google.com
curl -X POST -d "username=john&password=secret" https://example.com/login
使用wget
:
wget <URL>
常用选项:
-O <文件名>
:指定下载文件的名称。-c
:断点续传。
示例:
wget -O example.html https://www.example.com
wget -c https://www.example.com/largefile.zip
5.3 SSH管理
ssh
:远程登录
基本用法:
ssh <用户名>@<主机名或IP>
示例:
ssh john@192.168.1.100
使用特定端口:
ssh -p 2222 john@192.168.1.100
scp
:安全复制文件
基本用法:
scp <源文件> <用户名>@<主机名或IP>:<目标路径>
示例:
scp app.py john@192.168.1.100:/var/www/html/
scp -P 2222 app.py john@192.168.1.100:/var/www/html/
从远程复制到本地:
scp john@192.168.1.100:/var/www/html/app.py ./app.py
sftp
:安全文件传输
基本用法:
sftp <用户名>@<主机名或IP>
示例:
sftp john@192.168.1.100
常用命令:
ls
:列出远程目录内容。cd
:切换远程目录。get <文件>
:下载文件。put <文件>
:上传文件。exit
:退出SFTP会话。
示例:
sftp john@192.168.1.100
sftp> ls
sftp> get app.py
sftp> put config.yml
sftp> exit
6. 进程管理
管理系统进程是后端开发和运维的重要任务,涉及查看、监控和控制运行中的进程。
6.1 查看进程
ps
:显示当前进程
基本用法:
ps
常用选项:
-e
:显示所有进程。-f
:全格式显示,包括PPID、UID等信息。-u <用户>
:显示指定用户的进程。
示例:
ps -ef
ps -u john
top
和 htop
:实时监控进程
使用top
:
top
使用htop
(需要安装):
sudo apt install htop # Debian/Ubuntu
sudo yum install htop # Red Hat/CentOS
htop
特点:
top
:内置于大多数Linux发行版,显示实时的进程信息。htop
:更友好的界面,支持交互式操作,如杀死进程、排序等。
示例:
htop
6.2 管理进程
kill
:发送信号到进程
基本用法:
kill <PID>
发送特定信号:
kill -SIGTERM <PID> # 终止进程(默认信号)
kill -SIGKILL <PID> # 强制杀死进程
示例:
kill 12345
kill -9 12345
pkill
和 killall
:通过名称杀死进程
使用pkill
:
pkill <进程名>
示例:
pkill nginx
使用killall
:
killall <进程名>
示例:
killall httpd
nice
和 renice
:调整进程优先级
启动进程时设置优先级:
nice -n <优先级> <命令>
调整已运行进程的优先级:
renice <优先级> -p <PID>
示例:
nice -n 10 python script.py
renice -5 -p 12345
解释:
nice
的优先级范围通常是-20(最高优先级)到19(最低优先级)。- 正数表示降低优先级,负数表示提高优先级。
7. Shell脚本与自动化
Shell脚本是Linux系统中进行任务自动化的重要工具,通过编写脚本,可以简化重复性操作,提高效率。
7.1 编写Shell脚本
基本结构
#!/bin/bash
# 注释
echo "Hello, World!"
# 变量
NAME="John"
echo "Hello, $NAME!"
# 条件判断
if [ -f "app.py" ]; then
echo "app.py存在"
else
echo "app.py不存在"
fi
# 循环
for i in {1..5}
do
echo "循环第 $i 次"
done
# 函数
function greet() {
echo "Hello, $1!"
}
greet "Alice"
保存与执行
-
保存脚本:将脚本保存为
script.sh
。 -
赋予执行权限:
chmod +x script.sh
-
执行脚本:
./script.sh
7.2 使用Cron作业
cron
是Linux中用于定期执行任务的工具,适用于自动化备份、定时运行脚本等场景。
编辑Cron任务
使用crontab
命令编辑当前用户的Cron任务:
crontab -e
Cron任务格式
* * * * * /path/to/command
│ │ │ │ │
│ │ │ │ │
│ │ │ │ └───── 星期几 (0 - 7) (周日为0或7)
│ │ │ └──────── 月份 (1 - 12)
│ │ └──────────── 日 (1 - 31)
│ └──────────────── 小时 (0 - 23)
└──────────────────── 分钟 (0 - 59)
示例
每天凌晨2点运行备份脚本:
0 2 * * * /home/john/backup.sh
每5分钟检查系统状态:
*/5 * * * * /home/john/check_status.sh
解释:
0 2 * * *
:表示每天凌晨2点0分执行。*/5 * * * *
:表示每5分钟执行一次。
8. 日志管理
日志管理是后端开发和运维中的重要环节,帮助监控系统状态、排查问题和进行性能分析。
8.1 查看和管理日志文件
常见日志文件路径
- 系统日志:
/var/log/syslog
或/var/log/messages
:系统消息和错误日志。/var/log/auth.log
或/var/log/secure
:认证和授权相关日志。
- 应用日志:
/var/log/nginx/
:Nginx服务器日志。/var/log/apache2/
:Apache服务器日志。/var/log/mysql/
:MySQL数据库日志。
查看日志文件
使用tail
命令实时查看日志:
tail -f /var/log/nginx/access.log
使用less
命令浏览日志:
less /var/log/syslog
管理日志文件
清空日志文件:
sudo truncate -s 0 /var/log/nginx/access.log
轮转日志文件(使用logrotate
):
-
配置
logrotate
:
编辑/etc/logrotate.conf
或在/etc/logrotate.d/
中创建配置文件。示例:
/var/log/nginx/*.log { daily missingok rotate 14 compress delaycompress notifempty create 0640 www-data adm sharedscripts postrotate [ ! -f /var/run/nginx.pid ] || kill -USR1 `cat /var/run/nginx.pid` endscript }
-
手动执行
logrotate
:sudo logrotate -f /etc/logrotate.conf
解释:
logrotate
自动轮转、压缩和删除旧的日志文件,避免日志占用过多磁盘空间。
8.2 使用日志工具
grep
:过滤日志内容
基本用法:
grep "ERROR" /var/log/syslog
结合tail
实时过滤:
tail -f /var/log/nginx/error.log | grep "404"
awk
和 sed
:高级日志处理
使用awk
提取特定字段:
awk '{print $1, $2, $3}' /var/log/syslog
使用sed
替换文本:
sed 's/ERROR/警告/g' /var/log/syslog
使用日志分析工具
-
GoAccess:实时日志分析工具,适用于Web服务器日志。
sudo apt install goaccess goaccess /var/log/nginx/access.log -o report.html --log-format=COMBINED
-
ELK Stack(Elasticsearch, Logstash, Kibana):强大的日志收集和分析平台。
9. Docker与容器管理
容器化技术在后端开发中越来越普及,Docker是其中最流行的容器平台之一,帮助开发者构建、部署和运行应用程序。
9.1 安装Docker
Debian/Ubuntu系统
sudo apt update
sudo apt install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io
Red Hat/CentOS系统
sudo yum install -y yum-utils
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install docker-ce docker-ce-cli containerd.io
sudo systemctl start docker
sudo systemctl enable docker
9.2 基本Docker命令
查看Docker版本
docker --version
拉取镜像
docker pull <镜像名>
示例:
docker pull nginx:latest
查看本地镜像
docker images
运行容器
docker run -d --name <容器名> -p <主机端口>:<容器端口> <镜像名>
示例:
docker run -d --name my-nginx -p 80:80 nginx:latest
查看运行中的容器
docker ps
停止容器
docker stop <容器名或PID>
示例:
docker stop my-nginx
删除容器
docker rm <容器名或PID>
示例:
docker rm my-nginx
删除镜像
docker rmi <镜像名>
示例:
docker rmi nginx:latest
9.3 管理容器和镜像
查看容器日志
docker logs <容器名>
示例:
docker logs my-nginx
进入运行中的容器
docker exec -it <容器名> /bin/bash
示例:
docker exec -it my-nginx /bin/bash
列出所有容器(包括停止的容器)
docker ps -a
清理未使用的镜像和容器
docker system prune
注意:该命令会删除所有未使用的容器、网络、镜像等,请谨慎使用。
10. 版本控制与Git
Git是现代后端开发中不可或缺的版本控制工具,帮助团队成员协同开发、追踪代码变更和管理项目历史。
10.1 在Linux上使用Git
安装Git
Debian/Ubuntu系统:
sudo apt update
sudo apt install git
Red Hat/CentOS系统:
sudo yum install git
配置Git
设置全局用户名和邮箱:
git config --global user.name "John Doe"
git config --global user.email "john.doe@example.com"
查看配置:
git config --list
10.2 Git常用命令
初始化仓库
新建Git仓库:
git init
克隆远程仓库:
git clone <仓库URL>
基本操作
查看状态:
git status
添加更改到暂存区:
git add <文件名>
git add . # 添加所有更改
提交更改:
git commit -m "提交信息"
推送到远程仓库:
git push origin <分支名>
拉取远程更改:
git pull origin <分支名>
分支管理
创建新分支:
git branch <分支名>
切换分支:
git checkout <分支名>
# 或者使用
git switch <分支名>
合并分支:
git merge <分支名>
删除分支:
git branch -d <分支名>
标签管理
创建标签:
git tag <标签名>
git tag -a <标签名> -m "标签描述"
推送标签:
git push origin <标签名>
git push origin --tags # 推送所有标签
查看历史
查看提交历史:
git log
简洁格式查看:
git log --oneline
查看特定文件的历史:
git log -- <文件名>
解决冲突
在合并或拉取时遇到冲突,需要手动解决后提交。
查看冲突文件:
git status
标记冲突已解决:
git add <冲突文件>
完成合并:
git commit -m "解决合并冲突"
11. Git的协作最佳实践
在团队协作中,遵循Git的最佳实践可以提高效率,减少冲突,确保代码质量。
11.1 频繁提交
- 理由:小而频繁的提交便于追踪更改,减少合并冲突的风险。
- 实践:
- 每完成一个功能或修复一个问题后立即提交。
- 避免一次性提交大量更改。
示例:
git add feature-login.py
git commit -m "实现用户登录功能"
11.2 撰写清晰的提交信息
- 理由:清晰的提交信息有助于团队成员理解更改内容和目的。
- 实践:
- 使用简洁明了的标题。
- 描述更改的具体内容和原因。
示例:
git commit -m "修复登录页面的表单验证错误"
11.3 使用分支策略
- 理由:合理的分支策略可以组织开发流程,避免不同功能的更改相互干扰。
- 实践:
- 为每个新功能或修复创建独立分支。
- 定期合并主分支的更改到功能分支,保持同步。
示例:
git checkout -b feature-signup
11.4 代码审查
- 理由:代码审查可以提高代码质量,发现潜在的问题,促进团队知识共享。
- 实践:
- 在合并Pull Request前进行审查。
- 提供建设性的反馈,确保代码符合团队标准。
步骤:
- 创建Pull Request:
- 开发者提交更改并创建Pull Request。
- 审查代码:
- 团队成员检查代码,提出改进建议。
- 合并Pull Request:
- 审查通过后,合并到主分支。
12. Docker与容器管理
容器化技术在后端开发中越来越普及,Docker是其中最流行的容器平台之一,帮助开发者构建、部署和运行应用程序。
12.1 安装Docker
Debian/Ubuntu系统
sudo apt update
sudo apt install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io
Red Hat/CentOS系统
sudo yum install -y yum-utils
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install docker-ce docker-ce-cli containerd.io
sudo systemctl start docker
sudo systemctl enable docker
12.2 基本Docker命令
查看Docker版本
docker --version
拉取镜像
docker pull <镜像名>
示例:
docker pull nginx:latest
查看本地镜像
docker images
运行容器
docker run -d --name <容器名> -p <主机端口>:<容器端口> <镜像名>
示例:
docker run -d --name my-nginx -p 80:80 nginx:latest
查看运行中的容器
docker ps
停止容器
docker stop <容器名或PID>
示例:
docker stop my-nginx
删除容器
docker rm <容器名或PID>
示例:
docker rm my-nginx
删除镜像
docker rmi <镜像名>
示例:
docker rmi nginx:latest
12.3 管理容器和镜像
查看容器日志
docker logs <容器名>
示例:
docker logs my-nginx
进入运行中的容器
docker exec -it <容器名> /bin/bash
示例:
docker exec -it my-nginx /bin/bash
列出所有容器(包括停止的容器)
docker ps -a
清理未使用的镜像和容器
docker system prune
注意:该命令会删除所有未使用的容器、网络、镜像等,请谨慎使用。
13. 安全管理
确保系统和应用的安全是后端开发和运维的重要职责。以下内容涵盖防火墙配置、安全更新与升级等方面。
13.1 使用防火墙
ufw
:Uncomplicated Firewall(适用于Debian/Ubuntu)
启用防火墙:
sudo ufw enable
查看状态:
sudo ufw status verbose
允许端口:
sudo ufw allow 22/tcp # SSH
sudo ufw allow 80/tcp # HTTP
sudo ufw allow 443/tcp # HTTPS
拒绝端口:
sudo ufw deny 23/tcp
示例:
sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw enable
sudo ufw status
firewalld
:适用于Red Hat/CentOS
启动防火墙:
sudo systemctl start firewalld
sudo systemctl enable firewalld
查看状态:
sudo firewall-cmd --state
允许端口:
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --permanent --add-service=ssh
sudo firewall-cmd --reload
拒绝端口:
sudo firewall-cmd --permanent --remove-service=telnet
sudo firewall-cmd --reload
示例:
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --permanent --add-service=ssh
sudo firewall-cmd --reload
sudo firewall-cmd --list-all
13.2 安全更新与升级
Debian/Ubuntu系统
更新软件包列表:
sudo apt update
升级已安装的软件包:
sudo apt upgrade
升级发行版:
sudo apt dist-upgrade
sudo do-release-upgrade
Red Hat/CentOS系统
更新软件包:
sudo yum update # CentOS 7及以前
sudo dnf upgrade # CentOS 8及以后
自动安装安全更新(使用yum-cron
或dnf-automatic
):
-
安装
yum-cron
(CentOS 7):sudo yum install yum-cron sudo systemctl enable yum-cron sudo systemctl start yum-cron
-
安装
dnf-automatic
(CentOS 8):sudo dnf install dnf-automatic sudo systemctl enable --now dnf-automatic.timer
示例:
sudo yum update
sudo dnf upgrade
解释:
- 定期更新系统和软件包,修补安全漏洞,确保系统安全。
14. 文件传输与备份
数据备份和文件传输是后端开发和运维中的重要任务,确保数据的安全和高效传输。
14.1 使用rsync
rsync
是一个功能强大的文件同步和传输工具,支持增量传输、压缩和远程同步。
基本用法
同步本地目录到远程服务器:
rsync -avz /path/to/local/dir/ user@remote_host:/path/to/remote/dir/
从远程服务器同步目录到本地:
rsync -avz user@remote_host:/path/to/remote/dir/ /path/to/local/dir/
仅同步新文件和更改的文件:
rsync -avzu /path/to/local/dir/ user@remote_host:/path/to/remote/dir/
删除目标目录中源目录不存在的文件:
rsync -avz --delete /path/to/local/dir/ user@remote_host:/path/to/remote/dir/
常用选项
-a
:归档模式,保留符号链接、权限、时间戳等。-v
:详细输出。-z
:压缩数据传输。-u
:仅更新已更改的文件。--delete
:删除目标中源不存在的文件。-P
:显示进度,部分传输文件可断点续传。
示例:
rsync -avzP /var/www/html/ user@192.168.1.100:/var/www/html_backup/
解释:
rsync
通过比较源和目标目录,智能传输文件,节省带宽和时间。- 使用SSH协议进行安全传输。
15. 其他有用的工具
在后端开发和运维中,掌握一些辅助工具可以显著提升效率和工作体验。
15.1 tmux与screen
tmux
和screen
是终端多路复用器,允许在单一终端会话中运行多个窗口和会话,支持会话分离和恢复。
安装tmux
Debian/Ubuntu系统:
sudo apt install tmux
Red Hat/CentOS系统:
sudo yum install tmux
基本使用
启动tmux
会话:
tmux
创建新窗口:
按Ctrl + B
,然后按C
切换窗口:
按Ctrl + B
,然后按窗口编号(如1
, 2
)
分割窗口:
按Ctrl + B
,然后按%
(垂直分割)或"
(水平分割)
分离会话:
按Ctrl + B
,然后按D
恢复会话:
tmux attach
示例:
tmux new -s mysession
# 在会话中创建多个窗口和面板
tmux attach -t mysession
解释:
tmux
允许在断开连接后恢复会话,适合远程管理和长期运行的任务。
15.2 SSH密钥管理
使用SSH密钥进行认证,提高安全性和便利性,避免频繁输入密码。
生成SSH密钥
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
步骤:
-
运行命令:
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
-
设置密钥保存路径(默认
~/.ssh/id_rsa
)。 -
设置密码短语(可选,提高安全性)。
添加SSH密钥到SSH-Agent
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_rsa
将SSH公钥添加到远程服务器
复制公钥:
ssh-copy-id user@remote_host
手动添加:
-
显示公钥内容:
cat ~/.ssh/id_rsa.pub
-
在远程服务器上编辑
~/.ssh/authorized_keys
文件,将公钥内容粘贴进去。
示例:
ssh-copy-id john@192.168.1.100
解释:
- 使用SSH密钥可以实现免密码登录,提高安全性和效率。
- 建议为每个设备生成独立的SSH密钥,并妥善保管私钥。
16. 远程管理与部署
远程管理和自动化部署是后端开发和运维中的核心任务,确保应用程序能够高效、可靠地运行在生产环境中。
16.1 使用Ansible
Ansible是一个开源的自动化工具,用于配置管理、应用部署和任务自动化,适合大规模服务器管理。
安装Ansible
Debian/Ubuntu系统:
sudo apt update
sudo apt install ansible
Red Hat/CentOS系统:
sudo yum install epel-release
sudo yum install ansible
基本概念
- Inventory:定义管理的主机列表。
- Playbook:定义任务和配置的YAML文件。
- Modules:Ansible提供的预定义任务模块,如
apt
,yum
,copy
等。
示例
Inventory文件(hosts.ini
):
[webservers]
192.168.1.101
192.168.1.102
[dbservers]
192.168.1.201
Playbook文件(deploy.yml
):
---
- name: 部署Web服务器
hosts: webservers
become: yes
tasks:
- name: 更新APT缓存
apt:
update_cache: yes
- name: 安装Nginx
apt:
name: nginx
state: present
- name: 启动并启用Nginx服务
systemd:
name: nginx
state: started
enabled: yes
运行Playbook:
ansible-playbook -i hosts.ini deploy.yml
解释:
- Ansible通过Playbook自动化执行任务,减少手动操作,提高部署效率和一致性。
- 使用
become: yes
提升权限,执行需要管理员权限的任务。
16.2 部署应用
部署应用是将开发好的应用程序发布到生产环境,使其能够被用户访问和使用。以下介绍常用的部署方法。
使用Git Hooks进行自动部署
步骤:
-
在服务器上创建部署脚本(如
deploy.sh
):#!/bin/bash cd /var/www/html/repository git pull origin master systemctl restart nginx
-
设置
post-receive
Hook:- 在服务器的Git仓库中,编辑
hooks/post-receive
文件。
#!/bin/bash git --work-tree=/var/www/html/repository --git-dir=/path/to/repo.git checkout -f /path/to/deploy.sh
- 赋予执行权限:
chmod +x hooks/post-receive
- 在服务器的Git仓库中,编辑
-
配置本地仓库的远程地址:
git remote add production ssh://user@server_ip:/path/to/repo.git
-
推送代码到生产服务器:
git push production master
解释:
- 使用Git Hooks实现代码推送后自动部署,简化部署流程,减少人为错误。
使用CI/CD工具
使用持续集成/持续部署(CI/CD)工具(如Jenkins, GitLab CI, GitHub Actions)可以实现更复杂和自动化的部署流程。
示例:
-
Jenkins:
- 安装Jenkins。
- 配置Jenkins任务,拉取代码、运行测试、构建应用、部署到服务器。
-
GitLab CI:
- 在项目根目录创建
.gitlab-ci.yml
文件。
stages: - build - test - deploy build_job: stage: build script: - make build test_job: stage: test script: - make test deploy_job: stage: deploy script: - ./deploy.sh only: - master
- GitLab Runner执行CI/CD流程。
- 在项目根目录创建
解释:
- CI/CD工具通过自动化脚本,实现代码的持续集成和自动部署,提高开发效率和部署一致性。
17. 常见问题与解决方法
在使用Linux进行后端开发和运维过程中,可能会遇到各种问题。以下是一些常见问题及其解决方法。
17.1 如何回滚到之前的状态?
问题描述:
需要撤销最近的更改,恢复到之前的系统或应用状态。
解决方法:
使用git reset
回滚代码
软重置:保留工作目录和暂存区的更改。
git reset --soft <提交哈希>
混合重置(默认):保留工作目录的更改,重置暂存区。
git reset <提交哈希>
硬重置:重置工作目录和暂存区,丢弃所有更改。
git reset --hard <提交哈希>
示例:
git reset --hard HEAD~1
注意:硬重置会丢弃未提交的更改,需谨慎使用。
使用rsync
进行文件系统回滚
示例:
rsync -avz /backup/dir/ /var/www/html/
解释:
- 将备份目录的内容同步到目标目录,覆盖现有文件,恢复到备份时的状态。
17.2 如何撤销未提交的更改?
问题描述:
在修改文件后,发现更改有误,需要撤销未提交的更改。
解决方法:
使用git checkout
恢复文件
命令:
git checkout -- <文件名>
示例:
git checkout -- app.py
解释:
- 将指定文件恢复到最近一次提交的状态,丢弃工作目录中的更改。
使用git restore
命令
命令:
git restore <文件名>
示例:
git restore app.py
解释:
git restore
是Git 2.23引入的更直观的命令,用于恢复文件或撤销更改。
17.3 如何解决磁盘空间不足?
问题描述:
服务器或开发环境中的磁盘空间不足,影响系统和应用的正常运行。
解决方法:
查找占用空间较大的文件和目录
使用du
命令:
du -h --max-depth=1 /path/to/directory
示例:
du -h --max-depth=1 /var/www
清理不必要的文件
删除旧的日志文件:
sudo rm /var/log/nginx/*.log.old
清理包缓存(Debian/Ubuntu):
sudo apt clean
清理包缓存(Red Hat/CentOS):
sudo yum clean all
使用ncdu
进行交互式磁盘使用分析
安装ncdu
:
sudo apt install ncdu # Debian/Ubuntu
sudo yum install ncdu # Red Hat/CentOS
使用ncdu
:
ncdu /var/www
解释:
ncdu
提供交互式界面,帮助快速定位和删除占用大量空间的文件和目录。
18. 总结
Linux是后端开发和运维中的重要工具,掌握常用的Linux操作能够显著提升工作效率和系统管理能力。通过本文的学习,您应该能够:
- 熟练使用基本的文件和目录管理命令。
- 有效管理用户和权限,确保系统安全。
- 掌握软件包管理,安装和更新所需的软件。
- 使用网络工具进行网络配置和故障排查。
- 管理系统进程,优化系统性能。
- 编写Shell脚本,实现任务自动化。
- 进行日志管理,监控系统和应用状态。
- 使用Docker进行容器化管理,简化部署流程。
- 利用Git进行版本控制,促进团队协作。
- 进行系统安全管理,保护系统免受威胁。
- 实现文件传输与备份,确保数据安全。
- 解决常见问题,保持系统稳定运行。
关键点总结:
- 基础操作:熟悉Linux的基本命令和文件操作,是进行后端开发和运维的基础。
- 用户和权限管理:合理管理用户和权限,确保系统的安全性和资源的合理使用。
- 软件包管理:掌握不同Linux发行版的软件包管理工具,保持系统和应用的最新状态。
- 网络管理:有效管理网络配置和使用网络工具,确保应用的网络连接和性能。
- 进程管理:监控和控制系统进程,优化系统资源的使用。
- 自动化与脚本:通过Shell脚本和自动化工具,提高工作效率,减少重复性劳动。
- 日志管理:定期查看和管理日志文件,及时发现和解决系统和应用问题。
- 容器化管理:使用Docker等容器化技术,简化应用的部署和管理。
- 版本控制:利用Git进行代码版本控制,促进团队协作和代码质量。
- 安全管理:实施有效的安全策略,保护系统和数据的安全。
- 文件传输与备份:确保数据的安全传输和备份,防止数据丢失。