Linux 零基础入门:SSH 连接、用户与权限、30 个最常用命令
这篇教程写给完全没有服务器经验的朋友。读完之后,你能独立连上一台 Linux 服务器、搞懂"权限"到底在说什么、并熟练用上日常开发运维中最常用的那 30 多个命令。所有代码块都可以直接复制粘贴,建议边读边敲。
—
一、什么是 Linux?为什么服务器都用它?
Linux 是一个开源免费的操作系统,就像 Windows、macOS 一样,用来管理 CPU、内存、磁盘、网络这些硬件,上面可以跑各种程序。但它的气质完全不同:Windows 是给人坐在屏幕前点鼠标用的,而 Linux 天生就是给机器在机房里 7×24 小时跑服务用的——稳定、省电、不弹广告、不强制重启、命令行操作极其高效,而且免费(大多数版本不花一分钱)。你看到的网站、App 背后的服务器,绝大部分都跑着 Linux(阿里云的 CentOS/Ubuntu、腾讯云的 Ubuntu、GitHub 的服务器、Docker/K8s 的生态,全都是 Linux)。所以说:桌面可以不用 Linux,但服务器绕不开它。学会它,你才有资格"管"你花钱租来的那台云主机。
—
二、第一步:用 SSH 连接你的 Linux 服务器
2.1 先搞懂三个概念
| 名词 | 通俗解释 |
| IP 地址 | 服务器在互联网上的"门牌号",比如 203.0.113.10,云厂商控制台里能看到 |
| SSH | 一种加密的远程登录协议,相当于"通过一条加密隧道,远程操控别人的电脑"。默认用 22 端口 |
| 用户名 | 登录服务器用的账号,云服务器一般是 root(管理员)或云厂商预建的 ubuntu / centos / ec2-user 等 |
连服务器之前,确认两件事:① 云厂商控制台里的安全组放行了 22 端口(很多人第一次连不上就是栽在这里);② 你拿到了初始密码,或者重置过密码。
2.2 Windows 用户
方法一:自带终端(Windows 10/11 推荐)
Windows 10/11 现在自带了 ssh 命令,不需要装任何东西:
- 按
Win + X,选「终端」或「PowerShell」;
- 输入命令:
# 格式:ssh 用户名@IP地址
ssh ubuntu@203.0.113.10
方法二:PuTTY(老 Windows 或公司内网常用)
- 下载安装 PuTTY(免费小工具);
- 打开后:
Host Name 填 203.0.113.10,Port 填 22,Connection type 选 SSH;
- 点 Open,弹出黑窗口;
- 看到
ubuntu@203.0.113.10's password: 时输入用户名 ubuntu,回车;
- 输入密码,回车(PuTTY 默认输入密码完全看不见,是正常的,盲打回车即可)。
2.3 macOS / Linux 用户
打开「终端」(Terminal):
# 最常用的一条命令,就这一句
ssh ubuntu@203.0.113.10
第一次连接会弹出一段警告(让你确认服务器指纹),输入 yes 回车:
The authenticity of host '203.0.113.10' can't be established.
...
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
然后输入密码(屏幕不会显示任何字符,这是密码输入的正常表现,输完回车)。看到一行类似 Last login: ... from ... 的提示,说明你已经成功登进服务器了。
2.4 ssh 常用参数速查
ssh -p 2222 ubuntu@203.0.113.10 # 端口不是 22 时用 -p 指定端口
ssh -i ~/.ssh/my_key ubuntu@203.0.113.10 # 用指定密钥文件登录(下面会讲)
exit # 断开连接,回到自己电脑
💡 技巧:ssh ubuntu@203.0.113.10 连上后,可以用方向键上下翻历史命令,Ctrl + R 反向搜索历史命令。
—
三、SSH 密钥登录 vs 密码登录
3.1 为什么要用密钥?
| 密码登录 | 密钥登录 |
| 体验 | 每次输入密码,输错就重来 | 一次配置,以后免密秒进 |
| 安全性 | 弱密码可能被爆破 | 私钥在你电脑里,服务器只存公钥,公钥泄露也登不上 |
| 服务器加固 | 无法关闭 | 配好后可彻底关闭密码登录,防爆破 |
结论:密钥是正解,密码是过渡。
3.2 第一步:在你自己电脑上生成密钥对
密钥登录的原理像一把锁和一把钥匙:私钥(key,放在你电脑里,绝不能泄露)和公钥(pub,放到服务器上)。服务器只认"持有正确私钥的人"。
在你的本地电脑上打开终端执行:
# 生成 ed25519 密钥(现代推荐算法)
ssh-keygen -t ed25519 -C "my-server-key"
# 如果系统较老不支持 ed25519,就用 RSA:
# ssh-keygen -t rsa -b 4096 -C "my-server-key"
执行后它会连续问你三个问题(路径、口令、确认口令),全部直接回车(用默认值)即可:
Generating public/private ed25519 key pair.
Enter file in which to save the key (/Users/you/.ssh/id_ed25519): # 直接回车
Enter passphrase (empty for no passphrase): # 直接回车
Enter same passphrase again: # 直接回车
完成后你的 ~/.ssh/ 目录里会多出两个文件:
# 查看刚生成的密钥文件(~ 代表你自己的家目录)
ls -l ~/.ssh/
# id_ed25519 ← 私钥!打死不能发给任何人
# id_ed25519.pub ← 公钥,可以随便放(它是用来"贴到服务器上"的)
⚠️ 铁律:私钥文件(没有 .pub 后缀的那个)永远不要发微信、发网盘、贴论坛。丢了公钥无所谓,丢了私钥等于家门钥匙给了别人。
3.3 第二步:把公钥放到服务器上的 authorized_keys
方法一(最简单):一条命令搞定(macOS/Linux 自带)
# -i 指定公钥文件,@后面是要上传到的服务器
ssh-copy-id -i ~/.ssh/id_ed25519.pub ubuntu@203.0.113.10
# 按提示输入一次服务器密码,上传完成
方法二(通用,PuTTY 用户也这么干):手动粘贴
# 1. 在本地电脑查看公钥内容
cat ~/.ssh/id_ed25519.pub
# 输出一行类似:
# ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI... my-server-key
# 把这整行复制下来
# 2. 用 ssh 登进服务器
ssh ubuntu@203.0.113.10
# 3. 在服务器上创建目录和文件(nano 是最简单的编辑器,按 Ctrl+O 保存,Ctrl+X 退出)
mkdir -p ~/.ssh
nano ~/.ssh/authorized_keys
# 4. 把刚才复制的公钥整行粘贴进去,Ctrl+O 回车保存,Ctrl+X 退出
# 5. 权限必须收紧(这步不做,服务器会拒绝用密钥登录!)
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
exit
3.4 第三步:用密钥登录
# 明确指定私钥文件
ssh -i ~/.ssh/id_ed25519 ubuntu@203.0.113.10
# 如果用的就是默认路径 ~/.ssh/id_ed25519,直接这样就行,不用 -i
ssh ubuntu@203.0.113.10
这次不会再问你密码了,直接进入服务器。
3.5 (加分项)关闭服务器密码登录,防止被爆破
前提:先反复确认密钥能正常登录,再执行下面操作,否则你会把自己锁在门外!
# 在服务器上编辑 SSH 配置文件
sudo nano /etc/ssh/sshd_config
# 找到并改成(去掉 # 注释):
# PasswordAuthentication no ← 关闭密码登录
# PubkeyAuthentication yes ← 确认开启密钥登录(默认就是 yes)
# 保存退出后,先测试配置有没有语法错误(重要!)
sudo sshd -t
# 没报错就重启 SSH 服务(注意:不同发行版服务名可能是 sshd 或 ssh)
sudo systemctl restart sshd
# 再开一个新终端试一次 ssh 登录,确认成功后就稳了
—
四、用户与权限体系:别再对 “Permission denied” 发呆了
4.1 我是谁?whoami 与 id
whoami # 当前是谁:比如输出 ubuntu
id # 当前用户 + 所属的组:uid=1000(ubuntu) gid=1000(ubuntu) groups=1000(ubuntu),27(sudo)
who # 现在有哪些人登录着这台机器
4.2 root 与 sudo
- root:系统的"皇帝",用户 ID 为 0,对一切文件和服务想改就改。云服务器给的初始密码往往就是 root 的。
- sudo:意思是 “super user do”,以 root 的身份临时执行一条命令。普通用户的密码是"门禁卡",刷一下就能办管理员的事。
sudo apt update # 以 root 权限执行 apt update
sudo nano /etc/hosts # 以 root 权限编辑系统文件
# 第一次 sudo 会要求输入【你自己的密码】(不是 root 的!),输错就重来
# 输入后短时间内(约 15 分钟)连续 sudo 不用再输密码
💡 日常原则:用普通用户登录,需要管理员权限时才加 sudo,而不是天天 ssh root@...。这样即使你手滑敲错一条危险命令,普通用户的"杀伤范围"也有限。
4.3 用户组(groups)一句话理解
用户组是"班级"。权限可以发给"某个人",也可以发给"整个班"。比如网站目录的属组设为 www-data,所有该组的程序都有对应权限。日常管理够用这三条:
sudo groupadd devteam # 新建一个组
sudo usermod -aG devteam ubuntu # 把 ubuntu 加入 devteam(-a 是追加,千万别漏)
groups # 查看当前用户属于哪些组(要重新登录才生效)
4.4 chmod:数字权限 755 / 644 到底怎么算的
每个文件都有三组权限,分别属于:属主(owner)/ 属组(group)/ 其他人(others)。每组由三个位组成:
| 位 | 含义 | 值 |
| r | read 读 | 4 |
| w | write 写 | 2 |
| x | execute 执行(对目录来说 = 允许进入) | 1 |
三位相加就是这个数字。 例如:
rwx = 4+2+1 = 7(可读写执行)
r-x = 4+0+1 = 5(可读可进,不能改)
r-- = 4+0+0 = 4(只读)
所以:
| 数字 | 展开 | 通俗含义 | 典型用途 |
| 755 | rwx r-x r-x | 属主随便改,别人只能读和进入 | 目录、可执行脚本 |
| 644 | rw- r– r– | 属主可读写,别人只能读 | 普通文件(代码、配置) |
| 700 | rwx — — | 只有属主能读写执行 | 存放密钥/凭据的目录 |
| 600 | rw- — — | 只有属主能读写 | 私钥、密码文件 |
chmod 755 /var/www/html # 目录:属主可改,别人能进能读
chmod 644 app.conf # 文件:属主可改,别人只能看
chmod +x run.sh # 快捷写法:给所有人加执行权限
4.5 chown:改文件的"主人"
chown = change owner,把文件的属主/属组换人。
sudo chown ubuntu:ubuntu app.conf # 把文件主人改成 ubuntu,属组改成 ubuntu
sudo chown -R www-data:www-data /var/www # -R 递归:目录下所有文件一起改
4.6 ls -la:看懂一列一列的含义
ls 是查看目录内容,加上 -l(长格式)和 -a(连隐藏文件一起显示)是日常最常用姿势:
ls -la
输出示例,逐列对照:
drwxr-xr-x 2 ubuntu ubuntu 4096 Jun 1 10:00 webapp
^^^^^^^^^^^^ ^ ^^^^^^ ^^^^^^ ^^^^^ ^^^^^^^^^^^^ ^^^^^^
① ② ③ ④ ⑤ ⑥ ⑦
| 列 | 示例 | 含义 |
| ① 类型+权限 | drwxr-xr-x | 第一个字符 d=目录,-=普通文件;后面三组就是属主/属组/其他人的权限(见 4.4) |
| ② 链接数 | 2 | 目录的子目录数相关;普通文件一般是 1 |
| ③ 属主 | ubuntu | 文件属于哪个用户 |
| ④ 属组 | ubuntu | 文件属于哪个用户组 |
| ⑤ 大小 | 4096 | 字节(目录固定显示 4096,不用管) |
| ⑥ 修改时间 | Jun 1 10:00 | 最近一次内容修改的时间 |
| ⑦ 文件名 | webapp | 名字;. 开头的是隐藏文件(所以用 -a 才看得到) |
记住一句话:③④ 告诉你"文件归谁",① 的后三组告诉你"谁能对它干什么"。 90% 的 Permission denied 都是这两处没配对。
—
五、30 个最常用命令,分门别类
5.1 文件与目录操作(12 个)
| 命令 | 干什么 | 最常用示例 |
ls | 列出目录里的文件 | ls -la 看全部+隐藏文件 |
cd | 切换到别的目录 | cd /var/log |
cp | 复制(copy) | cp a.txt b.txt |
mv | 移动或改名 | mv old.txt new.txt |
rm | 删除 | rm a.txt |
mkdir | 新建目录 | mkdir -p a/b/c |
touch | 创建空文件/更新时间戳 | touch new.log |
cat | 一次性显示整个文件内容 | cat config.yaml |
less | 分页查看长文件(可滚动) | less /var/log/syslog |
tail | 看文件末尾 | tail -f app.log |
head | 看文件开头 | head -20 data.txt |
grep | 在内容里搜关键字 | grep "error" app.log |
find | 按条件找文件 | find / -name "*.conf" |
# cd 的几个特殊写法,必须记住:
cd # 不带参数 = 回到自己的家目录(~)
cd ~ # 同上
cd .. # 回到上一级目录
cd - # 回到上一次所在的目录
cd / # 回到根目录
# 复制和移动,目录要加 -r(recursive 递归):
cp -r ~/project /backup/ # 复制整个目录
mv /backup/project ~/project # 移动整个目录(同盘移动很快)
# rm 危险警告!!
rm file.txt # 删文件(没有回收站!删了就没了)
rm -r mydir/ # 递归删目录
# 永远不要在没看清楚的情况下输入:
# rm -rf / !!! 这是能删光整台机器的命令
# 查看文件:
cat app.conf # 短文件直接看
less /var/log/syslog # 长文件:按 空格 翻页,按 g 回顶部,按 G 到末尾,按 q 退出
tail -100 app.log # 看最后 100 行
tail -f app.log # 【最实用】实时跟踪日志,新内容刷出来,Ctrl+C 停止
head -20 big.csv # 只看前 20 行
# 搜索:
grep "error" app.log # 在文件里找含 error 的行
grep -n "error" app.log # -n 显示行号
grep -ri "todo" ~/project # -r 递归找目录里所有文件,-i 忽略大小写
find /home -name "*.log" -size +100M # 在 /home 下找大于 100MB 的 .log 文件(找大日志神器)
5.2 系统信息(5 个)
| 命令 | 干什么 | 最常用示例 |
uname | 内核/系统信息 | uname -a |
df | 磁盘空间 | df -h |
free | 内存占用 | free -h |
htop | 实时看进程/资源(比 top 好看得多) | htop |
ps | 当前进程列表 | ps aux \| grep nginx |
uname -a # 系统名、主机名、内核版本、架构,一条全给你
uname -r # 只看内核版本
df -h # 磁盘用了多少。-h = human readable(显示 GB 这种人类单位)
# 看最后一列 Use%:哪块盘接近 100% 就是它快满了
# 想知道是哪个目录占满的:
du -sh /* 2>/dev/null | sort -rh | head -10 # 列出根目录下最大的 10 个一级目录
free -h # 内存。重点看 available(真正可用的)那一列
# 注意:buffers/cache 不是"被占用了",是系统在帮你缓存,别慌
htop # 彩色实时面板:顶部是 CPU 和内存条,下面是进程
# 键盘按 F5 只跟踪一个进程,按 F9 杀进程,q 退出
# 没装的话:sudo apt install htop
ps aux | grep nginx # 列出所有进程并过滤出 nginx(末尾会多一行 grep 自己,忽略)
# 更精准的写法:
pgrep -a nginx # 直接找 nginx 进程
5.3 网络(5 个)
| 命令 | 干什么 | 最常用示例 |
ip | 查看 IP 地址/网卡 | ip addr |
ss | 查看端口和连接 | ss -tlnp |
ping | 测网络通不通 | ping 8.8.8.8 |
curl | 用命令行发 HTTP 请求/下载 | curl -I https://example.com |
dig | 查域名解析(DNS) | dig example.com |
ip addr # 查看所有网卡的 IP。找 eth0/ens 开头那块里的 inet 后面就是内网 IP
# 想看外网公网 IP:curl ifconfig.me
ss -tlnp # 看【正在监听】的端口。-t TCP -l 监听中 -n 显示数字 -p 显示是哪个进程
# 典型场景:Nginx 没起来?看 80/443 在不在列表里
# 443 被别的进程占了?-p 会告诉你进程名和 PID,kill 掉或改端口即可
ping 8.8.8.8 # 测底层网络通不通(Ctrl+C 停止)。通 = 包能出去
ping yoursite.com # 测域名能否解析并连通
curl -I https://example.com # 只取响应头(-I 大写),看状态码
curl http://127.0.0.1:8080/api # 直接请求本机接口,调试后端神器
curl -o app.tar.gz https://example.com/app.tar.gz # 下载文件到本地
dig example.com # 查域名解析到哪台 IP(DNS 排查用)
# 服务器能 ping 通但网站打不开,先 dig 看看解析对不对
5.4 打包压缩(2 个)
| 命令 | 干什么 | 最常用示例 |
tar | Linux 世界的主流打包(.tar.gz) | tar czvf / tar xzvf |
zip | 跨平台压缩(.zip) | zip -r / unzip |
# tar 记住两组"咒语"就够用了:
tar czvf backup.tar.gz mydir/ # 打包+压缩:c 创建 z 走 gzip v 显示过程 f 指定文件名
tar xzvf backup.tar.gz -C /backup/ # 解压:x 解包 z gzip C 指定解压到哪个目录
# zip:
zip -r backup.zip mydir/ # 压缩(-r 递归)
unzip backup.zip -d /backup/ # 解压到 /backup/
💡 上传/下载大文件用 scp 或 rsync(scp = 走 SSH 传文件):
scp ~/backup.tar.gz ubuntu@203.0.113.10:/home/ubuntu/ # 本地 → 服务器
scp ubuntu@203.0.113.10:/var/log/app.log ~/ # 服务器 → 本地
5.5 文本编辑(2 个)
nano —— 零基础首选,底部直接告诉你怎么操作:
nano notes.txt
# 编辑就是直接打字
# Ctrl + O 保存(按回车确认文件名)
# Ctrl + X 退出(没保存会问你存不存)
# Ctrl + K 剪切当前行,Ctrl + U 粘贴
vim —— 你必须至少认识它(很多生产服务器只装了它):
vim notes.txt
# vim 有"模式":打开时是命令模式(只能发指令,打字不进去!)
# i 进入插入模式,现在可以打字了
# Esc 退回命令模式
# :w 保存
# :q 退出(没改动才能退)
# :wq 保存并退出(90% 时候你就敲这两个键)
# :q! 强制退出不保存(改坏了想放弃时救命用)
新手记 vim 只要记三件事:按 i 开始写,按 Esc,敲 :wq 走人。
5.6 权限(3 个)
| 命令 | 干什么 | 最常用示例 |
sudo | 以 root 身份执行命令 | sudo apt update |
chmod | 改权限数字 | chmod 755 ./app |
chown | 改属主/属组 | sudo chown -R www-data:www-data /var/www |
(用法见第四节,这里把三兄弟放一起,方便你遇到权限问题按顺序排查:ls -la 看谁属主什么权限 → chown 改人 → chmod 改权限。)
5.7 软件安装(3 个,Debian/Ubuntu 系)
CentOS/RHEL 系把 apt 换成 yum 或 dnf,思路完全一样。
sudo apt update # ① 先刷新软件源列表(装任何东西前都先跑这个)
sudo apt install htop # ② 安装软件(会列出要装的内容,按 y 确认)
sudo apt remove htop # ③ 卸载软件
# 加分:
sudo apt upgrade # 升级全部已装软件
apt list --installed | grep nginx # 查某个软件装没装
sudo apt purge nginx # 连配置文件一起删干净
5.8 服务管理(5 个,systemd)
现代 Linux 的服务(nginx、mysql、redis、ssh 等)都由 systemctl 管理:
sudo systemctl status nginx # 看服务状态:green active 就是活着,red failed 就是挂了
sudo systemctl start nginx # 启动
sudo systemctl stop nginx # 停止
sudo systemctl restart nginx # 重启(改完配置最常用)
sudo systemctl enable nginx # 设置开机自启(只加自启、不启动;start + enable 是标配)
# 加分:
sudo systemctl disable nginx # 取消开机自启
journalctl -u nginx -n 50 # 看这个服务最近的 50 行日志,排错神器
典型部署流程背下来:systemctl start xx && systemctl enable xx —— 先启动,再设为开机自启。
—
六、目录结构速览
Linux 是一切皆挂在根目录 / 下的树。新手只需要记住下面这张表,够用 90% 的场景:
| 目录 | 放什么 | 你会在这里干什么 |
/ | 根目录,整棵树的顶端 | cd / 回家 |
/home | 普通用户的家目录,一人一个子目录(/home/ubuntu) | 放自己的代码、临时文件、上传的包 |
/root | root 的家目录,普通用户进去会 Permission denied | 放 root 的配置(别去碰) |
/etc | 全部系统配置(nginx.conf、sshd_config 都在这) | 改配置,改完记得 systemctl restart |
/var | 经常变动的数据:日志 /var/log、数据库文件 /var/lib、临时服务文件 /var/tmp | 查日志就 cd /var/log;磁盘满了多半是它 |
/tmp | 临时文件,重启即清空 | 放随手测试的东西,别放重要数据 |
/opt | 第三方/手工安装的大软件(如手工装的 MySQL) | 把"不属于系统仓库的大东西"放这里 |
/usr | 系统级程序和库(/usr/bin 命令、/usr/local 手动编译安装的) | 一般只读;/usr/local/bin 常用来放自制脚本 |
/bin /lib | 基础命令和库(现代系统里常是指向 /usr/bin 的链接) | 不用管 |
/dev | 硬件设备文件(磁盘、终端都在这里) | 不用管 |
记忆口诀:home 放我的,etc 放配置,var 放日志和会变的,usr 放系统程序,opt 放额外大软件,tmp 和 var/tmp 放临时的。
—
七、环境变量与 $PATH
7.1 什么是环境变量
环境变量就是系统/用户预先设好、程序随取随用的"全局备忘"。比如 $HOME 是你的家目录,$USER 是你的用户名:
echo $HOME # /home/ubuntu
echo $USER # ubuntu
env # 列出当前所有环境变量
7.2 $PATH:系统去哪里找命令
你输入 ls,系统怎么知道去 /usr/bin/ls 找?靠 $PATH——一串用冒号分隔的目录清单,系统按顺序逐个去找:
echo $PATH
# /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# ↑ 按这个顺序找,第一个找到的就用它
排错实例:你把脚本放到 ~/bin,敲 myscript 却提示 command not found——因为 ~/bin 不在 PATH 里。两种解法:
# 临时解法(只对当前这个终端窗口生效,关掉就没):
export PATH="$PATH:~/bin"
# 永久解法(写进配置,每次开终端自动加载):
echo 'export PATH="$PATH:$HOME/bin"' >> ~/.bashrc
source ~/.bashrc # 立即让修改生效,不用重开终端
辅助命令:
which ls # 告诉你系统实际用的是哪个 ls:/usr/bin/ls
type -a curl # 查看一个命令到底从哪里来
7.3 .bashrc 是什么
~/.bashrc 是你的 bash 启动脚本:每次你打开一个终端,它就会被自动执行一遍。所以:
- 想永久生效的环境变量、别名,都写在这里(或
source 它的文件);
- 改完执行
source ~/.bashrc 立即生效,或重开一个终端。
# 顺手加个别名,以后敲 ll 等于 ls -la(实用!)
echo 'alias ll="ls -la"' >> ~/.bashrc
source ~/.bashrc
—
八、常见坑与避坑表
| 现象 | 原因 | 解决办法 |
Permission denied(操作文件时) | 你不是属主、没写权限,或需要 root | 先 ls -la 看属主和权限;sudo 执行,或 sudo chown/chmod 修正 |
sudo: ubuntu is not in the sudoers file | 该用户不是管理员 | 用 root 或管理员用户执行:sudo usermod -aG sudo ubuntu(Ubuntu 系) |
ssh: connect to host ... port 22: Connection refused | 服务器 sshd 没启动,或端口不是 22 | 控制台确认端口;服务器里 systemctl start sshd |
ssh: connect to host ... port 22: Connection timed out | 云安全组没放行 22 端口(新手第一大坑)/ 防火墙拦截 / IP 敲错 | 云控制台安全组加放行 22;sudo ufw status 检查防火墙 |
Permission denied (publickey) 密钥登录失败 | 公钥没放对位置/内容,或服务器端权限太松 | 确认 ~/.ssh/authorized_keys 里有完整公钥;chmod 700 ~/.ssh、chmod 600 ~/.ssh/authorized_keys |
WARNING: UNPROTECTED PRIVATE KEY FILE! ... bad permissions | 本地私钥权限过松(比如 644) | chmod 600 ~/.ssh/id_ed25519,密钥文件就该 600 |
sudo: a password is required 或 sudo 一直要密码 | 普通用户没配 NOPASSWD | 默认就要输密码,正常;想免密可在 sudoers 配置(新手不建议) |
command not found | 没安装 / 可执行文件不在 PATH 里 | apt install 软件名;或把目录加进 PATH(见第七节) |
端口被占 Address already in use | 别的进程占着这个端口 | ss -tlnp 找到占用进程,kill PID 或换一个端口 |
磁盘满了 No space left on device | 日志/临时文件/镜像占满 | df -h 定位哪块盘,du -sh /* | sort -rh 找大目录,清 /var/log、docker system prune |
htop: command not found | 精简系统没装 | sudo apt install htop(vim、curl 同理) |
apt install 报 Unable to locate package | 软件源没更新或拼错名字 | 先 sudo apt update 再装;名字别拼错 |
systemctl: Unit not found | 服务没安装,或名字不对 | apt install 软件;服务名一般和软件同名(nginx → nginx.service) |
| 改完配置没效果 | 改了没重启服务 | sudo systemctl restart 服务名 |
| vim 里打字没反应 | 还在命令模式 | 按 i 进插入模式 |
rm 误删 | Linux 没有回收站 | 以后大操作先 cp -r 备份;养成 mv 到 /trash 的习惯 |
| 中文路径/文件名报错 | 部分老软件不支持非 ASCII 路径 | 文件名尽量用英文+下划线 |
最后再叮嘱三句
rm -rf 之前,永远先打一遍 ls 看看你要删的是什么——Linux 没有后悔药;
- 改系统配置前,先备份:
cp nginx.conf nginx.conf.bak;
- 看不懂输出时,
命令 --help 或 man 命令 是永远在你身边的字典。
坚持在真机上把第五节的命令各敲一遍,这篇教程里的东西就是你的了。
(完)