1. Linux命令基础:从终端操作到系统管理
终端是Linux系统的核心交互界面,掌握基础命令就像学习一门新语言的字母表。第一次打开终端时,那个闪烁的光标可能让人不知所措,但几个简单命令就能让你感受到Linux的强大。
打开终端最常用的快捷键是Ctrl+Alt+T,这个组合键在大多数Linux发行版中都适用。登录后你会看到提示符,通常包含用户名、主机名和当前目录。我的Ubuntu系统显示为"user@ubuntu:~$",其中波浪号~代表用户的家目录。
提示:如果终端显示乱码,可以尝试执行
export LANG=en_US.UTF-8临时切换为英文环境,或者安装中文字体包。
文件操作是日常使用频率最高的命令群。ls命令不加任何参数时,只会显示非隐藏文件,加上-a参数才能看到所有文件(包括以点开头的隐藏文件)。我习惯使用ls -alh组合,其中-l显示详细信息,-h以人类可读格式显示文件大小。
bash复制$ ls -alh
total 48K
drwxr-xr-x 12 user user 4.0K Mar 20 10:23 .
drwxr-xr-x 3 root root 4.0K Mar 15 09:12 ..
-rw------- 1 user user 896 Mar 20 09:45 .bash_history
-rw-r--r-- 1 user user 220 Mar 15 09:12 .bash_logout
创建目录时,mkdir命令的-p参数特别实用,它可以自动创建路径中所有不存在的父目录。比如要创建project/code/src目录结构,传统方式需要执行三次mkdir,而用-p参数只需一次:
bash复制$ mkdir -p project/code/src
文件复制命令cp有个容易忽略的特性:复制目录时需要加-r参数表示递归操作。我曾经因为忘记这个参数而困惑为什么目录复制不成功。移动和重命名实际上都是mv命令的功能,Linux系统不区分这两种操作:
bash复制$ cp file1 file2 # 复制文件
$ cp -r dir1 dir2 # 复制目录
$ mv oldname newname # 重命名
$ mv file dir/ # 移动文件
删除操作要格外小心,特别是rm -rf组合。有一次我不小心在根目录执行了这个命令,幸好及时发现按下了Ctrl+C。建议新手先使用-i参数让系统提示确认:
bash复制$ rm -i important.txt
rm: remove regular file 'important.txt'?
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 系统信息查询与进程管理
了解系统状态是排查问题的第一步。uname -a命令可以显示完整的系统信息,包括内核版本和硬件架构。当需要向社区寻求帮助时,提供这些信息能让别人更快理解你的环境:
bash复制$ uname -a
Linux ubuntu 5.15.0-76-generic #83-Ubuntu SMP Thu Jun 15 19:16:32 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux
内存使用情况可以通过free -h查看,-h参数同样是为了人类可读的显示方式。我经常发现新手会误解输出的含义:available列才是真正可用的内存,而不是free列:
bash复制$ free -h
total used free shared buff/cache available
Mem: 7.7G 2.1G 1.2G 345M 4.4G 5.0G
Swap: 2.0G 0B 2.0G
磁盘空间检查使用df -h,这个命令可以显示所有挂载点的使用情况。添加--total参数会多显示一行总计信息,这在管理多个分区时特别有用:
bash复制$ df -h --total
Filesystem Size Used Avail Use% Mounted on
udev 3.9G 0 3.9G 0% /dev
tmpfs 787M 1.7M 786M 1% /run
/dev/nvme0n1p2 457G 123G 311G 29% /
tmpfs 3.9G 72M 3.8G 2% /dev/shm
total 466G 123G 320G 28%
进程管理是系统运维的核心技能。ps aux能显示所有运行中的进程,但输出可能太多难以阅读。我通常会用管道结合grep来过滤感兴趣的内容:
bash复制$ ps aux | grep nginx
root 1234 0.0 0.5 12345 6789 ? S Mar19 0:12 nginx: master process
www-data 1235 0.0 0.3 12345 4567 ? S Mar19 0:34 nginx: worker process
top命令提供动态更新的进程视图,按内存使用排序按M,按CPU排序按P。更现代的替代品是htop,它提供了彩色界面和鼠标支持,但需要额外安装:
bash复制$ sudo apt install htop
$ htop
当需要结束进程时,先用pgrep查找准确的进程ID,再用kill发送终止信号。-9参数是最后的强制终止手段,应该优先尝试不带参数的kill让进程正常退出:
bash复制$ pgrep -l nginx
1234 nginx
1235 nginx
$ kill 1234
3. 网络配置与连接工具
网络问题是Linux用户经常遇到的挑战。ifconfig曾经是查看网络接口信息的标准命令,但现在更推荐使用ip addr,因为它能显示更多详细信息:
bash复制$ ip addr
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 fq_codel 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 dynamic eth0
valid_lft 86300sec preferred_lft 86300sec
检查网络连通性最常用的当然是ping,但很多服务器会禁用ICMP响应。这时可以用curl -I只获取HTTP头信息来测试连通性:
bash复制$ curl -I example.com
HTTP/1.1 200 OK
Server: nginx/1.18.0
Date: Mon, 20 Mar 2023 08:23:45 GMT
Content-Type: text/html
网络路由信息用ip route查看,或者老式的route -n。当遇到网络连接问题时,traceroute可以帮助定位是在哪个网络节点出现了问题:
bash复制$ traceroute example.com
traceroute to example.com (93.184.216.34), 30 hops max, 60 byte packets
1 _gateway (192.168.1.1) 1.234 ms 1.456 ms 1.678 ms
2 10.10.10.1 (10.10.10.1) 5.678 ms 6.789 ms 7.890 ms
...
netstat命令能显示各种网络连接和统计信息,但新系统推荐使用ss作为替代。查看所有TCP连接可以用:
bash复制$ ss -tulnp
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=1234,fd=3))
tcp ESTAB 0 0 192.168.1.100:22 192.168.1.50:54321 users:(("sshd",pid=5678,fd=3))
远程连接最常用的工具是SSH。生成密钥对后可以免密码登录,提高安全性同时更方便:
bash复制$ ssh-keygen -t ed25519
$ ssh-copy-id user@remotehost
文件传输方面,scp是最简单的选择,但大文件传输建议使用rsync,它支持断点续传和增量传输:
bash复制$ scp localfile user@remote:/path/to/dest
$ rsync -avzP localdir/ user@remote:/path/to/dest/
4. 文本处理与搜索技巧
Linux哲学认为"一切都是文件",因此文本处理能力尤为重要。cat命令虽然简单,但配合重定向非常强大。我经常用它来快速创建小文件:
bash复制$ cat > hello.sh <<EOF
#!/bin/bash
echo "Hello World"
EOF
$ chmod +x hello.sh
$ ./hello.sh
查看文件内容时,less比more功能更丰富,支持向前向后滚动、搜索等操作。/键向前搜索,?键向后搜索,n查找下一个匹配项:
bash复制$ less /var/log/syslog
head和tail分别显示文件开头和结尾,默认10行。tail -f是监控日志文件的利器,特别是调试服务时:
bash复制$ tail -f /var/log/nginx/access.log
grep是文本搜索的瑞士军刀。-i忽略大小写,-v反向匹配,-r递归目录搜索。我常用这个组合来查找代码中的特定内容:
bash复制$ grep -rni "function_name" /path/to/code/
awk和sed是更强大的文本处理工具。比如用awk提取特定列,用sed批量替换文本:
bash复制$ ps aux | awk '{print $1,$3,$4}' # 显示用户名、CPU和内存使用率
$ sed -i 's/old/new/g' file.txt # 替换文件中所有old为new
查找文件可以使用find命令,它支持多种条件组合。这个命令找出一周内修改过的所有PHP文件:
bash复制$ find /var/www -name "*.php" -mtime -7
locate命令更快,但需要先更新数据库(可能需要sudo权限):
bash复制$ sudo updatedb
$ locate nginx.conf
5. 权限管理与用户控制
Linux的权限系统经常让新手困惑。ls -l输出的权限字符串包含10个字符,第一个表示文件类型,后9个分三组分别对应所有者、组和其他用户的权限:
bash复制$ ls -l important.txt
-rw-r--r-- 1 user group 1024 Mar 20 11:23 important.txt
chmod修改权限时,数字模式比符号模式更精确。记住4=读,2=写,1=执行,组合起来就是权限值:
bash复制$ chmod 755 script.sh # rwxr-xr-x
$ chmod 600 secret.txt # rw-------
chown改变文件所有者,chgrp改变文件组。递归修改目录下所有文件的所有者:
bash复制$ sudo chown -R user:group /path/to/directory
用户管理是系统管理员的基本功。添加用户时,-m参数创建家目录,-s指定登录shell:
bash复制$ sudo useradd -m -s /bin/bash newuser
$ sudo passwd newuser
usermod可以修改现有用户属性,比如把用户加入sudo组:
bash复制$ sudo usermod -aG sudo newuser
su切换用户时,-参数会加载目标用户的环境变量,这点很重要:
bash复制$ su - newuser
sudo命令执行需要root权限的操作。sudo -i切换到root shell,sudo -u user command以特定用户身份执行命令:
bash复制$ sudo -i
# apt update
# exit
$ sudo -u postgres psql
6. 软件包管理与系统服务
不同Linux发行版使用不同的包管理系统。Debian/Ubuntu使用apt,CentOS/RHEL使用yum或dnf,Arch使用pacman。更新软件包列表并升级所有已安装包:
bash复制$ sudo apt update
$ sudo apt upgrade
搜索软件包时,apt search会查找描述信息,而apt list只匹配包名:
bash复制$ apt search "web server"
$ apt list nginx*
安装特定版本的软件包需要完整包名加版本号:
bash复制$ sudo apt install nginx=1.18.0-0ubuntu1
删除软件包时,autoremove可以清理不再需要的依赖包:
bash复制$ sudo apt remove nginx
$ sudo apt autoremove
系统服务管理使用systemctl。查看服务状态,启动/停止服务,设置开机启动:
bash复制$ systemctl status nginx
$ sudo systemctl start nginx
$ sudo systemctl enable nginx
查看系统日志使用journalctl,可以按时间、服务等条件过滤:
bash复制$ journalctl -u nginx --since "2023-03-20" --until "2023-03-21"
定时任务使用crontab管理。-e编辑当前用户的任务,-l列出任务:
bash复制$ crontab -e
# 添加一行:0 3 * * * /path/to/backup.sh
$ crontab -l
7. 磁盘管理与文件系统操作
fdisk是传统的磁盘分区工具,-l参数列出所有磁盘和分区信息:
bash复制$ sudo fdisk -l
Disk /dev/nvme0n1: 477 GiB, 512110190592 bytes, 1000215216 sectors
Device Start End Sectors Size Type
/dev/nvme0n1p1 2048 1050623 1048576 512M EFI System
/dev/nvme0n1p2 1050624 1000214527 999163904 476.4G Linux filesystem
格式化分区使用mkfs系列命令,选择适当的文件系统类型:
bash复制$ sudo mkfs.ext4 /dev/sdb1
挂载分区需要先创建挂载点,然后使用mount命令。/etc/fstab文件可以配置开机自动挂载:
bash复制$ sudo mkdir /mnt/data
$ sudo mount /dev/sdb1 /mnt/data
查看磁盘使用情况用df,查看目录大小用du。-h参数使输出更易读:
bash复制$ df -h
$ du -sh /var/log/
dd命令可以创建磁盘镜像或测试磁盘性能,但要非常小心,因为错误的参数可能导致数据丢失:
bash复制$ dd if=/dev/zero of=testfile bs=1G count=1 oflag=direct
文件系统检查使用fsck,但必须先卸载分区。对于根分区,可以使用Live CD或在启动时按提示进入维护模式:
bash复制$ sudo umount /dev/sdb1
$ sudo fsck /dev/sdb1
8. Shell进阶技巧与脚本编程
Shell变量赋值时等号两边不能有空格,引用变量要用$符号:
bash复制$ name="Linux"
$ echo "Hello $name"
Hello Linux
环境变量存储在/etc/environment或~/.bashrc中。查看所有环境变量:
bash复制$ printenv
管道|将一个命令的输出作为另一个命令的输入。统计当前目录下文件数量:
bash复制$ ls | wc -l
重定向>覆盖文件,>>追加内容。将错误输出重定向到文件:
bash复制$ command 2> error.log
Shell脚本第一行要指定解释器,通常为#!/bin/bash。简单的备份脚本示例:
bash复制#!/bin/bash
# 备份脚本
backup_dir="/backup"
[ ! -d "$backup_dir" ] && mkdir -p "$backup_dir"
tar -czf "$backup_dir/backup_$(date +%Y%m%d).tar.gz" /path/to/backup
条件判断使用if语句,注意方括号内的空格不能省略:
bash复制if [ -f "/path/to/file" ]; then
echo "File exists"
else
echo "File not found"
fi
for循环处理多个项目,比如批量重命名文件:
bash复制for file in *.txt; do
mv "$file" "${file%.txt}.bak"
done
函数可以封装重复使用的代码。带参数的函数示例:
bash复制greet() {
echo "Hello, $1"
}
greet "World"
