第一次接触Linux时,我被那个黑底白字的终端窗口震撼到了——没有华丽的图形界面,只有一行行等待输入的命令。但正是这个看似简陋的环境,后来成为了我日常开发中最得力的助手。Linux作为服务器领域的绝对主流,其命令行操作是每位技术人员必须掌握的生存技能。
与Windows不同,Linux从设计之初就采用了"一切皆文件"的哲学理念。硬件设备、系统配置、进程信息都以文件形式呈现,这种统一性使得通过命令行可以操作系统的一切。比如插入U盘后,你会看到它被映射为/dev/sdb1这样的设备文件;查看CPU信息只需读取/proc/cpuinfo这个特殊文件。
提示:新手常犯的错误是试图在Linux中寻找类似Windows的控制面板。记住,命令行才是Linux的真正控制中心。
打开终端时,你实际进入的是Shell环境。常见的Bash Shell就像命令解释器,将你输入的文字转换为系统操作。这里有个实用技巧:按Tab键可以自动补全命令或文件名,连按两次会显示所有匹配项。比如输入"his"后按Tab,会自动补全为"history"命令。
环境变量是Shell的重要特性。通过echo $PATH可以看到系统查找命令的路径列表。我曾遇到过"command not found"错误,就是因为所需程序不在PATH中。这时可以用export PATH=$PATH:/新路径临时添加搜索路径。
Linux命令通常遵循"命令 [选项] [参数]"的结构。选项分为短格式(单横线加单个字母,如-l)和长格式(双横线加单词,如--help)。有些命令行为差异很大:
rm -r 递归删除目录grep -i 忽略大小写搜索tar -xzvf 解压tar.gz包警告:
rm -rf /这样的命令会强制删除整个系统文件。在输入涉及文件删除的命令前,务必再三确认路径。
pwd显示当前路径,cd切换目录。有个高效技巧:cd -可以快速回到上一个目录。ls命令的常用组合:
bash复制ls -l # 详细列表显示
ls -a # 显示隐藏文件
ls -lh # 人类可读的文件大小
创建目录时,mkdir -p可以自动创建父目录。比如要建立~/projects/python/src这样的嵌套目录,直接使用mkdir -p ~/projects/python/src即可,不需要逐层创建。
复制文件时,cp -i会在覆盖前询问,避免误操作。移动文件用mv命令,它同时也能用于重命名。查看文件内容有几个实用命令:
bash复制cat file # 显示全部内容
less file # 分页查看(可搜索)
head -n 5 file # 显示前5行
tail -f log.txt # 实时追踪日志变化
我在处理日志时经常使用grep过滤关键信息。比如grep "ERROR" system.log | less可以分页查看所有错误日志。更复杂的可以用正则表达式:grep -E "[0-9]{3}-[0-9]{4}" contacts.txt匹配电话号码格式。
top命令就像Linux的任务管理器,实时显示CPU、内存使用情况。按"M"按内存排序,"P"按CPU排序。更现代的替代品是htop,它支持鼠标操作和彩色显示。
df -h查看磁盘空间,du -sh *统计当前目录各文件/文件夹大小。我曾用这个命令发现某个日志文件增长到10GB,及时清理避免了磁盘爆满。
ps aux列出所有进程,配合grep可以快速定位:
bash复制ps aux | grep nginx # 查找nginx相关进程
终止进程时,先用kill -15 PID尝试正常结束,若无效再用kill -9强制终止。后台运行程序可以在命令后加&,比如python script.py &。要使程序在退出终端后继续运行,需要用nohup:
bash复制nohup python server.py > server.log 2>&1 &
Linux的ls -l输出中,那串-rwxr-xr--就是权限标识。它分为三组:所有者(owner)、所属组(group)、其他人(other)。每组包含读(r)、写(w)、执行(x)权限。数字表示法更简洁:
所以chmod 755 file表示:
chown改变文件所有者,chgrp改变所属组。有时你会遇到即使有rw权限也无法修改的文件,这可能是因为SELinux的安全上下文限制。用ls -Z查看安全标签。
sudo不是万能钥匙。合理做法是在/etc/sudoers中配置精确权限。比如给开发团队赋予特定的管理权限:
code复制%dev_team ALL=(ALL) /usr/bin/systemctl restart nginx
ifconfig或更现代的ip addr查看IP地址。ping测试连通性,traceroute追踪路由路径。排查网络问题时,我常用这个组合:
bash复制ping -c 4 example.com # 测试基本连通性
mtr example.com # 持续路由追踪
telnet example.com 80 # 测试端口可达性
SSH是远程管理的标准工具。配置密钥认证比密码更安全:
bash复制ssh-keygen -t ed25519 # 生成密钥对
ssh-copy-id user@host # 部署公钥
遇到连接问题时,ssh -v输出详细日志帮助诊断。对于长时间运行的任务,建议使用tmux或screen创建持久会话,避免网络中断导致任务终止。
除了基本搜索,grep还支持:
bash复制grep -v "pattern" file # 反向匹配
grep -c "error" log.txt # 统计出现次数
grep -A 3 -B 2 "关键行" file # 显示匹配行前后内容
sed最适合行级编辑。比如批量替换:
bash复制sed 's/foo/bar/g' file # 全局替换
sed -i.bak 's/old/new/' file # 直接修改文件并备份
awk特别适合处理结构化文本。统计nginx访问日志中各IP的访问次数:
bash复制awk '{print $1}' access.log | sort | uniq -c | sort -nr
提取特定列也很方便:
bash复制ls -l | awk '{print $3,$5,$9}' # 显示所有者、大小和文件名
Debian/Ubuntu系使用:
bash复制sudo apt update # 更新软件列表
sudo apt install nginx # 安装软件
sudo apt remove --purge package # 彻底删除
RHEL/CentOS使用:
bash复制sudo yum makecache # 更新缓存
sudo yum install httpd # 安装
sudo yum history undo 3 # 回滚特定操作
遇到依赖问题时,aptitude比apt有更好的解决建议。对于新版软件,有时需要添加第三方仓库,但要谨慎评估安全性。
一个典型的脚本开头:
bash复制#!/bin/bash
# 注释:这是一个示例脚本
set -euo pipefail # 启用严格模式
变量使用时要注意:
bash复制name="value" # 赋值无空格
echo "$name" # 引用要加$
备份目录的脚本:
bash复制#!/bin/bash
backup_dir="/backups"
target="$1"
[ -z "$target" ] && { echo "请指定备份目标"; exit 1; }
timestamp=$(date +%Y%m%d_%H%M%S)
tar -czf "$backup_dir/${target##*/}_$timestamp.tar.gz" "$target"
echo "备份完成:$(ls -lh "$backup_dir" | tail -n 1)"
现代Linux使用systemd管理服务:
bash复制sudo systemctl start nginx # 启动
sudo systemctl enable nginx # 设置开机自启
sudo systemctl status nginx # 查看状态
journalctl -u nginx -f # 查看日志
服务启动失败时,按这个顺序排查:
systemctl status service 查看错误信息journalctl -xe 检查系统日志ss -tulnp | grep :80nginx -t个人设置建议放在家目录的隐藏文件:
~/.bashrc:Shell交互配置~/.profile:登录配置~/.ssh/config:SSH客户端配置我的.bashrc常用配置:
bash复制alias ll='ls -alF'
alias grep='grep --color=auto'
export EDITOR=vim
export PATH="$PATH:$HOME/bin"
对于生产服务器,建议调整:
bash复制# 文件描述符限制
echo "* soft nofile 65535" >> /etc/security/limits.conf
# 内核参数调优
echo "vm.swappiness=10" >> /etc/sysctl.conf
sudo apt update && sudo apt upgrade/etc/ssh/sshd_config中PermitRootLogin nobash复制sudo ufw allow 22/tcp
sudo ufw enable
last和/var/log/auth.logps auxf和top即使使用容器,Linux命令依然重要:
bash复制docker ps -a # 查看容器
docker exec -it container_name bash # 进入容器
docker logs -f container_name # 查看日志
当容器异常时:
docker inspect查看详细配置/bin/bash进入调试docker diffdocker statsvmstat 1:实时系统状态iostat -xz 1:磁盘I/O监控netstat -tulnp:网络连接查看lsof -i :80:查看占用端口的进程perf:系统性能分析strace:追踪系统调用tcpdump:网络包分析bpftrace:现代追踪工具bash复制git init
git add .
git commit -m "描述"
git remote add origin URL
git push -u origin master
git checkout -- filegit log --oneline --graphgit diff --color-wordsgit stash和git stash poptmux基础操作:
bash复制tmux new -s session_name # 新建会话
Ctrl+b d # 分离会话
tmux attach -t session_name # 重新连接
tmux ls # 列出会话
/var/log/syslog:系统主日志/var/log/auth.log:认证日志/var/log/nginx/:Nginx日志journalctl:systemd日志统计HTTP状态码分布:
bash复制awk '{print $9}' access.log | sort | uniq -c | sort -nr
实时监控错误:
bash复制tail -f error.log | grep -E "ERROR|WARN|CRITICAL"
编辑当前用户的cron:
bash复制crontab -e
示例任务:
bash复制0 3 * * * /path/to/backup.sh # 每天3点执行
*/5 * * * * ping -c 1 example.com # 每5分钟检查
更现代的替代方案:
bash复制systemctl list-timers # 查看现有定时器
sudo systemctl enable --now mytimer.timer # 启用
查看块设备:
bash复制lsblk -f # 显示文件系统类型
blkid # 显示UUID
挂载操作:
bash复制sudo mount /dev/sdb1 /mnt/data
sudo umount /mnt/data
逻辑卷管理操作:
bash复制pvcreate /dev/sdb # 创建物理卷
vgcreate vg_data /dev/sdb # 创建卷组
lvcreate -L 100G -n lv_data vg_data # 创建逻辑卷
mkfs.ext4 /dev/vg_data/lv_data # 格式化
bash复制lsmod # 列出已加载模块
modinfo module_name # 查看模块信息
sudo modprobe module_name # 加载模块
sudo rmmod module_name # 卸载模块
临时修改:
bash复制sudo sysctl -w vm.swappiness=10
永久生效:
bash复制echo "vm.swappiness = 10" >> /etc/sysctl.conf
sudo sysctl -p