3、Linux基础:SSH连接、文件操作、进程管理、环境变量配置
说实话,很多刚入行的朋友觉得Linux就是敲命令,没什么了不起。但我在带团队时发现,线上事故十有八九跟基础操作不扎实有关。SSH连不上、文件找不着、进程杀不掉、环境变量配错——这些看似简单的问题,真能让你加班到凌晨三点。
这一章,我把日常工作中最常用的四个模块串起来讲。你跟着走一遍,至少能少踩一半的坑。
本章核心脉络:SSH打通远程连接 → 文件操作管理配置 → 进程监控与排障 → 环境变量统一管控。这四个环节环环相扣,缺一不可。
3.1 SSH 连接:你的远程操作入口
SSH 是运维人员的「门」。门都进不去,后面什么都别谈。我个人习惯在项目初始化时就把 SSH 配置整理好,省得每次上线都手忙脚乱。
3.1.1 基本连接与密钥认证
密码登录虽然简单,但生产环境我强烈建议禁用。为什么?暴力破解脚本满天飞,你想想看,一个 8 位纯数字密码能撑多久?
# 生成密钥对(推荐 ed25519,比 rsa 更安全)
ssh-keygen -t ed25519 -C "your_email@example.com"
# 将公钥复制到服务器
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@server_ip
# 测试免密登录
ssh user@server_ip
我的习惯:在 ~/.ssh/config 里配置主机别名,这样就不用每次都敲完整 IP 了。
Host myserver
HostName 192.168.1.100
Port 22
User deploy
IdentityFile ~/.ssh/id_ed25519
之后直接 ssh myserver 就能登录,省事不少。
3.1.2 常见连接问题排查
我曾经有一次线上故障,折腾了半小时才发现是服务器 SSH 端口被安全组改了。嗯,这里要注意,连不上时先检查这几点:
- 网络通不通:
ping server_ip,不通就先查防火墙/安全组 - 端口是否开放:
telnet server_ip 22或nc -vz server_ip 22 - 密钥权限对不对:
~/.ssh目录权限必须是 700,authorized_keys是 600 - 服务是否运行:
systemctl status sshd或service sshd status
⚠️ 安全红线:永远不要在生产环境使用 root 密码登录。建议在 /etc/ssh/sshd_config 中设置 PermitRootLogin prohibit-password 并 PasswordAuthentication no。
3.2 文件操作:日常工作的基本功
文件操作是 Linux 里最频繁的动作。说白了,你部署应用、改配置、看日志,全在跟文件打交道。
3.2.1 常用命令速查
| 命令 | 用途 | 常用参数 |
|---|---|---|
ls |
列出目录内容 | -lh 人性化显示,-la 显示隐藏文件 |
cp |
复制文件/目录 | -r 递归复制目录,-p 保留属性 |
mv |
移动或重命名 | 源和目标在同一目录就是重命名 |
rm |
删除文件/目录 | -rf 强制递归删除(慎用!) |
find |
查找文件 | -name "*.log" 按名字,-mtime +7 按修改时间 |
grep |
搜索文件内容 | -r 递归,-n 显示行号,-i 忽略大小写 |
3.2.2 文件权限与归属
我记得有一次部署新服务,启动脚本一直报权限错误。查了半天,原来是配置文件的所有者是 root,而应用是用 www-data 用户跑的。你想想看,权限不对,服务能正常才怪。
# 修改文件所有者
chown user:group file.txt
# 修改权限(数字法)
chmod 755 script.sh # rwxr-xr-x
chmod 644 config.conf # rw-r--r--
# 递归修改目录
chown -R deploy:deploy /app/
权限速记口诀:r=4, w=2, x=1。755 就是所有者有全部权限(7),组和其他人只有读和执行(5)。
3.3 进程管理:让服务稳定运行
进程管理是线上排障的核心技能。服务挂了、CPU 飙高了、内存泄漏了——这些场景你早晚会遇到。
3.3.1 查看进程状态
我个人最常用的组合是 ps aux 配合 grep,快速定位目标进程。
# 查看所有进程
ps aux
# 查找特定进程
ps aux | grep nginx
# 动态监控(类似 Windows 的任务管理器)
top
# 更友好的监控(推荐)
htop
3.3.2 进程信号与控制
我曾经在线上误杀了数据库进程,还好有备份。从那以后,我杀进程前一定会先确认 PID。
| 信号 | 编号 | 行为 | 使用场景 |
|---|---|---|---|
| SIGTERM | 15 | 优雅终止 | 正常关闭服务,进程会清理资源 |
| SIGKILL | 9 | 强制杀死 | 进程无响应时使用,不会清理资源 |
| SIGHUP | 1 | 重载配置 | 让 nginx、sshd 等重新读取配置文件 |
| SIGINT | 2 | 中断 | 相当于 Ctrl+C,终止前台进程 |
# 优雅停止
kill -15 PID
# 强制杀死(最后手段)
kill -9 PID
# 重载配置(不中断服务)
kill -1 PID
# 按名字杀进程(小心误杀)
pkill -f "process_name"
⚠️ 杀进程原则:先 SIGTERM,等 5 秒没反应再用 SIGKILL。直接 kill -9 可能导致数据丢失或文件损坏。
3.4 环境变量配置:让应用找到「家」
环境变量说白了就是给程序指路的。Java 要找 JAVA_HOME,Python 要找 PYTHONPATH,这些全得靠环境变量。
3.4.1 环境变量作用域
不同的配置文件,生效范围不一样。我见过有人把配置写在 /etc/profile 里,结果非登录 Shell 不生效,排查了半天。
| 配置文件 | 生效范围 | 加载时机 |
|---|---|---|
/etc/environment |
所有用户、所有 Shell | 系统启动时 |
/etc/profile |
所有用户的登录 Shell | 用户登录时 |
~/.bashrc |
当前用户的交互式非登录 Shell | 打开终端时 |
~/.bash_profile |
当前用户的登录 Shell | 用户登录时 |
~/.profile |
当前用户的登录 Shell(备用) | 如果 .bash_profile 不存在则加载 |
3.4.2 配置与验证
我个人习惯把应用相关的环境变量统一放在 /etc/profile.d/ 下,每个应用一个文件,方便管理。
# 创建自定义环境变量文件
sudo vim /etc/profile.d/myapp.sh
# 文件内容示例
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk
export PATH=$JAVA_HOME/bin:$PATH
export APP_HOME=/opt/myapp
export APP_ENV=production
# 使配置生效
source /etc/profile.d/myapp.sh
# 验证
echo $JAVA_HOME
echo $APP_ENV
调试技巧:如果环境变量不生效,用 env 命令查看当前所有变量,或者用 echo $VARIABLE_NAME 逐个检查。我曾经用 strace 跟踪进程的环境变量加载过程,虽然有点重,但确实能定位到深层问题。
3.4.3 常见坑点
- 变量名拼写错误:Linux 是大小写敏感的,
JAVA_HOME和java_home是两个变量 - 忘记 export:不加 export 的变量只在当前 Shell 有效,子进程拿不到
- 路径写死:尽量用
$变量拼接路径,方便后续迁移 - 覆盖系统变量:修改
PATH时记得保留原有路径:export PATH=$NEW_PATH:$PATH
一句话总结:SSH 是门,文件操作是手,进程管理是眼,环境变量是路。四者配合好了,你在 Linux 上基本就能横着走了。