|
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
引言
Slackware Linux作为现存最古老的Linux发行版之一,自1993年由Patrick Volkerding创建以来,一直以其简洁、稳定和接近Unix的设计理念而著称。与其他现代发行版不同,Slackware保留了更多的传统Unix特性,这使得它成为学习Linux系统管理的理想平台。在图形界面日益普及的今天,掌握命令行操作仍然是Linux系统管理员不可或缺的技能。命令行不仅提供了更高的操作效率,还能实现图形界面难以完成的复杂任务,特别是在远程管理、批量处理和系统自动化方面具有无可比拟的优势。
本教程将从基础命令开始,逐步深入到高级技巧,帮助读者全面掌握Slackware命令行操作,提升Linux系统管理效率。无论你是Linux新手还是有经验的用户,都能从本教程中获得实用的知识和技巧。
一、基础命令操作
1. 文件和目录操作
在Linux系统中,一切皆文件,因此掌握文件和目录操作是学习命令行的第一步。
• ls- 列出目录内容
“`bash列出当前目录的内容ls
ls- 列出目录内容
“`bash
ls
# 列出详细信息,包括权限、所有者、大小和修改时间
ls -l
# 列出所有文件,包括隐藏文件
ls -a
# 以人类可读的格式显示文件大小
ls -lh
- - `cd` - 切换目录
- ```bash
- # 切换到用户主目录
- cd ~
-
- # 切换到上一级目录
- cd ..
-
- # 切换到之前的工作目录
- cd -
复制代码
• pwd- 显示当前工作目录# 显示当前工作目录的完整路径
pwd
• mkdir- 创建目录
“`bash创建一个新目录mkdir new_directory
pwd- 显示当前工作目录
mkdir- 创建目录
“`bash
mkdir new_directory
# 创建多级目录(包括父目录)
mkdir -p parent_directory/child_directory
- - `rmdir` - 删除空目录
- ```bash
- # 删除空目录
- rmdir empty_directory
复制代码
• touch- 创建空文件或更新文件时间戳
“`bash创建一个空文件touch new_file.txt
touch- 创建空文件或更新文件时间戳
“`bash
touch new_file.txt
# 更新文件的访问和修改时间
touch existing_file.txt
- - `cp` - 复制文件或目录
- ```bash
- # 复制文件
- cp source.txt destination.txt
-
- # 复制目录及其内容
- cp -r source_directory destination_directory
-
- # 保留文件属性复制
- cp -p source.txt destination.txt
复制代码
• mv- 移动或重命名文件和目录
“`bash重命名文件mv old_name.txt new_name.txt
mv- 移动或重命名文件和目录
“`bash
mv old_name.txt new_name.txt
# 移动文件到目录
mv file.txt directory/
# 移动目录
mv source_directory destination_directory
- - `rm` - 删除文件或目录
- ```bash
- # 删除文件
- rm file.txt
-
- # 删除目录及其内容(递归删除)
- rm -r directory
-
- # 强制删除,不提示确认
- rm -f file.txt
-
- # 强制递归删除目录
- rm -rf directory
复制代码
• chmod- 修改文件权限
“`bash使用符号模式设置权限chmod u+x script.sh # 给文件所有者添加执行权限
chmod go-w file.txt # 移除组用户和其他用户的写权限
chmod a=r file.txt # 为所有用户设置只读权限
chmod- 修改文件权限
“`bash
chmod u+x script.sh # 给文件所有者添加执行权限
chmod go-w file.txt # 移除组用户和其他用户的写权限
chmod a=r file.txt # 为所有用户设置只读权限
# 使用八进制模式设置权限
chmod 755 script.sh # rwxr-xr-x
chmod 644 file.txt # rw-r–r–
- - `chown` - 修改文件所有者
- ```bash
- # 修改文件所有者
- chown user file.txt
-
- # 修改文件所有者和组
- chown user:group file.txt
-
- # 递归修改目录及其内容的所有者
- chown -R user directory/
复制代码
• chgrp- 修改文件所属组
“`bash修改文件所属组chgrp group file.txt
chgrp- 修改文件所属组
“`bash
chgrp group file.txt
# 递归修改目录及其内容的所属组
chgrp -R group directory/
- #### 文件查找
- - `find` - 在目录树中查找文件
- ```bash
- # 在当前目录及其子目录中查找名为file.txt的文件
- find . -name file.txt
-
- # 查找大于100MB的文件
- find . -size +100M
-
- # 查找修改时间在7天以内的文件
- find . -mtime -7
-
- # 查找属于特定用户的文件
- find . -user username
-
- # 查找并执行命令(例如删除所有.tmp文件)
- find . -name "*.tmp" -exec rm {} \;
复制代码
• locate- 使用数据库快速查找文件
“`bash更新文件数据库(需要root权限)updatedb
locate- 使用数据库快速查找文件
“`bash
updatedb
# 查找包含filename的文件
locate filename
- - `which` - 查找可执行文件的位置
- ```bash
- # 查找ls命令的位置
- which ls
复制代码
• whereis- 查找命令的二进制、源和手册页文件# 查找ls命令的相关文件
whereis ls
whereis- 查找命令的二进制、源和手册页文件
2. 文本处理
文本处理是Linux命令行的核心功能之一,掌握这些工具可以大大提高工作效率。
• cat- 连接并显示文件内容
“`bash显示文件内容cat file.txt
cat- 连接并显示文件内容
“`bash
cat file.txt
# 显示多个文件内容
cat file1.txt file2.txt
# 显示行号
cat -n file.txt
# 将多个文件合并为一个文件
cat file1.txt file2.txt > combined.txt
- - `more` - 分页显示文件内容
- ```bash
- # 分页显示文件内容
- more file.txt
-
- # 在more中,可以使用以下命令:
- # 空格键:下一页
- # Enter键:下一行
- # q键:退出
复制代码
• less- 分页显示文件内容(比more功能更强)
“`bash分页显示文件内容less file.txt
less- 分页显示文件内容(比more功能更强)
“`bash
less file.txt
# 在less中,可以使用以下命令:
# 空格键:下一页
# b键:上一页
# Enter键:下一行
# /pattern:向前搜索
# ?pattern:向后搜索
# n:重复上一次搜索
# q键:退出
- - `head` - 显示文件的开头部分
- ```bash
- # 显示文件前10行
- head file.txt
-
- # 显示文件前20行
- head -n 20 file.txt
-
- # 显示文件前50个字节
- head -c 50 file.txt
复制代码
• tail- 显示文件的结尾部分
“`bash显示文件最后10行tail file.txt
tail- 显示文件的结尾部分
“`bash
tail file.txt
# 显示文件最后20行
tail -n 20 file.txt
# 实时查看文件更新(常用于日志监控)
tail -f /var/log/syslog
- #### 文本搜索和处理
- - `grep` - 文本搜索工具
- ```bash
- # 在文件中搜索包含"error"的行
- grep "error" logfile.txt
-
- # 搜索不包含"error"的行
- grep -v "error" logfile.txt
-
- # 忽略大小写搜索
- grep -i "error" logfile.txt
-
- # 显示匹配行的行号
- grep -n "error" logfile.txt
-
- # 递归搜索目录中的文件
- grep -r "error" /var/log/
-
- # 只显示匹配的文件名
- grep -l "error" *.log
-
- # 使用正则表达式搜索
- grep -E "error|warning" logfile.txt
复制代码
• sed- 流编辑器,用于文本替换和编辑
“`bash替换文本中的”old”为”new”sed ’s/old/new/g’ file.txt
sed- 流编辑器,用于文本替换和编辑
“`bash
sed ’s/old/new/g’ file.txt
# 只替换每行中第一次出现的”old”
sed ’s/old/new/’ file.txt
# 删除包含”pattern”的行
sed ‘/pattern/d’ file.txt
# 删除空行
sed ‘/^$/d’ file.txt
# 直接修改文件(而不是输出到终端)
sed -i ’s/old/new/g’ file.txt
# 多个替换
sed -e ’s/old1/new1/g’ -e ’s/old2/new2/g’ file.txt
- - `awk` - 文本处理工具,适用于列处理
- ```bash
- # 打印文件的每一行
- awk '{print}' file.txt
-
- # 打印文件的第一列(默认以空格为分隔符)
- awk '{print $1}' file.txt
-
- # 使用特定分隔符(例如逗号)并打印第二列
- awk -F',' '{print $2}' file.csv
-
- # 打印包含"pattern"的行
- awk '/pattern/ {print}' file.txt
-
- # 计算文件中行的数量
- awk 'END {print NR}' file.txt
-
- # 计算第三列的总和
- awk '{sum += $3} END {print sum}' file.txt
-
- # 条件处理(例如打印第三列大于100的行)
- awk '$3 > 100 {print $0}' file.txt
复制代码
• sort- 对文本行进行排序
“`bash对文件的行进行排序sort file.txt
sort- 对文本行进行排序
“`bash
sort file.txt
# 以数字方式排序
sort -n file.txt
# 反向排序
sort -r file.txt
# 去除重复行后排序
sort -u file.txt
# 按第二列排序(以空格为分隔符)
sort -k2 file.txt
# 按第二列以数字方式排序
sort -k2n file.txt
- - `uniq` - 去除或报告重复行
- ```bash
- # 去除相邻的重复行
- uniq file.txt
-
- # 只显示重复的行
- uniq -d file.txt
-
- # 显示每行出现的次数
- uniq -c file.txt
-
- # 只显示不重复的行
- uniq -u file.txt
-
- # 注意:uniq通常与sort一起使用,因为它只能检测相邻的重复行
- sort file.txt | uniq -c
复制代码
• wc- 计算行数、字数和字节数
“`bash显示文件的行数、字数和字节数wc file.txt
wc- 计算行数、字数和字节数
“`bash
wc file.txt
# 只显示行数
wc -l file.txt
# 只显示字数
wc -w file.txt
# 只显示字节数
wc -c file.txt
# 显示多个文件的统计信息
wc file1.txt file2.txt
- ### 3. 用户管理
- 在多用户系统中,用户管理是系统管理员的重要职责。
- #### 用户管理命令
- - `useradd` - 创建新用户
- ```bash
- # 创建新用户
- useradd newuser
-
- # 创建用户并指定主目录
- useradd -m newuser
-
- # 创建用户并指定用户ID
- useradd -u 1001 newuser
-
- # 创建用户并指定初始组
- useradd -g users newuser
-
- # 创建用户并指定附加组
- useradd -G wheel,users newuser
-
- # 创建用户并指定shell
- useradd -s /bin/bash newuser
-
- # 创建用户并添加注释
- useradd -c "New User" newuser
复制代码
• usermod- 修改用户账户
“`bash修改用户名usermod -l newname oldname
usermod- 修改用户账户
“`bash
usermod -l newname oldname
# 修改用户主目录
usermod -d /home/newdir username
# 修改用户shell
usermod -s /bin/zsh username
# 添加用户到附加组
usermod -a -G wheel username
# 锁定用户账户
usermod -L username
# 解锁用户账户
usermod -U username
- - `userdel` - 删除用户
- ```bash
- # 删除用户但保留主目录
- userdel username
-
- # 删除用户及其主目录
- userdel -r username
复制代码
• groupadd- 创建新组
“`bash创建新组groupadd newgroup
groupadd- 创建新组
“`bash
groupadd newgroup
# 创建组并指定组ID
groupadd -g 1001 newgroup
- - `groupmod` - 修改组
- ```bash
- # 修改组名
- groupmod -n newname oldname
-
- # 修改组ID
- groupmod -g 1002 groupname
复制代码
• groupdel- 删除组# 删除组
groupdel groupname
groupdel- 删除组
• passwd- 修改用户密码
“`bash修改当前用户密码passwd
passwd- 修改用户密码
“`bash
passwd
# 修改指定用户密码(需要root权限)
passwd username
# 锁定用户密码
passwd -l username
# 解锁用户密码
passwd -u username
# 设置密码过期
passwd -e username
- - `su` - 切换用户身份
- ```bash
- # 切换到root用户(需要输入root密码)
- su -
-
- # 切换到指定用户
- su - username
-
- # 切换到指定用户但不使用目标用户的环境变量
- su username
复制代码
• sudo- 以其他用户身份执行命令(通常是root)
“`bash以root身份执行命令(需要当前用户在sudoers文件中)sudo command
sudo- 以其他用户身份执行命令(通常是root)
“`bash
sudo command
# 以指定用户身份执行命令
sudo -u username command
# 以root身份打开shell
sudo -i
# 列出当前用户可以执行的sudo命令
sudo -l
- ## 二、中级命令操作
- ### 1. 进程管理
- 进程管理是系统管理员的核心任务之一,包括监控、控制和优化运行中的进程。
- #### 进程查看命令
- - `ps` - 显示当前进程
- ```bash
- # 显示当前用户的进程
- ps
-
- # 显示所有进程
- ps -e
-
- # 显示所有进程的详细信息
- ps -ef
-
- # 以用户友好的方式显示所有进程
- ps aux
-
- # 显示特定用户的进程
- ps -u username
-
- # 显示特定进程的详细信息
- ps -p PID -f
-
- # 显示进程树
- ps -ejH
-
- # 显示线程信息
- ps -eLf
复制代码
• top- 动态显示进程信息
“`bash启动top命令top
top- 动态显示进程信息
“`bash
top
# 在top中,可以使用以下命令:
# M:按内存使用排序
# P:按CPU使用排序
# k:杀死进程
# r:重新设置进程优先级
# q:退出
# 启动top并只显示特定用户的进程
top -u username
# 启动top并只监视特定进程
top -p PID
- - `htop` - 增强版的top(需要安装)
- ```bash
- # 启动htop
- htop
-
- # 在htop中,可以使用以下命令:
- # F1-F10:功能键
- # 空格键:标记/取消标记进程
- # U:显示特定用户的进程
- # K:隐藏内核线程
- # H:显示用户线程
- # q:退出
复制代码
• kill- 终止进程
“`bash正常终止进程(信号15)kill PID
kill- 终止进程
“`bash
kill PID
# 强制终止进程(信号9)
kill -9 PID
# 按进程名终止进程
killall process_name
# 按进程名强制终止进程
killall -9 process_name
# 终止特定用户的进程
pkill -u username
- - `pkill` - 根据进程名和其他属性终止进程
- ```bash
- # 根据进程名终止进程
- pkill process_name
-
- # 终止特定用户的进程
- pkill -u username
-
- # 根据完整命令行终止进程
- pkill -f "command pattern"
-
- # 测试模式(只显示会终止的进程,不实际终止)
- pkill -l process_name
复制代码
• killall- 根据进程名终止所有匹配的进程
“`bash终止所有名为process_name的进程killall process_name
killall- 根据进程名终止所有匹配的进程
“`bash
killall process_name
# 强制终止所有名为process_name的进程
killall -9 process_name
# 终止特定用户的进程
killall -u username process_name
# 询问确认后再终止进程
killall -i process_name
- #### 作业控制
- - `jobs` - 显示当前shell中的作业
- ```bash
- # 显示当前shell中的所有作业
- jobs
-
- # 显示作业ID和进程ID
- jobs -l
-
- # 只显示正在运行的作业
- jobs -r
-
- # 只显示已停止的作业
- jobs -s
复制代码
• bg- 将作业放到后台运行
“`bash将最近停止的作业放到后台bg
bg- 将作业放到后台运行
“`bash
bg
# 将指定作业ID的作业放到后台
bg %1
# 启动命令并立即放到后台
command &
- - `fg` - 将作业放到前台运行
- ```bash
- # 将最近后台的作业放到前台
- fg
-
- # 将指定作业ID的作业放到前台
- fg %1
复制代码
• nohup- 运行命令,使其忽略挂起信号
“`bash运行命令并使其在用户退出后继续运行nohup command &
nohup- 运行命令,使其忽略挂起信号
“`bash
nohup command &
# 指定输出文件
nohup command > output.txt 2>&1 &
- - `screen` / `tmux` - 终端复用器(需要安装)
- ```bash
- # 创建新的screen会话
- screen
-
- # 创建命名的screen会话
- screen -S session_name
-
- # 附加到现有的screen会话
- screen -r
-
- # 列出所有screen会话
- screen -ls
-
- # 从screen会话中分离
- Ctrl+A, D
-
- # 在tmux中:
- # 创建新的tmux会话
- tmux
-
- # 创建命名的tmux会话
- tmux new -s session_name
-
- # 附加到现有的tmux会话
- tmux attach -t session_name
-
- # 从tmux会话中分离
- Ctrl+B, D
复制代码
2. 网络配置
网络配置和管理是Linux系统管理的重要组成部分。
• ifconfig- 配置网络接口(传统工具)
“`bash显示所有网络接口ifconfig -a
ifconfig- 配置网络接口(传统工具)
“`bash
ifconfig -a
# 显示特定网络接口
ifconfig eth0
# 启用网络接口
ifconfig eth0 up
# 禁用网络接口
ifconfig eth0 down
# 配置IP地址
ifconfig eth0 192.168.1.100
# 配置IP地址和子网掩码
ifconfig eth0 192.168.1.100 netmask 255.255.255.0
# 配置IP地址、子网掩码和广播地址
ifconfig eth0 192.168.1.100 netmask 255.255.255.0 broadcast 192.168.1.255
- - `ip` - 配置网络接口(现代工具)
- ```bash
- # 显示所有网络接口
- ip addr show
-
- # 显示特定网络接口
- ip addr show eth0
-
- # 启用网络接口
- ip link set eth0 up
-
- # 禁用网络接口
- ip link set eth0 down
-
- # 配置IP地址
- ip addr add 192.168.1.100/24 dev eth0
-
- # 删除IP地址
- ip addr del 192.168.1.100/24 dev eth0
-
- # 显示路由表
- ip route show
-
- # 添加默认路由
- ip route add default via 192.168.1.1
-
- # 删除默认路由
- ip route del default
复制代码
• ping- 测试网络连接
“`bash测试与主机的连接ping example.com
ping- 测试网络连接
“`bash
ping example.com
# 限制ping次数
ping -c 4 example.com
# 指定数据包大小
ping -s 1024 example.com
# 持续ping并显示时间戳
ping -D example.com
# 洪水ping(谨慎使用)
ping -f example.com
- - `traceroute` / `tracepath` - 追踪网络路径
- ```bash
- # 追踪到主机的路径
- traceroute example.com
-
- # 使用ICMP而不是UDP
- traceroute -I example.com
-
- # 指定最大跳数
- traceroute -m 20 example.com
-
- # 使用tracepath(不需要root权限)
- tracepath example.com
复制代码
• netstat- 网络统计工具
“`bash显示所有网络连接netstat -a
netstat- 网络统计工具
“`bash
netstat -a
# 显示所有TCP连接
netstat -at
# 显示所有UDP连接
netstat -au
# 显示监听的端口
netstat -l
# 显示监听的TCP端口
netstat -lt
# 显示监听的UDP端口
netstat -lu
# 显示网络统计信息
netstat -s
# 显示PID和程序名称
netstat -p
# 显示路由表
netstat -r
# 显示网络接口信息
netstat -i
# 持续显示信息
netstat -c
- - `ss` - 套接字统计工具(现代替代netstat)
- ```bash
- # 显示所有套接字连接
- ss -a
-
- # 显示所有TCP连接
- ss -at
-
- # 显示所有UDP连接
- ss -au
-
- # 显示监听的端口
- ss -l
-
- # 显示进程信息
- ss -p
-
- # 显示摘要统计信息
- ss -s
-
- # 显示TCP连接状态
- ss -t state established
-
- # 显示连接到特定端口的进程
- ss -tp sport = :80
复制代码
• ssh- 安全远程连接
“`bash连接到远程主机ssh username@hostname
ssh- 安全远程连接
“`bash
ssh username@hostname
# 指定端口连接
ssh -p 2222 username@hostname
# 使用密钥认证连接
ssh -i /path/to/private_key username@hostname
# 执行远程命令
ssh username@hostname command
# 启用X11转发
ssh -X username@hostname
# 创建SSH隧道
ssh -L 8080:localhost:80 username@hostname
# 创建反向SSH隧道
ssh -R 8080:localhost:80 username@hostname
# 创建SOCKS代理
ssh -D 1080 username@hostname
- - `scp` - 安全文件复制
- ```bash
- # 复制本地文件到远程主机
- scp file.txt username@hostname:/remote/path/
-
- # 复制远程文件到本地
- scp username@hostname:/remote/file.txt /local/path/
-
- # 复制目录(递归)
- scp -r local_directory username@hostname:/remote/path/
-
- # 指定端口
- scp -P 2222 file.txt username@hostname:/remote/path/
-
- # 保留文件属性
- scp -p file.txt username@hostname:/remote/path/
-
- # 限制带宽(Kbit/s)
- scp -l 1024 file.txt username@hostname:/remote/path/
复制代码
• sftp- 安全文件传输
“`bash连接到远程主机sftp username@hostname
sftp- 安全文件传输
“`bash
sftp username@hostname
# 指定端口连接
sftp -P 2222 username@hostname
# 在sftp中,可以使用以下命令:
# ls:列出远程目录内容
# cd:更改远程目录
# get:下载文件
# put:上传文件
# mkdir:创建远程目录
# rmdir:删除远程目录
# rm:删除远程文件
# pwd:显示远程当前目录
# lpwd:显示本地当前目录
# lls:列出本地目录内容
# lcd:更改本地目录
# exit:退出sftp
- ### 3. 软件包管理
- Slackware有其独特的软件包管理系统,与其他发行版有所不同。
- #### Slackware包管理工具
- - `pkgtool` - Slackware的菜单驱动包管理工具
- ```bash
- # 启动pkgtool(需要root权限)
- pkgtool
-
- # 在pkgtool中,可以选择以下选项:
- # Current:安装、查看或删除当前系统中的软件包
- # Other:安装来自其他目录的软件包
- # Floppy:从软盘安装软件包(已过时)
- # Setup:配置系统
- # Exit:退出pkgtool
复制代码
• installpkg- 安装软件包
“`bash安装软件包installpkg package.tgz
installpkg- 安装软件包
“`bash
installpkg package.tgz
# 安装软件包但不安装安装脚本
installpkg -warn package.tgz
# 安装软件包并覆盖现有文件
installpkg -overwrite package.tgz
# 安装软件包到根目录以外的目录
installpkg -root /mnt/hd package.tgz
# 安装软件包并显示详细信息
installpkg -verbose package.tgz
# 安装软件包并显示菜单提示
installpkg -menu package.tgz
# 安装软件包并显示安装脚本输出
installpkg -infobox package.tgz
- - `removepkg` - 删除软件包
- ```bash
- # 删除软件包
- removepkg package_name
-
- # 删除软件包但不执行删除脚本
- removepkg -warn package_name
-
- # 删除软件包并保留配置文件
- removepkg -preserve package_name
-
- # 删除软件包并显示详细信息
- removepkg -verbose package_name
-
- # 删除软件包并显示菜单提示
- removepkg -menu package_name
-
- # 删除软件包并显示删除脚本输出
- removepkg -infobox package_name
复制代码
• upgradepkg- 升级软件包
“`bash升级软件包upgradepkg package.tgz
upgradepkg- 升级软件包
“`bash
upgradepkg package.tgz
# 升级软件包并安装新文件
upgradepkg –install-new package.tgz
# 升级软件包但不执行安装脚本
upgradepkg -warn package.tgz
# 升级软件包并显示详细信息
upgradepkg -verbose package.tgz
# 升级软件包并显示菜单提示
upgradepkg -menu package.tgz
# 升级软件包并显示安装脚本输出
upgradepkg -infobox package.tgz
- - `explodepkg` - 解压软件包但不安装
- ```bash
- # 解压软件包到当前目录
- explodepkg package.tgz
-
- # 解压软件包到指定目录
- explodepkg package.tgz /target/directory
复制代码
• makepkg- 创建软件包
“`bash从目录内容创建软件包makepkg package.tgz
makepkg- 创建软件包
“`bash
makepkg package.tgz
# 创建软件包并询问确认
makepkg -l y -c n package.tgz
# 创建软件包并自动链接
makepkg -link y package.tgz
# 创建软件包并显示详细信息
makepkg -verbose package.tgz
- #### 第三方包管理工具
- - `sbopkg` - SlackBuilds包管理工具(需要安装)
- ```bash
- # 启动sbopkg(需要root权限)
- sbopkg
-
- # 同步SlackBuilds仓库
- sbopkg -r
-
- # 搜索软件包
- sbopkg -s "package_name"
-
- # 查看软件包信息
- sbopkg -i "package_name"
-
- # 队列安装软件包
- sbopkg -b "package_name"
-
- # 从队列文件安装软件包
- sbopkg -b /path/to/queuefile
复制代码
• slpkg- 第三方Slackware包管理工具(需要安装)
“`bash启动slpkgslpkg
slpkg- 第三方Slackware包管理工具(需要安装)
“`bash
slpkg
# 同步仓库
slpkg -s
# 搜索软件包
slpkg -S “package_name”
# 安装软件包
slpkg -i “package_name”
# 升级系统
slpkg -u
# 删除软件包
slpkg -d “package_name”
# 清理缓存
slpkg -c
- - `slackpkg` - Slackware官方包管理工具
- ```bash
- # 启动slackpkg(需要root权限)
- slackpkg
-
- # 更新包列表
- slackpkg update
-
- # 升级所有软件包
- slackpkg upgrade-all
-
- # 安装新软件包
- slackpkg install package_name
-
- # 删除软件包
- slackpkg remove package_name
-
- # 搜索软件包
- slackpkg search package_name
-
- # 显示软件包信息
- slackpkg info package_name
-
- # 清理系统
- slackpkg clean-system
复制代码
三、高级技巧
1. Shell脚本编写
Shell脚本是Linux系统管理的强大工具,可以自动化执行复杂任务。
• 脚本结构
“`bash
#!/bin/bash
# 这是一个注释
# 变量定义
NAME=“John Doe”
AGE=30
# 使用变量
echo “Name:\(NAME"
echo "Age: \)AGE”
# 命令替换
CURRENT_DATE=\((date)
echo "Current date: \)CURRENT_DATE”
# 算术运算
RESULT=\(((5 + 3))
echo "5 + 3 = \)RESULT”
# 退出状态
exit 0
- - 条件判断
- ```bash
- #!/bin/bash
-
- # if-else语句
- AGE=25
-
- if [ $AGE -lt 18 ]; then
- echo "Minor"
- elif [ $AGE -ge 18 ] && [ $AGE -lt 65 ]; then
- echo "Adult"
- else
- echo "Senior"
- fi
-
- # 文件测试
- FILE="/etc/passwd"
-
- if [ -f "$FILE" ]; then
- echo "$FILE exists and is a regular file"
- else
- echo "$FILE does not exist or is not a regular file"
- fi
-
- # 字符串比较
- NAME="John"
-
- if [ "$NAME" = "John" ]; then
- echo "Hello, John!"
- else
- echo "You're not John"
- fi
-
- # 逻辑运算
- if [ -f "/etc/passwd" ] && [ -r "/etc/passwd" ]; then
- echo "/etc/passwd exists and is readable"
- fi
复制代码
• 循环结构
“`bash
#!/bin/bash
# for循环
echo “Counting to 5:”
for i in {1..5}; do
done
# C风格的for循环
echo “Counting to 5 again:”
for ((i=1; i<=5; i++)); do
done
# while循环
COUNT=1
echo “Counting to 5 with while:”
while [ $COUNT -le 5 ]; do
- echo "Number: $COUNT"
- COUNT=$((COUNT + 1))
复制代码
done
# until循环
COUNT=1
echo “Counting to 5 with until:”
until [ $COUNT -gt 5 ]; do
- echo "Number: $COUNT"
- COUNT=$((COUNT + 1))
复制代码
done
# 遍历文件
echo “Files in current directory:”
for FILE in *; do
- if [ -f "$FILE" ]; then
- echo "File: $FILE"
- fi
复制代码
done
- #### 函数和参数处理
- - 函数定义和调用
- ```bash
- #!/bin/bash
-
- # 定义函数
- greet() {
- echo "Hello, $1!"
- }
-
- # 调用函数
- greet "John"
-
- # 带返回值的函数
- add() {
- local result=$((1 + 2))
- echo $result
- }
-
- # 捕获返回值
- sum=$(add)
- echo "1 + 2 = $sum"
-
- # 带多个参数的函数
- calculate() {
- case $2 in
- +) echo $(($1 + $3)) ;;
- -) echo $(($1 - $3)) ;;
- *) echo "Unknown operator" ;;
- esac
- }
-
- # 调用函数
- result=$(calculate 10 + 5)
- echo "10 + 5 = $result"
-
- result=$(calculate 10 - 5)
- echo "10 - 5 = $result"
复制代码
• 参数处理
“`bash
#!/bin/bash
# 显示所有参数
echo “All arguments:\(*"
echo "All arguments (quoted): \"\)*\””
echo “All arguments as separate words:\(@"
echo "All arguments as separate words (quoted): \"\)@\””
# 显示参数数量
echo “Number of arguments: $#”
# 显示脚本名称
echo “Script name: $0”
# 处理位置参数
echo “First argument:\(1"
echo "Second argument: \)2”
echo “Third argument: $3”
# 遍历所有参数
echo “Processing all arguments:”
for arg in “$@”; do
done
# 移位参数
echo “Before shift:\(1, \)2,\(3"
shift
echo "After shift: \)1,\(2, \)3”
# 获取选项
while getopts “:a:b:” opt; do
- case $opt in
- a) echo "Option -a with argument: $OPTARG" ;;
- b) echo "Option -b with argument: $OPTARG" ;;
- \?) echo "Invalid option: -$OPTARG" ;;
- esac
复制代码
done
- #### 实用脚本示例
- - 系统监控脚本
- ```bash
- #!/bin/bash
-
- # 系统监控脚本
- # 显示系统信息
-
- echo "===== System Information ====="
- echo "Hostname: $(hostname)"
- echo "OS: $(cat /etc/os-release | grep PRETTY_NAME | cut -d= -f2 | tr -d '"')"
- echo "Kernel: $(uname -r)"
- echo "Uptime: $(uptime -p)"
- echo ""
-
- echo "===== CPU Usage ====="
- echo "CPU Load: $(uptime | awk -F'load average:' '{print $2}')"
- echo ""
-
- echo "===== Memory Usage ====="
- free -h
- echo ""
-
- echo "===== Disk Usage ====="
- df -h
- echo ""
-
- echo "===== Top Processes ====="
- ps aux --sort=-%cpu | head -n 10
- echo ""
-
- echo "===== Network Connections ====="
- netstat -tuln | grep LISTEN
复制代码
• 备份脚本
“`bash
#!/bin/bash
# 备份脚本
# 备份指定目录到另一个位置
# 配置
SOURCE_DIR=”/home/user/documents”
BACKUPDIR=“/home/user/backups”
DATE=$(date +%Y%m%d%H%M%S)
BACKUPNAME=“backup$DATE.tar.gz”
# 创建备份目录(如果不存在)
mkdir -p “$BACKUP_DIR”
# 执行备份
echo “Creating backup of\(SOURCE_DIR..."
tar -czf "\)BACKUP_DIR/\(BACKUP_NAME" "\)SOURCE_DIR”
# 检查备份是否成功
if [ $? -eq 0 ]; then
- echo "Backup created successfully: $BACKUP_DIR/$BACKUP_NAME"
- # 保留最近5个备份,删除旧的备份
- cd "$BACKUP_DIR"
- ls -t backup_*.tar.gz | tail -n +6 | xargs rm -f
- echo "Old backups removed, keeping only the 5 most recent ones."
复制代码
else
- echo "Backup failed!"
- exit 1
复制代码
fi
exit 0
- - 日志分析脚本
- ```bash
- #!/bin/bash
-
- # 日志分析脚本
- # 分析Apache访问日志
-
- LOG_FILE="/var/log/apache2/access.log"
-
- # 检查日志文件是否存在
- if [ ! -f "$LOG_FILE" ]; then
- echo "Log file $LOG_FILE does not exist!"
- exit 1
- fi
-
- echo "===== Log Analysis for $LOG_FILE ====="
- echo ""
-
- # 总访问量
- echo "Total requests: $(wc -l < "$LOG_FILE")"
- echo ""
-
- # 前10个最常访问的IP
- echo "Top 10 IP addresses:"
- awk '{print $1}' "$LOG_FILE" | sort | uniq -c | sort -nr | head -n 10
- echo ""
-
- # 前10个最常访问的页面
- echo "Top 10 requested pages:"
- awk '{print $7}' "$LOG_FILE" | sort | uniq -c | sort -nr | head -n 10
- echo ""
-
- # 前10个HTTP状态码
- echo "Top 10 HTTP status codes:"
- awk '{print $9}' "$LOG_FILE" | sort | uniq -c | sort -nr | head -n 10
- echo ""
-
- # 前10个用户代理
- echo "Top 10 user agents:"
- awk -F'"' '{print $6}' "$LOG_FILE" | sort | uniq -c | sort -nr | head -n 10
- echo ""
-
- # 错误请求(4xx和5xx状态码)
- echo "Error requests (4xx and 5xx status codes):"
- awk '$9 ~ /^[45]/ {print $0}' "$LOG_FILE" | wc -l
- echo ""
-
- exit 0
复制代码
2. 系统优化
系统优化是提高Linux性能的重要任务,包括服务管理、内核调优和磁盘管理等方面。
• SysVinit服务管理(Slackware传统)
“`bash列出所有服务ls /etc/rc.d/
SysVinit服务管理(Slackware传统)
“`bash
ls /etc/rc.d/
# 启动服务
/etc/rc.d/rc.httpd start
# 停止服务
/etc/rc.d/rc.httpd stop
# 重启服务
/etc/rc.d/rc.httpd restart
# 检查服务状态
/etc/rc.d/rc.httpd status
# 使服务在启动时自动运行
chmod +x /etc/rc.d/rc.httpd
# 禁止服务在启动时自动运行
chmod -x /etc/rc.d/rc.httpd
- - Systemd服务管理(如果安装了systemd)
- ```bash
- # 启动服务
- systemctl start httpd
-
- # 停止服务
- systemctl stop httpd
-
- # 重启服务
- systemctl restart httpd
-
- # 重新加载服务配置
- systemctl reload httpd
-
- # 检查服务状态
- systemctl status httpd
-
- # 启用服务(开机自启)
- systemctl enable httpd
-
- # 禁用服务(禁止开机自启)
- systemctl disable httpd
-
- # 查看服务是否启用
- systemctl is-enabled httpd
-
- # 列出所有已启用的服务
- systemctl list-unit-files | grep enabled
-
- # 查看所有活动的服务
- systemctl list-units --type=service --state=running
复制代码
• 使用sysctl调整内核参数
“`bash显示所有内核参数sysctl -a
使用sysctl调整内核参数
“`bash
sysctl -a
# 显示特定参数
sysctl net.ipv4.ip_forward
# 临时设置参数
sysctl -w net.ipv4.ip_forward=1
# 永久设置参数(添加到/etc/sysctl.conf)
echo “net.ipv4.ip_forward=1” >> /etc/sysctl.conf
# 应用/etc/sysctl.conf中的所有设置
sysctl -p
# 常用内核参数优化
cat >> /etc/sysctl.conf << EOF
# 网络参数优化
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_max_tw_buckets = 5000
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.ip_local_port_range = 1024 65000
# 文件系统参数优化
fs.file-max = 65535
# 虚拟内存参数优化
vm.swappiness = 10
vm.dirty_ratio = 60
vm.dirty_background_ratio = 2
EOF
# 应用新设置
sysctl -p
- - 限制资源使用(ulimit)
- ```bash
- # 显示当前所有限制
- ulimit -a
-
- # 设置最大打开文件数
- ulimit -n 65535
-
- # 设置最大进程数
- ulimit -u 32768
-
- # 设置堆栈大小
- ulimit -s unlimited
-
- # 永久设置限制(在/etc/security/limits.conf中)
- cat >> /etc/security/limits.conf << EOF
- # 增加打开文件数限制
- * soft nofile 65535
- * hard nofile 65535
-
- # 增加进程数限制
- * soft nproc 32768
- * hard nproc 32768
-
- # 增加堆栈大小
- * soft stack unlimited
- * hard stack unlimited
- EOF
复制代码
• 磁盘空间分析
“`bash显示磁盘使用情况df -h
磁盘空间分析
“`bash
df -h
# 显示目录大小
du -sh /path/to/directory
# 显示目录中各子目录的大小
du -h –max-depth=1 /path/to/directory | sort -hr
# 查找大文件
find /path -type f -size +100M -exec ls -lh {} \;
# 查找大目录
du -h /path | grep ‘[0-9]+G’ | sort -hr
- - 文件系统优化
- ```bash
- # 检查文件系统
- fsck /dev/sda1
-
- # 检查并自动修复文件系统
- fsck -a /dev/sda1
-
- # 检查文件系统但不修复
- fsck -n /dev/sda1
-
- # 调整ext4文件系统参数
- tune2fs -o journal_data_writeback /dev/sda1
-
- # 禁用文件系统检查(不推荐用于根分区)
- tune2fs -c 0 /dev/sda1
-
- # 设置文件系统检查间隔
- tune2fs -i 1m /dev/sda1
-
- # 保留文件系统块
- tune2fs -m 1 /dev/sda1
复制代码
• 磁盘I/O优化
“`bash显示I/O调度器cat /sys/block/sda/queue/scheduler
磁盘I/O优化
“`bash
cat /sys/block/sda/queue/scheduler
# 设置I/O调度器
echo deadline > /sys/block/sda/queue/scheduler
# 显示磁盘读取ahead值
blockdev –getra /dev/sda
# 设置磁盘读取ahead值
blockdev –setra 16384 /dev/sda
# 显示NCQ设置
cat /sys/block/sda/queue/queuedepth
# 设置NCQ队列深度
echo 31 > /sys/block/sda/queue/queuedepth
- ### 3. 故障排除
- 故障排除是系统管理员的关键技能,包括日志分析、性能监控和问题诊断等方面。
- #### 系统日志分析
- - 查看系统日志
- ```bash
- # 查看系统消息日志
- cat /var/log/syslog
-
- # 查看认证日志
- cat /var/log/auth.log
-
- # 查看内核日志
- dmesg
-
- # 查看最近的系统消息
- tail -f /var/log/syslog
-
- # 搜索特定错误
- grep -i error /var/log/syslog
-
- # 搜索特定服务的日志
- grep -i httpd /var/log/syslog
-
- # 查看特定时间段的日志
- grep "May 20 14:" /var/log/syslog
-
- # 查看最近的N行日志
- tail -n 100 /var/log/syslog
复制代码
• - 日志轮转
- “`bash配置logrotate(/etc/logrotate.conf)cat > /etc/logrotate.d/custom << EOF
- /var/log/custom.log {
- weekly
- rotate 4
- compress
- delaycompress
- missingok
- notifempty
- create 644 root root
- }
- EOF
复制代码
日志轮转
“`bash
cat > /etc/logrotate.d/custom << EOF
/var/log/custom.log {
weekly
rotate 4
compress
delaycompress
missingok
notifempty
create 644 root root
}
EOF
# 手动运行logrotate
logrotate -f /etc/logrotate.conf
# 测试logrotate配置
logrotate -d /etc/logrotate.conf
- #### 性能监控工具
- - 系统性能监控
- ```bash
- # 显示系统资源使用情况
- top
-
- # 显示更详细的进程信息
- htop
-
- # 显示内存使用情况
- free -h
-
- # 显示磁盘I/O统计
- iostat
-
- # 显示网络统计
- netstat -s
-
- # 显示CPU使用情况
- mpstat
-
- # 显示虚拟内存统计
- vmstat
-
- # 显示进程内存使用情况
- ps aux --sort=-%mem | head -n 10
-
- # 显示进程CPU使用情况
- ps aux --sort=-%cpu | head -n 10
复制代码
• 磁盘性能监控
“`bash显示磁盘I/O统计iostat -x 1
磁盘性能监控
“`bash
iostat -x 1
# 显示磁盘使用情况
df -h
# 显示目录大小
du -sh /path/to/directory
# 显示inode使用情况
df -i
# 显示磁盘性能
hdparm -Tt /dev/sda
# 显示文件系统性能
bonnie++ -d /tmp -s 1G -r 256 -u root
- - 网络性能监控
- ```bash
- # 显示网络连接
- netstat -an
-
- # 显示网络接口统计
- netstat -i
-
- # 显示网络路由表
- netstat -rn
-
- # 显示网络套接字统计
- ss -s
-
- # 显示网络带宽使用
- iftop
-
- # 显示网络连接监控
- nethogs
-
- # 显示网络延迟
- ping -c 4 example.com
-
- # 显示网络路径
- traceroute example.com
复制代码
• 系统启动问题
“`bash检查启动日志dmesg | less
系统启动问题
“`bash
dmesg | less
# 检查启动服务
ls /etc/rc.d/
# 检查启动脚本
cat /etc/rc.d/rc.M
# 检查fstab
cat /etc/fstab
# 检查grub配置
cat /boot/grub/menu.lst
# 修复grub
grub-install /dev/sda
# 检查initrd
ls /boot/initrd*
# 重建initrd
mkinitrd -o /boot/initrd.gz-\((uname -r) \)(uname -r)
- - 内存问题
- ```bash
- # 检查内存使用
- free -h
-
- # 检查进程内存使用
- ps aux --sort=-%mem | head -n 10
-
- # 检查内存泄漏
- valgrind --leak-check=full ./program
-
- # 清理缓存
- sync; echo 3 > /proc/sys/vm/drop_caches
-
- # 检查OOM Killer日志
- dmesg | grep -i "oom-killer"
-
- # 调整OOM Killer设置
- echo -100 > /proc/$(pidof process)/oom_score_adj
复制代码
• 磁盘空间问题
“`bash检查磁盘使用df -h
磁盘空间问题
“`bash
df -h
# 查找大文件
find / -type f -size +100M -exec ls -lh {} \; 2>/dev/null | sort -k5 -hr
# 查找大目录
du -h / | grep ‘[0-9]+G’ | sort -hr
# 清理旧日志
find /var/log -type f -name “*.gz” -delete
# 清理临时文件
rm -rf /tmp/*
# 清理软件包缓存
slackpkg clean-system
# 清理旧内核
ls /boot/vmlinuz* | sort -V | head -n -1 | xargs -I {} sh -c ‘rm -f $(echo {} | sed “s/vmlinuz/System.map/; s/vmlinuz/config/; s/vmlinuz/initrd.gz/”) {}’
- ## 四、实用案例
- ### 1. 批量文件处理
- 在系统管理中,经常需要批量处理文件,例如重命名、移动或修改大量文件。
- #### 批量重命名文件
- ```bash
- # 将所有.txt文件重命名为.bak
- for file in *.txt; do
- mv "$file" "${file%.txt}.bak"
- done
- # 将文件名中的空格替换为下划线
- for file in *; do
- if [[ "$file" == *" "* ]]; then
- mv "$file" "${file// /_}"
- fi
- done
- # 为所有文件添加前缀
- prefix="new_"
- for file in *; do
- if [ -f "$file" ]; then
- mv "$file" "${prefix}${file}"
- fi
- done
- # 批量修改文件扩展名
- for file in *.html; do
- mv "$file" "${file%.html}.php"
- done
复制代码- # 在所有.txt文件中替换文本
- for file in *.txt; do
- sed -i 's/old_text/new_text/g' "$file"
- done
- # 在所有.txt文件的开头添加一行
- for file in *.txt; do
- sed -i '1i\This is a new first line' "$file"
- done
- # 在所有.txt文件的末尾添加一行
- for file in *.txt; do
- echo "This is a new last line" >> "$file"
- done
- # 删除所有.txt文件中的空行
- for file in *.txt; do
- sed -i '/^$/d' "$file"
- done
复制代码- # 为所有.sh文件添加执行权限
- chmod +x *.sh
- # 递归设置目录权限为755,文件权限为644
- find . -type d -exec chmod 755 {} \;
- find . -type f -exec chmod 644 {} \;
- # 为特定用户设置文件所有权
- chown -R user:group /path/to/directory
- # 为所有.cgi文件设置特定权限
- find . -name "*.cgi" -exec chmod 755 {} \;
复制代码
2. 系统监控和报告生成
系统监控是确保系统稳定运行的关键,定期生成报告可以帮助管理员了解系统状态。
- #!/bin/bash
- # 系统资源监控脚本
- # 生成系统资源使用报告
- REPORT_FILE="/var/log/system_report_$(date +%Y%m%d).txt"
- EMAIL="admin@example.com"
- # 创建报告文件
- echo "System Resource Report - $(date)" > "$REPORT_FILE"
- echo "=================================" >> "$REPORT_FILE"
- echo "" >> "$REPORT_FILE"
- # 系统信息
- echo "System Information" >> "$REPORT_FILE"
- echo "------------------" >> "$REPORT_FILE"
- echo "Hostname: $(hostname)" >> "$REPORT_FILE"
- echo "OS: $(cat /etc/os-release | grep PRETTY_NAME | cut -d= -f2 | tr -d '"')" >> "$REPORT_FILE"
- echo "Kernel: $(uname -r)" >> "$REPORT_FILE"
- echo "Uptime: $(uptime -p)" >> "$REPORT_FILE"
- echo "" >> "$REPORT_FILE"
- # CPU信息
- echo "CPU Information" >> "$REPORT_FILE"
- echo "--------------" >> "$REPORT_FILE"
- echo "CPU Model: $(grep 'model name' /proc/cpuinfo | head -n1 | cut -d: -f2 | xargs)" >> "$REPORT_FILE"
- echo "CPU Cores: $(grep 'processor' /proc/cpuinfo | wc -l)" >> "$REPORT_FILE"
- echo "CPU Load: $(uptime | awk -F'load average:' '{print $2}')" >> "$REPORT_FILE"
- echo "" >> "$REPORT_FILE"
- # 内存信息
- echo "Memory Information" >> "$REPORT_FILE"
- echo "-----------------" >> "$REPORT_FILE"
- free -h >> "$REPORT_FILE"
- echo "" >> "$REPORT_FILE"
- # 磁盘信息
- echo "Disk Information" >> "$REPORT_FILE"
- echo "---------------" >> "$REPORT_FILE"
- df -h >> "$REPORT_FILE"
- echo "" >> "$REPORT_FILE"
- # 网络信息
- echo "Network Information" >> "$REPORT_FILE"
- echo "------------------" >> "$REPORT_FILE"
- ip addr show >> "$REPORT_FILE"
- echo "" >> "$REPORT_FILE"
- netstat -tuln | grep LISTEN >> "$REPORT_FILE"
- echo "" >> "$REPORT_FILE"
- # 进程信息
- echo "Top Processes by CPU" >> "$REPORT_FILE"
- echo "---------------------" >> "$REPORT_FILE"
- ps aux --sort=-%cpu | head -n 10 >> "$REPORT_FILE"
- echo "" >> "$REPORT_FILE"
- echo "Top Processes by Memory" >> "$REPORT_FILE"
- echo "-----------------------" >> "$REPORT_FILE"
- ps aux --sort=-%mem | head -n 10 >> "$REPORT_FILE"
- echo "" >> "$REPORT_FILE"
- # 发送报告邮件
- if command -v mail &> /dev/null; then
- cat "$REPORT_FILE" | mail -s "System Resource Report - $(date +%Y%m%d)" "$EMAIL"
- echo "Report sent to $EMAIL"
- fi
- echo "Report saved to $REPORT_FILE"
复制代码- #!/bin/bash
- # 日志分析脚本
- # 分析Apache访问日志并生成报告
- LOG_FILE="/var/log/apache2/access.log"
- REPORT_FILE="/var/log/apache2_analysis_$(date +%Y%m%d).txt"
- EMAIL="admin@example.com"
- # 检查日志文件是否存在
- if [ ! -f "$LOG_FILE" ]; then
- echo "Log file $LOG_FILE does not exist!"
- exit 1
- fi
- # 创建报告文件
- echo "Apache Log Analysis Report - $(date)" > "$REPORT_FILE"
- echo "=====================================" >> "$REPORT_FILE"
- echo "" >> "$REPORT_FILE"
- # 分析日志
- echo "Total requests: $(wc -l < "$LOG_FILE")" >> "$REPORT_FILE"
- echo "" >> "$REPORT_FILE"
- echo "Top 10 IP addresses:" >> "$REPORT_FILE"
- awk '{print $1}' "$LOG_FILE" | sort | uniq -c | sort -nr | head -n 10 >> "$REPORT_FILE"
- echo "" >> "$REPORT_FILE"
- echo "Top 10 requested pages:" >> "$REPORT_FILE"
- awk '{print $7}' "$LOG_FILE" | sort | uniq -c | sort -nr | head -n 10 >> "$REPORT_FILE"
- echo "" >> "$REPORT_FILE"
- echo "Top 10 HTTP status codes:" >> "$REPORT_FILE"
- awk '{print $9}' "$LOG_FILE" | sort | uniq -c | sort -nr | head -n 10 >> "$REPORT_FILE"
- echo "" >> "$REPORT_FILE"
- echo "Top 10 user agents:" >> "$REPORT_FILE"
- awk -F'"' '{print $6}' "$LOG_FILE" | sort | uniq -c | sort -nr | head -n 10 >> "$REPORT_FILE"
- echo "" >> "$REPORT_FILE"
- echo "Error requests (4xx and 5xx status codes): $(awk '$9 ~ /^[45]/ {print $0}' "$LOG_FILE" | wc -l)" >> "$REPORT_FILE"
- echo "" >> "$REPORT_FILE"
- echo "Bandwidth usage: $(awk '{sum += $10} END {print sum}' "$LOG_FILE") bytes" >> "$REPORT_FILE"
- echo "" >> "$REPORT_FILE"
- # 发送报告邮件
- if command -v mail &> /dev/null; then
- cat "$REPORT_FILE" | mail -s "Apache Log Analysis Report - $(date +%Y%m%d)" "$EMAIL"
- echo "Report sent to $EMAIL"
- fi
- echo "Report saved to $REPORT_FILE"
复制代码
3. 自动化备份
自动化备份是数据保护的重要措施,可以定期备份重要数据以防数据丢失。
- #!/bin/bash
- # 完整备份脚本
- # 备份系统中的重要文件和目录
- # 配置
- BACKUP_DIR="/backup"
- SOURCE_DIRS=("/etc" "/home" "/var/www" "/usr/local")
- EXCLUDE_DIRS=("/home/user/tmp" "/home/user/downloads")
- DATE=$(date +%Y%m%d_%H%M%S)
- BACKUP_NAME="full_backup_$DATE.tar.gz"
- LOG_FILE="/var/log/backup_$DATE.log"
- EMAIL="admin@example.com"
- # 创建备份目录
- mkdir -p "$BACKUP_DIR"
- # 创建排除文件
- EXCLUDE_FILE="/tmp/backup_exclude_$DATE.txt"
- for dir in "${EXCLUDE_DIRS[@]}"; do
- echo "$dir" >> "$EXCLUDE_FILE"
- done
- # 开始备份
- echo "Starting backup at $(date)" > "$LOG_FILE"
- echo "Backup name: $BACKUP_NAME" >> "$LOG_FILE"
- echo "" >> "$LOG_FILE"
- # 执行备份
- tar -czf "$BACKUP_DIR/$BACKUP_NAME" \
- --exclude-from="$EXCLUDE_FILE" \
- "${SOURCE_DIRS[@]}" 2>> "$LOG_FILE"
- # 检查备份是否成功
- if [ $? -eq 0 ]; then
- echo "Backup completed successfully at $(date)" >> "$LOG_FILE"
-
- # 计算备份大小
- BACKUP_SIZE=$(du -h "$BACKUP_DIR/$BACKUP_NAME" | cut -f1)
- echo "Backup size: $BACKUP_SIZE" >> "$LOG_FILE"
-
- # 保留最近5个备份,删除旧的备份
- cd "$BACKUP_DIR"
- ls -t full_backup_*.tar.gz | tail -n +6 | xargs rm -f
- echo "Old backups removed, keeping only the 5 most recent ones." >> "$LOG_FILE"
-
- # 发送成功通知
- if command -v mail &> /dev/null; then
- cat "$LOG_FILE" | mail -s "Backup Success - $BACKUP_NAME" "$EMAIL"
- fi
- else
- echo "Backup failed at $(date)" >> "$LOG_FILE"
-
- # 发送失败通知
- if command -v mail &> /dev/null; then
- cat "$LOG_FILE" | mail -s "Backup Failed - $BACKUP_NAME" "$EMAIL"
- fi
-
- exit 1
- fi
- # 清理临时文件
- rm -f "$EXCLUDE_FILE"
- echo "Backup process completed."
复制代码- #!/bin/bash
- # 增量备份脚本
- # 基于rsync的增量备份
- # 配置
- BACKUP_DIR="/backup"
- SOURCE_DIR="/home/user"
- DATE=$(date +%Y%m%d_%H%M%S)
- CURRENT_LINK="current"
- BACKUP_NAME="backup_$DATE"
- LOG_FILE="/var/log/backup_$DATE.log"
- EMAIL="admin@example.com"
- # 创建备份目录
- mkdir -p "$BACKUP_DIR"
- # 检查是否存在当前备份链接
- if [ -L "$BACKUP_DIR/$CURRENT_LINK" ]; then
- PREVIOUS_BACKUP=$(readlink "$BACKUP_DIR/$CURRENT_LINK")
- else
- PREVIOUS_BACKUP=""
- fi
- # 开始备份
- echo "Starting backup at $(date)" > "$LOG_FILE"
- echo "Backup name: $BACKUP_NAME" >> "$LOG_FILE"
- echo "Previous backup: $PREVIOUS_BACKUP" >> "$LOG_FILE"
- echo "" >> "$LOG_FILE"
- # 执行增量备份
- if [ -n "$PREVIOUS_BACKUP" ]; then
- # 增量备份
- rsync -a --delete --link-dest="$BACKUP_DIR/$PREVIOUS_BACKUP" \
- "$SOURCE_DIR/" "$BACKUP_DIR/$BACKUP_NAME/" 2>> "$LOG_FILE"
- else
- # 完整备份
- rsync -a --delete "$SOURCE_DIR/" "$BACKUP_DIR/$BACKUP_NAME/" 2>> "$LOG_FILE"
- fi
- # 检查备份是否成功
- if [ $? -eq 0 ]; then
- echo "Backup completed successfully at $(date)" >> "$LOG_FILE"
-
- # 更新当前备份链接
- cd "$BACKUP_DIR"
- rm -f "$CURRENT_LINK"
- ln -s "$BACKUP_NAME" "$CURRENT_LINK"
-
- # 计算备份大小
- BACKUP_SIZE=$(du -sh "$BACKUP_DIR/$BACKUP_NAME" | cut -f1)
- echo "Backup size: $BACKUP_SIZE" >> "$LOG_FILE"
-
- # 发送成功通知
- if command -v mail &> /dev/null; then
- cat "$LOG_FILE" | mail -s "Backup Success - $BACKUP_NAME" "$EMAIL"
- fi
- else
- echo "Backup failed at $(date)" >> "$LOG_FILE"
-
- # 发送失败通知
- if command -v mail &> /dev/null; then
- cat "$LOG_FILE" | mail -s "Backup Failed - $BACKUP_NAME" "$EMAIL"
- fi
-
- exit 1
- fi
- echo "Backup process completed."
复制代码- #!/bin/bash
- # 数据库备份脚本
- # 备份MySQL/MariaDB数据库
- # 配置
- BACKUP_DIR="/backup/db"
- DATE=$(date +%Y%m%d_%H%M%S)
- LOG_FILE="/var/log/db_backup_$DATE.log"
- EMAIL="admin@example.com"
- MYSQL_USER="backup_user"
- MYSQL_PASSWORD="backup_password"
- DATABASES=("database1" "database2")
- # 创建备份目录
- mkdir -p "$BACKUP_DIR"
- # 开始备份
- echo "Starting database backup at $(date)" > "$LOG_FILE"
- echo "" >> "$LOG_FILE"
- # 备份每个数据库
- for DB in "${DATABASES[@]}"; do
- echo "Backing up database: $DB" >> "$LOG_FILE"
-
- # 执行备份
- mysqldump --user="$MYSQL_USER" --password="$MYSQL_PASSWORD" \
- --single-transaction --routines --triggers "$DB" > \
- "$BACKUP_DIR/${DB}_$DATE.sql" 2>> "$LOG_FILE"
-
- # 检查备份是否成功
- if [ $? -eq 0 ]; then
- # 压缩备份文件
- gzip "$BACKUP_DIR/${DB}_$DATE.sql"
-
- # 计算备份大小
- BACKUP_SIZE=$(du -h "$BACKUP_DIR/${DB}_$DATE.sql.gz" | cut -f1)
- echo "Backup completed successfully. Size: $BACKUP_SIZE" >> "$LOG_FILE"
- else
- echo "Backup failed for database: $DB" >> "$LOG_FILE"
- fi
-
- echo "" >> "$LOG_FILE"
- done
- # 保留最近7天的备份,删除旧的备份
- find "$BACKUP_DIR" -name "*.sql.gz" -mtime +7 -delete >> "$LOG_FILE" 2>&1
- echo "Old backups removed, keeping only the 7 most recent ones." >> "$LOG_FILE"
- # 发送通知
- if command -v mail &> /dev/null; then
- cat "$LOG_FILE" | mail -s "Database Backup Report - $(date +%Y%m%d)" "$EMAIL"
- fi
- echo "Database backup process completed."
复制代码
4. 远程系统管理
远程系统管理是Linux管理员的重要技能,特别是在管理多台服务器时。
- #!/bin/bash
- # 批量远程执行命令脚本
- # 在多台远程服务器上执行相同的命令
- # 服务器列表
- SERVERS=(
- "server1.example.com"
- "server2.example.com"
- "server3.example.com"
- )
- # SSH用户
- SSH_USER="admin"
- # SSH密钥
- SSH_KEY="/home/user/.ssh/id_rsa"
- # 要执行的命令
- COMMAND="uptime; df -h; free -h"
- # 日志文件
- LOG_FILE="/var/log/remote_command_$(date +%Y%m%d_%H%M%S).log"
- # 开始执行
- echo "Starting remote command execution at $(date)" > "$LOG_FILE"
- echo "Command: $COMMAND" >> "$LOG_FILE"
- echo "" >> "$LOG_FILE"
- # 在每台服务器上执行命令
- for SERVER in "${SERVERS[@]}"; do
- echo "Executing on $SERVER:" >> "$LOG_FILE"
- echo "====================" >> "$LOG_FILE"
-
- # 执行命令并记录输出
- ssh -i "$SSH_KEY" -o StrictHostKeyChecking=no -o BatchMode=yes \
- "$SSH_USER@$SERVER" "$COMMAND" >> "$LOG_FILE" 2>&1
-
- echo "" >> "$LOG_FILE"
- echo "" >> "$LOG_FILE"
- done
- echo "Remote command execution completed at $(date)" >> "$LOG_FILE"
- echo "Results saved to $LOG_FILE"
复制代码- #!/bin/bash
- # 批量文件传输脚本
- # 将文件传输到多台远程服务器
- # 服务器列表
- SERVERS=(
- "server1.example.com"
- "server2.example.com"
- "server3.example.com"
- )
- # SSH用户
- SSH_USER="admin"
- # SSH密钥
- SSH_KEY="/home/user/.ssh/id_rsa"
- # 要传输的文件
- SOURCE_FILE="/path/to/local/file.txt"
- # 远程目标路径
- REMOTE_PATH="/path/to/remote/"
- # 日志文件
- LOG_FILE="/var/log/file_transfer_$(date +%Y%m%d_%H%M%S).log"
- # 开始传输
- echo "Starting file transfer at $(date)" > "$LOG_FILE"
- echo "Source file: $SOURCE_FILE" >> "$LOG_FILE"
- echo "Remote path: $REMOTE_PATH" >> "$LOG_FILE"
- echo "" >> "$LOG_FILE"
- # 传输到每台服务器
- for SERVER in "${SERVERS[@]}"; do
- echo "Transferring to $SERVER:" >> "$LOG_FILE"
- echo "=====================" >> "$LOG_FILE"
-
- # 传输文件并记录输出
- scp -i "$SSH_KEY" -o StrictHostKeyChecking=no -o BatchMode=yes \
- "$SOURCE_FILE" "$SSH_USER@$SERVER:$REMOTE_PATH" >> "$LOG_FILE" 2>&1
-
- # 检查传输是否成功
- if [ $? -eq 0 ]; then
- echo "Transfer to $SERVER completed successfully." >> "$LOG_FILE"
- else
- echo "Transfer to $SERVER failed." >> "$LOG_FILE"
- fi
-
- echo "" >> "$LOG_FILE"
- done
- echo "File transfer completed at $(date)" >> "$LOG_FILE"
- echo "Results saved to $LOG_FILE"
复制代码- #!/bin/bash
- # 远程系统监控脚本
- # 监控多台远程服务器的系统状态
- # 服务器列表
- SERVERS=(
- "server1.example.com"
- "server2.example.com"
- "server3.example.com"
- )
- # SSH用户
- SSH_USER="admin"
- # SSH密钥
- SSH_KEY="/home/user/.ssh/id_rsa"
- # 报告文件
- REPORT_FILE="/var/log/remote_monitoring_$(date +%Y%m%d).txt"
- EMAIL="admin@example.com"
- # 创建报告文件
- echo "Remote System Monitoring Report - $(date)" > "$REPORT_FILE"
- echo "=====================================" >> "$REPORT_FILE"
- echo "" >> "$REPORT_FILE"
- # 监控每台服务器
- for SERVER in "${SERVERS[@]}"; do
- echo "Server: $SERVER" >> "$REPORT_FILE"
- echo "==========" >> "$REPORT_FILE"
-
- # 获取系统信息
- ssh -i "$SSH_KEY" -o StrictHostKeyChecking=no -o BatchMode=yes \
- "$SSH_USER@$SERVER" "
- echo 'Hostname: \$(hostname)';
- echo 'Uptime: \$(uptime -p)';
- echo '';
- echo 'CPU Load: \$(uptime | awk -F"load average:" '{print \$2}')';
- echo '';
- echo 'Memory Usage:';
- free -h;
- echo '';
- echo 'Disk Usage:';
- df -h;
- echo '';
- echo 'Top Processes by CPU:';
- ps aux --sort=-%cpu | head -n 6;
- echo '';
- echo 'Top Processes by Memory:';
- ps aux --sort=-%mem | head -n 6;
- echo '';
- echo 'Network Connections:';
- netstat -tuln | grep LISTEN | head -n 10;
- echo '';
- echo '----------------------------------------';
- echo ''
- " >> "$REPORT_FILE" 2>&1
- done
- # 发送报告邮件
- if command -v mail &> /dev/null; then
- cat "$REPORT_FILE" | mail -s "Remote System Monitoring Report - $(date +%Y%m%d)" "$EMAIL"
- echo "Report sent to $EMAIL"
- fi
- echo "Report saved to $REPORT_FILE"
复制代码
五、总结
本教程全面介绍了Slackware Linux命令行操作的基础知识、中级技能和高级技巧,从文件和目录操作到系统监控和远程管理,涵盖了Linux系统管理的各个方面。通过学习这些内容,你已经掌握了成为Linux高手所需的核心技能。
命令行操作是Linux系统管理的基石,它不仅提供了比图形界面更高的效率,还能实现自动化和批量处理,大大提高了系统管理的效率。特别是在处理大量服务器或复杂任务时,命令行工具的优势更加明显。
要真正成为Linux高手,仅仅掌握这些命令和技巧是不够的,还需要不断实践和探索。以下是一些建议:
1. 日常使用命令行:尽量使用命令行完成日常任务,而不是依赖图形界面。这样可以加深对命令的理解和记忆。
2. 阅读手册页:使用man命令查看命令的手册页,了解所有可用的选项和用法。
3. 编写脚本:将重复性的任务编写成脚本,提高工作效率。从简单的脚本开始,逐步增加复杂度。
4. 参与社区:加入Slackware和Linux社区,与其他用户交流经验和技巧。
5. 探索新工具:Linux生态系统中有许多强大的工具,不断学习和尝试新的工具可以扩展你的技能。
6. 实践故障排除:当遇到问题时,尝试自己解决,而不是立即寻求帮助。这样可以提高你的故障排除能力。
7. 学习系统内部工作原理:了解Linux系统的内部工作原理,如文件系统、进程管理、内存管理等,可以帮助你更好地理解和解决问题。
日常使用命令行:尽量使用命令行完成日常任务,而不是依赖图形界面。这样可以加深对命令的理解和记忆。
阅读手册页:使用man命令查看命令的手册页,了解所有可用的选项和用法。
编写脚本:将重复性的任务编写成脚本,提高工作效率。从简单的脚本开始,逐步增加复杂度。
参与社区:加入Slackware和Linux社区,与其他用户交流经验和技巧。
探索新工具:Linux生态系统中有许多强大的工具,不断学习和尝试新的工具可以扩展你的技能。
实践故障排除:当遇到问题时,尝试自己解决,而不是立即寻求帮助。这样可以提高你的故障排除能力。
学习系统内部工作原理:了解Linux系统的内部工作原理,如文件系统、进程管理、内存管理等,可以帮助你更好地理解和解决问题。
通过不断学习和实践,你将能够更加高效地管理Slackware Linux系统,成为一名真正的Linux高手。记住,命令行操作是一项技能,需要时间和耐心来掌握,但一旦掌握,它将成为你强大的工具,帮助你应对各种系统管理挑战。
最后,Slackware Linux作为一个稳定、简洁的发行版,是学习Linux系统管理的理想平台。它的设计理念接近传统的Unix系统,可以帮助你建立扎实的Linux基础。希望本教程能够帮助你在Slackware Linux的旅程中取得成功! |
|