全面掌握Fedora高级命令使用技巧从基础到进阶提升Linux系统管理效率解决实际问题成为专业用户必学完全指南助你成为Linux系统管理专家
引言
Fedora是Red Hat赞助的社区支持的Linux发行版,以其创新性和先进技术而闻名。作为许多企业级Linux系统(如RHEL和CentOS)的上游测试平台,Fedora提供了最新的软件包和技术特性。对于任何希望成为Linux系统管理专家的人来说,掌握Fedora的命令行操作是必不可少的技能。
命令行界面(CLI)是Linux系统管理的核心,它提供了图形界面无法比拟的灵活性和效率。通过命令行,系统管理员可以快速执行复杂任务、自动化重复操作、远程管理系统,并进行精确的系统调优。本指南将带你从基础命令到高级技巧,全面掌握Fedora系统管理,助你成为Linux系统管理专家。
基础命令回顾
在深入高级技巧之前,让我们快速回顾一些基础命令,这些命令是日常系统管理的基石。
文件与目录操作
ls
:列出目录内容ls -l # 以长格式显示文件详细信息 ls -a # 显示所有文件,包括隐藏文件 ls -h # 以人类可读格式显示文件大小
cd
:切换目录cd /path/to/directory # 切换到指定目录 cd ~ # 切换到用户主目录 cd .. # 切换到上一级目录 cd - # 切换到上一个工作目录
pwd
:显示当前工作目录的完整路径mkdir
:创建目录mkdir new_directory # 创建新目录 mkdir -p path/to/directory # 创建多级目录
rm
:删除文件或目录rm file.txt # 删除文件 rm -r directory # 递归删除目录及其内容 rm -f file.txt # 强制删除文件,不提示确认
cp
:复制文件或目录cp source.txt destination.txt # 复制文件 cp -r source_dir destination_dir # 递归复制目录
mv
:移动或重命名文件/目录mv old_name.txt new_name.txt # 重命名文件 mv file.txt /path/to/dir/ # 移动文件到指定目录
系统信息查看
uname
:显示系统信息uname -a # 显示所有可用的系统信息
lsb_release
:显示Linux发行版信息lsb_release -a # 显示所有发行版信息
cat /etc/redhat-release
:查看Red Hat系Linux版本信息
文件与目录管理高级技巧
高效的目录导航
使用CDPATH
变量可以设置多个基目录,当使用cd
命令时,系统会在这些目录中搜索子目录,方便快速切换工作环境。
export CDPATH=/var/www:/home/user/projects cd myproject # 系统会在当前目录、/var/www和/home/user/projects中查找myproject目录
目录堆栈管理
dirs
、pushd
和popd
命令用于管理目录堆栈,方便在多个目录间导航。
dirs # 显示当前目录堆栈 pushd /var/log # 将当前目录压入堆栈,并切换到/var/log pushd /etc # 将/var/log压入堆栈,并切换到/etc popd # 弹出堆栈顶目录,并切换到该目录
高级文件查找
find
命令是Linux中最强大的文件查找工具之一,可以根据各种条件查找文件。
# 按名称查找文件 find /home -name "*.txt" # 按大小查找文件(大于100MB) find /var -size +100M # 查找最近7天内修改过的文件 find /home -mtime -7 # 查找空文件或目录 find /tmp -empty # 查找并执行操作(删除所有.tmp文件) find /home -name "*.tmp" -delete # 查找并执行命令(将所有.txt文件权限设置为644) find /home -name "*.txt" -exec chmod 644 {} ;
locate
命令是另一个快速查找文件的工具,它使用预建的数据库进行搜索,比find
更快但可能不是最新的。
# 更新文件数据库 sudo updatedb # 查找文件 locate myfile.txt
文件内容搜索与处理
grep
是强大的文本搜索工具,可以搜索文件中的特定模式。
# 在文件中搜索特定文本 grep "error" /var/log/messages # 递归搜索目录中的文件 grep -r "function" /home/user/projects/ # 显示匹配行及其行号 grep -n "warning" /var/log/syslog # 显示不包含匹配模式的行 grep -v "debug" /var/log/app.log # 只显示匹配模式的文件名 grep -l "TODO" /home/user/projects/*.py
sed
(流编辑器)用于对文本文件进行自动编辑。
# 替换文件中的文本(将"old"替换为"new") sed 's/old/new/g' file.txt # 直接修改文件(替换并保存) sed -i 's/old/new/g' file.txt # 删除包含特定模式的行 sed '/pattern/d' file.txt # 只显示匹配模式的行 sed -n '/pattern/p' file.txt
awk
是一个强大的文本分析工具,适合处理列数据。
# 打印文件的第一列 awk '{print $1}' file.txt # 打印包含特定模式的行的第三列 awk '/pattern/ {print $3}' file.txt # 计算文件中行的数量 awk 'END {print NR}' file.txt # 求和第二列的值 awk '{sum += $2} END {print sum}' file.txt
文件压缩与归档
tar
命令用于创建和提取归档文件。
# 创建归档文件 tar -cvf archive.tar file1 file2 directory/ # 创建并压缩归档文件(gzip格式) tar -czvf archive.tar.gz file1 file2 directory/ # 创建并压缩归档文件(bzip2格式) tar -cjvf archive.tar.bz2 file1 file2 directory/ # 提取归档文件 tar -xvf archive.tar # 提取并解压gzip格式的归档文件 tar -xzvf archive.tar.gz # 提取并解压bzip2格式的归档文件 tar -xjvf archive.tar.bz2 # 查看归档文件内容 tar -tvf archive.tar
gzip
和gunzip
用于压缩和解压.gz文件。
# 压缩文件 gzip file.txt # 解压文件 gunzip file.txt.gz # 压缩时保留原文件 gzip -c file.txt > file.txt.gz
zip
和unzip
用于处理.zip格式的压缩文件。
# 创建zip压缩文件 zip -r archive.zip directory/ # 解压zip文件 unzip archive.zip # 查看zip文件内容 unzip -l archive.zip
系统监控与进程管理
系统资源监控
top
命令实时显示系统中进程的动态。
top # 启动top命令
在top界面中,可以使用以下快捷键:
M
:按内存使用排序P
:按CPU使用排序k
:杀死进程r
:重新设置进程优先级q
:退出top
htop
是top
的增强版,提供了更友好的界面和更多功能。
htop # 启动htop命令
free
命令显示内存使用情况。
free # 以字节为单位显示内存使用情况 free -h # 以人类可读格式显示内存使用情况 free -m # 以MB为单位显示内存使用情况 free -g # 以GB为单位显示内存使用情况
df
命令显示磁盘空间使用情况。
df # 显示磁盘空间使用情况 df -h # 以人类可读格式显示 df -T # 显示文件系统类型 df -i # 显示inode使用情况
du
命令显示目录或文件的磁盘使用情况。
du # 显示当前目录下每个子目录的磁盘使用情况 du -h # 以人类可读格式显示 du -sh # 显示当前目录的总大小 du -sh * # 显示当前目录下每个文件和目录的大小
进程管理
ps
命令显示当前进程的状态。
ps # 显示当前用户的进程 ps aux # 显示所有运行的进程 ps -ef # 显示所有进程的完整信息 ps aux --sort=-%cpu # 按CPU使用率降序排列进程 ps aux --sort=-%mem # 按内存使用率降序排列进程
kill
命令用于终止进程。
kill PID # 终止指定PID的进程 kill -9 PID # 强制终止指定PID的进程 killall process_name # 终止所有指定名称的进程
pgrep
和pkill
命令用于查找和终止进程。
pgrep process_name # 查找指定名称的进程PID pkill process_name # 终止所有指定名称的进程 pkill -f "command_pattern" # 终止命令匹配指定模式的进程
nice
和renice
命令用于调整进程优先级。
nice -n 10 command # 以优先级10启动命令 renice 10 -p PID # 将指定PID的进程优先级调整为10
系统性能分析
iostat
命令用于监控系统输入/输出设备负载。
iostat # 显示CPU统计信息和所有设备的平均传输率 iostat -x # 显示扩展统计信息 iostat 2 5 # 每2秒显示一次,共显示5次
vmstat
命令用于报告虚拟内存统计信息。
vmstat # 显示虚拟内存统计信息 vmstat 2 5 # 每2秒显示一次,共显示5次 vmstat -s # 显示事件计数器和内存统计
sar
命令用于收集、报告和保存系统活动信息。
sar # 显示CPU使用情况 sar -r # 显示内存使用情况 sar -b # 显示I/O和传输速率信息 sar -n DEV # 显示网络使用情况
网络配置与故障排除
网络接口配置
ip
命令是现代Linux系统中用于网络配置的强大工具。
# 显示所有网络接口信息 ip addr show # 显示特定接口信息 ip addr show eth0 # 为接口分配IP地址 ip addr add 192.168.1.100/24 dev eth0 # 启用网络接口 ip link set eth0 up # 禁用网络接口 ip link set eth0 down # 显示路由表 ip route show # 添加默认路由 ip route add default via 192.168.1.1 # 添加静态路由 ip route add 192.168.2.0/24 via 192.168.1.1
ifconfig
是传统的网络接口配置工具,虽然已被ip
命令取代,但仍在广泛使用。
# 显示所有网络接口信息 ifconfig -a # 显示特定接口信息 ifconfig eth0 # 为接口分配IP地址 ifconfig eth0 192.168.1.100 netmask 255.255.255.0 # 启用网络接口 ifconfig eth0 up # 禁用网络接口 ifconfig eth0 down
网络连接与诊断
ping
命令用于测试网络连接。
ping example.com # 持续ping目标主机 ping -c 4 example.com # 只发送4个ping包 ping -i 2 example.com # 每2秒发送一个ping包 ping -s 1024 example.com # 发送1024字节的数据包
traceroute
命令用于显示数据包到达目标主机所经过的路径。
traceroute example.com
mtr
命令结合了ping
和traceroute
的功能,提供实时的网络诊断。
mtr example.com
netstat
命令用于显示网络状态信息。
netstat -tulpn # 显示所有监听的TCP和UDP端口 netstat -an # 显示所有网络连接 netstat -s # 显示网络统计信息 netstat -i # 显示网络接口统计信息 netstat -r # 显示路由表
ss
命令是netstat
的现代替代品,提供更快速和更详细的网络信息。
ss -tulpn # 显示所有监听的TCP和UDP端口 ss -a # 显示所有网络连接 ss -s # 显示网络统计信息 ss -i # 显示网络接口信息
网络抓包与分析
tcpdump
命令用于捕获网络数据包。
tcpdump -i eth0 # 捕获eth0接口上的所有数据包 tcpdump -i eth0 port 80 # 捕获eth0接口上端口80的数据包 tcpdump -i eth0 host 192.168.1.100 # 捕获与特定主机的通信 tcpdump -w capture.pcap # 将捕获的数据包保存到文件 tcpdump -r capture.pcap # 从文件读取数据包
wireshark
是功能强大的网络协议分析工具,虽然主要是图形界面,但也提供了命令行版本tshark
。
tshark -i eth0 # 捕获eth0接口上的数据包 tshark -i eth0 port 80 # 捕获eth0接口上端口80的数据包 tshark -r capture.pcap # 从文件读取数据包 tshark -r capture.pcap -V # 显示数据包的详细信息
网络安全
iptables
是Linux系统中的防火墙工具。
# 显示所有防火墙规则 iptables -L # 允许特定端口的入站连接 iptables -A INPUT -p tcp --dport 22 -j ACCEPT # 拒绝特定IP的连接 iptables -A INPUT -s 192.168.1.100 -j DROP # 保存防火墙规则 service iptables save
firewalld
是Fedora中的动态防火墙管理器。
# 启动firewalld服务 systemctl start firewalld # 查看防火墙状态 firewall-cmd --state # 查看所有活动区域 firewall-cmd --get-active-zones # 查看默认区域 firewall-cmd --get-default-zone # 开放端口 firewall-cmd --permanent --add-port=80/tcp # 重新加载防火墙规则 firewall-cmd --reload
nmap
是网络扫描和安全审计工具。
nmap 192.168.1.100 # 扫描目标主机的常用端口 nmap -p 1-1000 192.168.1.100 # 扫描指定端口范围 nmap -sV 192.168.1.100 # 检测服务版本 nmap -O 192.168.1.100 # 检测操作系统类型 nmap -A 192.168.1.100 # 全面扫描,包括版本检测和脚本扫描
系统服务管理
systemd服务管理
systemctl
是Fedora中用于控制systemd系统和服务管理器的命令。
# 启动服务 systemctl start httpd # 停止服务 systemctl stop httpd # 重启服务 systemctl restart httpd # 重新加载服务配置 systemctl reload httpd # 启用服务(开机自启) systemctl enable httpd # 禁用服务(取消开机自启) systemctl disable httpd # 查看服务状态 systemctl status httpd # 查看所有活动服务 systemctl list-units --type=service --state=active # 查看服务是否启用 systemctl is-enabled httpd # 查看服务日志 journalctl -u httpd
系统运行级别管理
# 查看当前运行级别 systemctl get-default # 设置默认运行级别 systemctl set-default graphical.target # 切换到多用户模式(命令行) systemctl isolate multi-user.target # 切换到图形界面模式 systemctl isolate graphical.target
定时任务管理
cron
是Linux系统中的定时任务调度器。
# 编辑当前用户的定时任务 crontab -e # 列出当前用户的定时任务 crontab -l # 删除当前用户的定时任务 crontab -r # 编辑指定用户的定时任务 crontab -u username -e # 列出指定用户的定时任务 crontab -u username -l
crontab
文件格式:
分钟(0-59) 小时(0-23) 日期(1-31) 月份(1-12) 星期(0-7, 0和7都表示星期日) 命令
示例:
# 每天凌晨2点执行备份脚本 0 2 * * * /home/user/scripts/backup.sh # 每小时执行一次脚本 0 * * * * /home/user/scripts/hourly.sh # 每周一上午9点执行脚本 0 9 * * 1 /home/user/scripts/weekly.sh # 每15分钟执行一次脚本 */15 * * * * /home/user/scripts/frequent.sh
at
命令用于安排一次性任务。
# 在指定时间执行命令 at 10:30 PM # 在指定日期和时间执行命令 at 2:30 PM tomorrow # 从文件读取要执行的命令 at -f commands.txt 10:30 PM # 查看待执行的任务 atq # 删除待执行的任务 atrm job_number
权限与安全管理
文件权限管理
chmod
命令用于修改文件或目录的权限。
# 使用符号模式修改权限 chmod u+x file.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-- chmod 700 private_key # rwx------
权限数字表示法:
- 4 = 读®
- 2 = 写(w)
- 1 = 执行(x)
- 0 = 无权限
组合:
- 7 = 4+2+1 = rwx
- 6 = 4+2 = rw-
- 5 = 4+1 = r-x
- 4 = 4 = r–
- 3 = 2+1 = -wx
- 2 = 2 = -w-
- 1 = 1 = –x
- 0 = 0 = —
chown
命令用于修改文件或目录的所有者。
# 修改文件所有者 chown user file.txt # 修改文件所有者和组 chown user:group file.txt # 递归修改目录及其内容的所有者 chown -R user:group directory/
chgrp
命令用于修改文件或目录的组。
# 修改文件组 chgrp group file.txt # 递归修改目录及其内容的组 chgrp -R group directory/
特殊权限
SUID (Set User ID):
# 设置SUID权限 chmod u+s program # 删除SUID权限 chmod u-s program
SGID (Set Group ID):
# 设置SGID权限 chmod g+s directory # 删除SGID权限 chmod g-s directory
Sticky Bit:
# 设置Sticky Bit权限 chmod +t directory # 删除Sticky Bit权限 chmod -t directory
访问控制列表 (ACL)
getfacl
和setfacl
命令用于管理文件和目录的访问控制列表。
# 查看文件的ACL getfacl file.txt # 为用户设置ACL setfacl -m u:user:rwx file.txt # 为组设置ACL setfacl -m g:group:rx file.txt # 删除用户的ACL setfacl -x u:user file.txt # 删除组ACL setfacl -x g:group file.txt # 删除所有ACL setfacl -b file.txt # 递归设置目录及其内容的ACL setfacl -R -m u:user:rwx directory/
SELinux管理
SELinux (Security-Enhanced Linux) 是Fedora中的强制访问控制(MAC)系统。
# 查看SELinux状态 sestatus # 临时禁用SELinux setenforce 0 # 临时启用SELinux setenforce 1 # 查看文件或目录的SELinux上下文 ls -Z file.txt # 修改文件或目录的SELinux上下文 chcon -t httpd_sys_content_t /var/www/html/file.html # 恢复文件的默认SELinux上下文 restorecon -v file.txt # 递归恢复目录及其内容的默认SELinux上下文 restorecon -Rv /var/www/html/ # 查看SELinux布尔值 getsebool -a # 设置SELinux布尔值 setsebool -P httpd_can_network_connect_db on
系统安全审计
auditd
是Linux系统中的审计守护进程。
# 启动auditd服务 systemctl start auditd # 查看审计日志 ausearch -k login_attempts # 添加审计规则 auditctl -w /etc/passwd -p wa -k passwd_changes # 列出所有审计规则 auditctl -l # 删除所有审计规则 auditctl -D
高级文本处理
正则表达式
正则表达式是文本模式匹配的强大工具,在多个命令中都有应用。
基本正则表达式元字符:
.
:匹配任意单个字符*
:匹配前一个字符零次或多次^
:匹配行首$
:匹配行尾[]
:匹配指定范围内的任意字符[^]
:匹配不在指定范围内的任意字符:转义字符
扩展正则表达式元字符:
+
:匹配前一个字符一次或多次?
:匹配前一个字符零次或一次|
:或操作符()
:分组{n}
:匹配前一个字符恰好n次{n,}
:匹配前一个字符至少n次{n,m}
:匹配前一个字符至少n次,至多m次
高级grep技巧
# 使用扩展正则表达式 grep -E "pattern1|pattern2" file.txt # 只显示匹配模式的文件名 grep -l "pattern" *.txt # 显示不匹配模式的行 grep -v "pattern" file.txt # 显示匹配模式的行数 grep -c "pattern" file.txt # 显示匹配模式及其上下文(前后各2行) grep -C 2 "pattern" file.txt # 显示匹配模式及其后2行 grep -A 2 "pattern" file.txt # 显示匹配模式及其前2行 grep -B 2 "pattern" file.txt # 递归搜索目录中的文件 grep -r "pattern" /path/to/directory/ # 搜索二进制文件中的文本 grep -a "pattern" binary_file # 忽略大小写 grep -i "pattern" file.txt # 只显示完全匹配的行 grep -x "pattern" file.txt
高级sed技巧
# 替换文件中的文本(只替换每行的第一个匹配) sed 's/old/new/' file.txt # 替换文件中的所有匹配 sed 's/old/new/g' file.txt # 只替换第n个匹配 sed 's/old/new/2g' file.txt # 只替换包含特定模式的行 sed '/pattern/s/old/new/g' file.txt # 删除空行 sed '/^$/d' file.txt # 删除注释行 sed '/^#/d' file.txt # 在特定行后插入文本 sed '/pattern/aThis is a new line' file.txt # 在特定行前插入文本 sed '/pattern/iThis is a new line' file.txt # 替换特定行 sed '3s/.*/This is a replacement/' file.txt # 执行多个sed命令 sed -e 's/old/new/g' -e '/pattern/d' file.txt # 使用sed脚本文件 sed -f script.sed file.txt
高级awk技巧
# 打印文件的行数 awk 'END {print NR}' file.txt # 打印文件中最长的行 awk '{if (length($0) > max) {max = length($0); longest = $0}} END {print longest}' file.txt # 计算文件中列的总和 awk '{sum += $1} END {print sum}' file.txt # 打印奇数行 awk 'NR % 2 == 1' file.txt # 打印偶数行 awk 'NR % 2 == 0' file.txt # 反转文件的行顺序 awk '{a[i++] = $0} END {for (j = i-1; j >= 0; j--) print a[j]}' file.txt # 打印每行的单词数 awk '{print NF}' file.txt # 打印每行的字符数 awk '{print length($0)}' file.txt # 打印包含特定模式的行及其行号 awk '/pattern/ {print NR ": " $0}' file.txt # 使用自定义分隔符 awk -F: '{print $1}' /etc/passwd # 计算每列的平均值 awk '{for(i=1;i<=NF;i++) sum[i] += $i} END {for(i=1;i<=NF;i++) print "Column " i " average: " sum[i]/NR}' file.txt
文本排序与去重
sort
命令用于对文本行进行排序。
# 对文件进行排序 sort file.txt # 对文件进行数字排序 sort -n file.txt # 对文件进行反向排序 sort -r file.txt # 对文件的特定列进行排序 sort -k 2 file.txt # 对文件进行数字排序,并处理人类可读的数字(如1K, 2M) sort -h file.txt # 对文件进行排序,并忽略大小写 sort -f file.txt # 对文件进行排序,并删除重复行 sort -u file.txt
uniq
命令用于从排序的文本中删除重复行。
# 删除重复行 uniq file.txt # 只显示重复行 uniq -d file.txt # 只显示不重复的行 uniq -u file.txt # 计算每行出现的次数 uniq -c file.txt # 只显示重复一次的行 uniq -f 1 file.txt
Shell脚本编程基础
Shell脚本基础
创建一个简单的Shell脚本:
#!/bin/bash # 这是一个注释 echo "Hello, World!" # 定义变量 name="John" age=30 # 使用变量 echo "Name: $name" echo "Age: $age" # 命令替换 current_date=$(date) echo "Current date: $current_date" # 算术运算 sum=$((2 + 2)) echo "2 + 2 = $sum" # 条件语句 if [ $age -ge 18 ]; then echo "$name is an adult." else echo "$name is a minor." fi # 循环 for i in {1..5}; do echo "Count: $i" done # 函数 greet() { echo "Hello, $1!" } greet "$name"
条件测试
# 文件测试 if [ -f file.txt ]; then echo "file.txt is a regular file." fi if [ -d /tmp ]; then echo "/tmp is a directory." fi if [ -r file.txt ]; then echo "file.txt is readable." fi if [ -w file.txt ]; then echo "file.txt is writable." fi if [ -x script.sh ]; then echo "script.sh is executable." fi # 字符串测试 if [ "$name" = "John" ]; then echo "Name is John." fi if [ "$name" != "Jane" ]; then echo "Name is not Jane." fi if [ -z "$empty_var" ]; then echo "Variable is empty." fi if [ -n "$name" ]; then echo "Variable is not empty." fi # 数字测试 if [ $age -eq 30 ]; then echo "Age is 30." fi if [ $age -ne 25 ]; then echo "Age is not 25." fi if [ $age -gt 20 ]; then echo "Age is greater than 20." fi if [ $age -lt 40 ]; then echo "Age is less than 40." fi if [ $age -ge 18 ]; then echo "Age is greater than or equal to 18." fi if [ $age -le 30 ]; then echo "Age is less than or equal to 30." fi # 逻辑测试 if [ $age -gt 18 ] && [ $age -lt 65 ]; then echo "Age is between 18 and 65." fi if [ $age -lt 18 ] || [ $age -gt 65 ]; then echo "Age is less than 18 or greater than 65." fi
循环结构
# for循环 for i in 1 2 3 4 5; do echo "Number: $i" done # C风格的for循环 for ((i=1; i<=5; i++)); do echo "Number: $i" done # 遍历文件 for file in *.txt; do echo "Processing $file" done # while循环 count=1 while [ $count -le 5 ]; do echo "Count: $count" count=$((count + 1)) done # until循环 count=1 until [ $count -gt 5 ]; do echo "Count: $count" count=$((count + 1)) done # break和continue for i in {1..10}; do if [ $i -eq 5 ]; then continue # 跳过5 fi if [ $i -eq 8 ]; then break # 在8处停止 fi echo "Number: $i" done
函数
# 定义函数 greet() { echo "Hello, $1!" } # 调用函数 greet "John" # 带返回值的函数 add() { local sum=$(( $1 + $2 )) echo $sum } result=$(add 5 3) echo "5 + 3 = $result" # 带默认参数的函数 greet_with_default() { local name=${1:-"Guest"} echo "Hello, $name!" } greet_with_default greet_with_default "Jane" # 递归函数 factorial() { if [ $1 -le 1 ]; then echo 1 else local temp=$(($1 - 1)) local result=$(factorial $temp) echo $(($1 * $result)) fi } echo "Factorial of 5 is $(factorial 5)"
参数处理
# 位置参数 echo "Script name: $0" echo "First argument: $1" echo "Second argument: $2" echo "All arguments: $*" echo "All arguments (quoted): "$@"" echo "Number of arguments: $#" # shift命令 echo "First argument: $1" shift echo "After shift, first argument: $1" # getopts用于处理命令行选项 while getopts ":a:b:c" opt; do case $opt in a) echo "Option -a with argument: $OPTARG" ;; b) echo "Option -b with argument: $OPTARG" ;; c) echo "Option -c without argument" ;; ?) echo "Invalid option: -$OPTARG" ;; :) echo "Option -$OPTARG requires an argument." ;; esac done
数组操作
# 定义数组 fruits=("Apple" "Banana" "Cherry") # 访问数组元素 echo "First fruit: ${fruits[0]}" echo "All fruits: ${fruits[@]}" echo "All fruits: ${fruits[*]}" # 获取数组长度 echo "Number of fruits: ${#fruits[@]}" # 遍历数组 for fruit in "${fruits[@]}"; do echo "Fruit: $fruit" done # 添加元素到数组 fruits+=("Durian") # 从数组中删除元素 unset fruits[1] # 数组切片 echo "First two fruits: ${fruits[@]:0:2}" # 关联数组(类似字典) declare -A person person["name"]="John" person["age"]=30 person["city"]="New York" # 访问关联数组 echo "Name: ${person["name"]}" echo "Age: ${person["age"]}" echo "City: ${person["city"]}" # 遍历关联数组 for key in "${!person[@]}"; do echo "$key: ${person[$key]}" done
性能优化与系统调优
系统性能分析
vmstat
命令用于报告虚拟内存统计信息。
# 显示虚拟内存统计信息 vmstat # 每2秒显示一次,共显示5次 vmstat 2 5 # 显示磁盘I/O统计信息 vmstat -d # 显示 slab 统计信息 vmstat -m
iostat
命令用于监控系统输入/输出设备负载。
# 显示CPU统计信息和所有设备的平均传输率 iostat # 显示扩展统计信息 iostat -x # 每2秒显示一次,共显示5次 iostat 2 5 # 显示特定设备的统计信息 iostat -p sda
sar
命令用于收集、报告和保存系统活动信息。
# 显示CPU使用情况 sar # 显示内存使用情况 sar -r # 显示I/O和传输速率信息 sar -b # 显示网络使用情况 sar -n DEV # 显示队列长度和负载平均值 sar -q # 显示进程创建活动 sar -c # 显示交换活动 sar -W # 从文件中读取历史数据 sar -f /var/log/sa/sa10
系统调优
sysctl
命令用于在运行时修改内核参数。
# 显示所有内核参数 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 sysctl -p
ulimit
命令用于控制shell进程的资源限制。
# 显示所有资源限制 ulimit -a # 设置最大文件描述符数 ulimit -n 65536 # 设置最大进程数 ulimit -u 4096 # 设置最大文件大小 ulimit -f 1024000
tuned-adm
命令用于管理系统调优配置文件。
# 列出所有可用的调优配置文件 tuned-adm list # 查看当前活动的配置文件 tuned-adm active # 应用特定的调优配置文件 tuned-adm profile throughput-performance # 恢复默认配置 tuned-adm off
磁盘I/O优化
ionice
命令用于设置进程的I/O调度类和优先级。
# 以最佳的I/O优先级运行命令 ionice -c 1 -n 0 command # 以 Idle I/O优先级运行命令 ionice -c 3 command # 查看进程的I/O优先级 ionice -p PID
noatime
挂载选项可以减少文件系统访问时间更新的开销。
# 使用noatime选项挂载文件系统 mount -o remount,noatime /mount/point # 永久设置(在/etc/fstab中) echo "/dev/sda1 /mount/point ext4 defaults,noatime 0 0" >> /etc/fstab
内存优化
swapiness
参数控制系统使用交换空间的倾向。
# 查看当前swapiness值 cat /proc/sys/vm/swappiness # 临时设置swapiness值 sysctl -w vm.swappiness=10 # 永久设置swapiness值 echo "vm.swappiness=10" >> /etc/sysctl.conf sysctl -p
drop_caches
参数可以释放Linux内核使用的缓存。
# 释放页缓存 echo 1 > /proc/sys/vm/drop_caches # 释放dentries和inodes echo 2 > /proc/sys/vm/drop_caches # 释放页缓存、dentries和inodes echo 3 > /proc/sys/vm/drop_caches
CPU优化
taskset
命令用于设置或检索进程的CPU亲和性。
# 启动进程并将其绑定到CPU 0 taskset -c 0 command # 将现有进程绑定到CPU 0和1 taskset -cp 0,1 PID # 查看进程的CPU亲和性 taskset -p PID
cpufreq-set
命令用于控制CPU频率缩放。
# 设置CPU 0到性能模式 cpufreq-set -c 0 -g performance # 设置CPU 0到省电模式 cpufreq-set -c 0 -g powersave # 查看CPU 0的当前频率 cpufreq-info -c 0
实用技巧与最佳实践
命令行效率提升
创建别名(alias)可以让用户用自定义的简短命令替代长命令。
# 创建临时别名 alias ll='ls -alF' alias grep='grep --color=auto' alias ..='cd ..' # 永久别名(添加到~/.bashrc或~/.bash_aliases) echo "alias ll='ls -alF'" >> ~/.bashrc echo "alias grep='grep --color=auto'" >> ~/.bashrc echo "alias ..='cd ..'" >> ~/.bashrc # 重新加载配置文件 source ~/.bashrc
使用命令历史可以提高效率。
# 显示命令历史 history # 执行历史中的第n个命令 !n # 执行上一个命令 !! # 执行上一个命令的最后一个参数 !$ # 搜索历史命令 Ctrl+R # 清除命令历史 history -c
使用命令替换和管道可以组合多个命令。
# 命令替换 cd $(dirname $(which ls)) # 管道 ps aux | grep httpd # 重定向 command > output.txt # 标准输出重定向到文件 command 2> error.txt # 标准错误重定向到文件 command &> output.txt # 标准输出和标准错误都重定向到文件 command >> output.txt # 标准输出追加到文件 command < input.txt # 从文件读取标准输入
终端多路复用
tmux
是一个终端多路复用器,可以在一个终端窗口中创建多个终端会话。
# 创建新的tmux会话 tmux new -s mysession # 附加到现有会话 tmux attach -t mysession # 列出所有会话 tmux ls # 在会话中创建新窗口 Ctrl+b c # 切换到下一个窗口 Ctrl+b n # 切换到上一个窗口 Ctrl+b p # 分割窗口为两个窗格 Ctrl+b " # 水平分割窗口 Ctrl+b % # 切换窗格 Ctrl+b o # 分离会话 Ctrl+b d
screen
是另一个终端多路复用器。
# 创建新的screen会话 screen -S mysession # 附加到现有会话 screen -r mysession # 列出所有会话 screen -ls # 在会话中创建新窗口 Ctrl+a c # 切换到下一个窗口 Ctrl+a n # 切换到上一个窗口 Ctrl+a p # 分离会话 Ctrl+a d
自动化脚本
使用expect
可以自动化交互式命令。
#!/usr/bin/expect -f # 设置超时时间 set timeout 20 # 启动ssh连接 spawn ssh user@example.com # 等待密码提示 expect "password:" # 发送密码 send "mypasswordr" # 等待shell提示符 expect "$ " # 执行命令 send "ls -lr" # 等待命令完成 expect "$ " # 退出ssh会话 send "exitr" # 等待ssh会话结束 expect eof
使用parallel
可以并行执行命令,提高效率。
# 并行处理文件 ls *.txt | parallel gzip {} # 并行执行命令 parallel echo ::: A B C # 使用多个参数 parallel echo {} ::: A B C ::: 1 2 3 # 控制并行度 parallel -j 4 echo {} ::: A B C D E F
系统备份与恢复
使用rsync
进行文件同步和备份。
# 同步本地目录 rsync -av /source/ /destination/ # 同步远程目录 rsync -av /source/ user@remote:/destination/ # 删除目标目录中源目录没有的文件 rsync -av --delete /source/ /destination/ # 排除特定文件或目录 rsync -av --exclude='*.tmp' /source/ /destination/ # 使用压缩传输 rsync -avz /source/ user@remote:/destination/ # 显示进度 rsync -av --progress /source/ /destination/ # 限制带宽使用 rsync -av --bwlimit=1000 /source/ /destination/
使用tar
进行完整系统备份。
# 创建完整系统备份 tar -czvf backup-$(date +%Y%m%d).tar.gz --exclude=/proc --exclude=/sys --exclude=/dev --exclude=/tmp --exclude=/run --exclude=/mnt --exclude=/media --exclude=/lost+found / # 从备份恢复系统 tar -xzvf backup-20230801.tar.gz -C /
系统安全加固
使用fail2ban
防止暴力破解。
# 安装fail2ban sudo dnf install fail2ban # 启动fail2ban服务 sudo systemctl start fail2ban sudo systemctl enable fail2ban # 配置fail2ban sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local sudo vi /etc/fail2ban/jail.local # 重启fail2ban服务 sudo systemctl restart fail2ban # 查看fail2ban状态 sudo fail2ban-client status sudo fail2ban-client status sshd
使用firewalld
配置防火墙。
# 启动firewalld服务 sudo systemctl start firewalld sudo systemctl enable firewalld # 查看默认区域 sudo firewall-cmd --get-default-zone # 查看活动区域 sudo firewall-cmd --get-active-zones # 开放端口 sudo firewall-cmd --permanent --add-port=80/tcp sudo firewall-cmd --permanent --add-port=443/tcp # 开放服务 sudo firewall-cmd --permanent --add-service=http sudo firewall-cmd --permanent --add-service=https # 重新加载防火墙规则 sudo firewall-cmd --reload # 查看防火墙规则 sudo firewall-cmd --list-all
总结:成为Linux系统管理专家的路径
通过本指南的学习,你已经掌握了从基础到进阶的Fedora命令行使用技巧。但要成为真正的Linux系统管理专家,还需要持续学习和实践。以下是一些建议的学习路径:
基础巩固:确保熟练掌握文件操作、权限管理、进程管理等基础命令。
系统深入:深入学习Linux系统架构,理解文件系统、进程管理、内存管理、网络协议等底层原理。
脚本编程:精通Shell脚本编程,能够编写复杂的自动化脚本。
网络管理:深入学习网络配置、服务管理、安全防护等网络相关知识。
性能优化:学习系统性能分析工具和优化技巧,能够诊断和解决性能问题。
安全加固:掌握系统安全配置、漏洞扫描、入侵检测等安全技能。
虚拟化与容器:学习KVM、Docker、Kubernetes等虚拟化和容器技术。
云计算:了解云计算平台和相关技术,如OpenStack、AWS、Azure等。
持续学习:关注Linux社区动态,学习新技术和最佳实践。
实践项目:通过实际项目应用所学知识,解决真实问题。
记住,成为Linux系统管理专家是一个持续学习和实践的过程。通过不断挑战自己,解决更复杂的问题,你将逐步成长为一名专业的Linux系统管理员。祝你在Linux系统管理的道路上取得成功!