一台机器刚装完系统,SSH 上去只有一个提示符。想改 nginx 的配置,不知道按哪个键才能退出编辑器;想知道内存还剩多少,敲了 free 看到一屏数字,不知道哪一列才是答案;想把日志拷回本地,发现 ftp 命令早就没有了。这三个瞬间,基本覆盖了新手接触 Linux 时最先撞上的三面墙。
下面按场景把运维日常真正会用到的命令归了类:编辑文件、操作目录、改权限、管用户、设密码、看性能、查系统信息、装软件、传文件。每条命令讲三件事——它是干什么的,好在哪差在哪,给不给参数有什么区别。
不用背参数表。把每个场景里排第一个的命令用熟,剩下的遇到再查,这是更实际的路径。真到了记不住的那天,man 命令名 和 命令名 --help 一直在那儿。
先说结论
时间有限的话,先看这六条,剩下的当手册翻。
- 先记场景,再记命令:想不起来用哪个,通常是因为没见过它解决的问题,不是因为没背参数。
- 绝大多数命令不给参数就能跑:参数解决的是筛得更准、输出更好看,不决定能不能用。
- 日常排查一半的活靠五个命令:ls -lht、grep -rn、df -h、ss -tlnp、journalctl -u,先这五个。
- 改配置之前先备份:cp 或 mv 成 .bak,成本一秒,救回来一次就够本。
- 带 -r 和 -f 的命令回车前想两秒:rm -rf、chmod -R、chown -R,出事最多的就是这三个。
- 别在参数上纠结:拿不准就先不带参数跑一次,看输出再决定加什么,比查十分钟文档快。
Linux 怎么编辑文件
连上服务器第一件事往往就是改文件。图形界面里双击打开、Ctrl+S 保存那一套在终端里没有,取而代之的是三种东西:全屏的编辑器(vim、nano),和一条命令就能改完的流编辑器(sed)。挑哪个取决于你要改一行,还是要改一个文件的大部分内容。
vim
vim 是 vi 的加强版,绝大多数发行版预装,最小化安装的系统上 vi 也一定在。它有两个模式必须分清:打开文件时是普通模式,按 i 进入插入模式才能打字,Esc 回到普通模式,再输入 :wq 保存退出。新手最常犯的错是在插入模式里敲 :wq,结果把这四个字符写进了配置文件。
- 优点 · 服务器上基本都有:没有图形界面、没有网络、只有一个 SSH 会话的时候,vim 是唯一能指望的编辑器。
- 优点 · 改配置手不离键盘:斜杠搜索、G 跳到末尾、dd 删行、yy 加 p 复制粘贴,改一百行配置不用碰鼠标。
- 缺点 · 上来就会懵:模式切换是反直觉的,第一次用的人十个里有八个不知道怎么退出,只好关掉终端。
- 缺点 · 不适合当 IDE:装插件能补功能,但真要写几百行代码,本地编辑器还是更舒服。
| 参数 | 作用 |
|---|---|
+行号 | 打开后光标直接停在第 N 行 |
-R | 只读模式,改不动也存不了 |
-d 文件1 文件2 | diff 模式,左右两栏对比两份文件 |
-u NONE | 不加载任何配置和插件,排查配置冲突时用 |
-c "命令" | 打开后自动执行一条命令,比如直接进入搜索 |
不带参数敲 vim /etc/nginx/nginx.conf,光标停在第 1 行第 1 列,能改能存,适合从头读一遍。加上 +120 就直接落在报错日志指的那一行,省掉翻页找位置的动作;加 -R 之后所有修改都写不进去,退出时提示 E45,正好挡住生产机上边看边手滑。手指记住之后,反而比鼠标快。
# 直接跳到第 120 行
vim +120 /etc/nginx/nginx.conf
# 只读打开,退出时会提示 E45
vim -R /etc/nginx/nginx.conf
# 左右对比改前改后
vim -d nginx.conf.bak nginx.conf
nano
nano 是给不想背快捷键的人准备的。屏幕底下常驻两行提示,^ 代表 Ctrl,^O 保存、^X 退出,照着按就行。临时改个 IP、开个防火墙端口、往 hosts 里加一行,用 nano 比 vim 快,因为不用先在脑子里过一遍模式。
- 优点 · 零学习成本:底栏把常用组合键都印在屏幕上,不认识这个词也能照着按完。
- 优点 · 没有模式概念:敲什么就是什么,不存在“以为是插入其实在普通模式”这种事。
- 缺点 · 大文件吃力:上万行的日志打开会慢,滚动也不如 vim 利索。
- 缺点 · 不是每台机器都有:精简安装的镜像常把它裁掉,得先装一个。
| 参数 | 作用 |
|---|---|
-l | 显示行号 |
-w | 关闭自动折行,长行不再被视觉切成几行 |
-m | 开启鼠标(终端支持才有效) |
-v | 只读方式打开 |
-B | 保存时把原文件备份成 文件名~ |
-c | 持续显示光标所在的行列号 |
直接 nano /etc/hosts 打开没有行号,改错了位置只能靠上下翻着数。加 -l 行号就贴在左边;改的是长脚本、一行几百个字符,加 -w 才不会把一个逻辑行显示成三行——折行状态下最容易把参数改到引号外面去。
# 带行号打开,改 hosts
nano -l /etc/hosts
# 改长脚本:不折行 + 显示行列
nano -w -c /usr/local/bin/deploy.sh
sed
sed 是流编辑器,它不改屏幕上的东西,只按规则处理文本然后输出。运维里高频的只有三种用法:替换字符串、删掉匹配的行、打印某几行。它真正的价值是能写进脚本,一条命令改一百台机器,不用一台台登上去手改。
- 优点 · 可脚本化:塞进 for 循环配 ssh,几十台机器的配置一次改完,还能留下执行记录。
- 优点 · 不改文件也能预览:不带 -i 就只输出到屏幕,确认命中几处之后再落盘。
- 缺点 · 没有撤销:-i 一敲原文件就没了,正则写错整片文件可能被吃掉。
- 缺点 · 语法反人类:s/old/new/g 里的斜杠和路径里的斜杠打架,只能换成 # 或 | 当分隔符。
| 参数 | 作用 |
|---|---|
-i | 直接改文件(危险,建议先备份) |
-i.bak | 改文件同时留一份 .bak |
-n | 不自动打印,配合 p 只输出想要的行 |
-E | 用扩展正则,+ ? | 不用转义 |
-e | 一次给多条规则 |
sed 's/8080/9090/g' app.conf 只在屏幕上改,原文件一个字没动,适合先确认命中了几处。加 -i.bak 才是真改:文件被改写,同时生成 app.conf.bak,改错了 cp app.conf.bak app.conf 就回来了。如果直接 -i 又不备份,正则里多写一个点,整份配置的 IP 就可能全变成乱码,而且没有回头路。
# 只预览,不动文件
sed 's/8080/9090/g' app.conf
# 真改,并留备份
sed -i.bak 's/8080/9090/g' app.conf
# 删掉所有注释行和空行
sed -i.bak -E '/^#|^$/d' app.conf
Linux 怎么操作文件和目录
登录进去之后,找文件、复制、改名、删除、打包,这些动作占了日常操作的八成。下面这些命令不需要背全参数,但要知道“想看什么该带哪个字母”,否则就只能在 ls 的输出里用眼睛一个个数。
ls
ls 是登录后敲的第一个命令,多数人只用过 ls 和 ls -l 两个形态。它真正有用的地方在排序和筛类型:找最近改过的文件、找占地方的大文件、看被隐藏起来的配置文件,都不用另装工具。
- 优点 · 一切环境都有:不用装,救援模式、容器、精简镜像里都在。
- 优点 · 排序就是排查手段:-t 按修改时间倒序,改完配置没生效时一眼看出文件是不是根本没保存。
- 缺点 · 输出不好控制:列多的时候在窄终端里挤成一团,得用 -1 强制一行一个。
- 缺点 · 不做统计:想知道整个目录占多大,还得换 du。
| 参数 | 作用 |
|---|---|
-l | 长格式:权限、属主、大小、时间 |
-a | 连 . 开头的隐藏文件一起列 |
-h | 大小换算成 K/M/G,要配 -l 用 |
-t | 按修改时间排序,新的在前 |
-S | 按文件大小排序 |
-d | 只看目录本身,不展开里面的内容 |
-i | 显示 inode 号 |
ls /var/log 出来的是一排名字,判断“有没有这个文件”够用了。ls -lht /var/log 出来是按时间倒序的长格式,大小写成 12K、3.4M 这种能直接读的数——排查“日志怎么涨这么快”时,这一条比翻三个工具都快。排序参数比筛选参数更常用。ls -d */ 只列目录,不把里面的文件铺满屏幕。
# 按时间倒序,带人类可读大小
ls -lht /var/log
# 只看目录
ls -d */
# 按大小排,找大文件
ls -lSh /var/lib
cp
cp 是复制,但比想象的容易出岔子:源和目标写反了会直接覆盖、目标目录不存在会变成改名、符号链接默认被复制成实体文件。搬整个服务的配置目录时,权限和属主丢了是常事。
- 优点 · 一条命令带属性:-a 把权限、属主、时间戳一起搬过去,迁移配置目录不用再补 chown。
- 优点 · -u 省时间:只复制比目标新的文件,同步大目录能少搬一大半。
- 缺点 · 默认静默覆盖:同名文件直接盖掉,不加 -i 连提示都没有。
- 缺点 · 复制目录必须加 -r:不加会报 omitting directory,什么也不做。
| 参数 | 作用 |
|---|---|
-r | 递归复制目录 |
-a | 归档模式,等于 -dR --preserve=all,保留全部属性 |
-p | 保留权限、属主、时间戳 |
-i | 覆盖前询问 |
-n | 目标已存在就跳过,不覆盖 |
-v | 打印每个被复制的文件 |
-u | 只复制比目标新的 |
cp a.conf b.conf 之后,b.conf 的权限是当前用户默认的 644,原来如果是 600、属主是 nginx,全丢了。加 -a 一条命令把权限、属主、时间一起带过去。平时复制单个文本文件用不上 -a,但搬整个服务的配置目录时,不带它后面一定要补一遍 chown。
# 普通复制
cp app.conf app.conf.bak
# 带属性搬整个配置目录
cp -a /etc/nginx /backup/nginx-$(date +%F)
# 只复制更新的文件,并显示
cp -uv ./dist/* /var/www/html/
mv
mv 干两件事:移动和改名。Linux 里没有单独的 rename 命令,改名就是“移动到同一个目录下的新名字”。改配置文件前先 mv xx.conf xx.conf.bak,是成本最低的备份方式。
- 优点 · 同分区内瞬间完成:移动只是改目录项,不搬数据,几个 G 的目录也是瞬间。
- 优点 · 天然的备份动作:mv 成 .bak 比 cp 干净,不留两份同名文件。
- 缺点 · 跨分区就是复制再删除:从 /home 挪到 /data,耗时和大文件复制一样,中途断电两头都可能不完整。
- 缺点 · 会覆盖同名目标:默认不提示,脚本里尤其危险。
| 参数 | 作用 |
|---|---|
-i | 覆盖前询问 |
-n | 目标存在就不动 |
-v | 显示移动了什么 |
-u | 目标更新时才移动 |
-f | 强制覆盖,不问 |
mv nginx.conf nginx.conf.bak 是日常用法,改坏了 mv 回来就行。mv -i a b 在 b 已存在时会先问一句 overwrite,不加 -i 就直接盖掉。批量挪文件时加 -v 才看得见到底动了哪些,尤其是循环里带通配符的时候——通配符展开出意外结果,是这类操作最常见的翻车方式。
# 改配置前留一份
mv nginx.conf nginx.conf.bak
# 有同名文件就问一句
mv -i ./new/*.conf /etc/nginx/conf.d/
# 批量改名:.txt 换成 .md
for f in *.txt; do mv -v "$f" "${f%.txt}.md"; done
rm
rm 本身没什么可解释的,需要解释的是它没有回收站。删掉就是删掉,文件系统层面不可恢复,rm -rf 后面多一个空格就可能把整个目录干掉。
- 优点 · 干净彻底:不占空间、不留索引,删大文件立刻释放容量。
- 优点 · -I 能给一次反悔机会:删超过三个文件或有递归时先问一次,比逐个确认好用。
- 缺点 · 无回收站无确认:默认直接删,终端里也没有 Ctrl+Z 可退。
- 缺点 · 通配符会失控:rm -rf /data/* 少打一个字符,或者变量为空展开成 /data/,结果完全不同。
| 参数 | 作用 |
|---|---|
-f | 强制,文件不存在也不报错、不询问 |
-r | 递归删目录 |
-i | 每个文件都问一遍 |
-I | 删多个文件或有递归时只问一次 |
-v | 打印删掉了什么 |
-d | 删空目录 |
rm 文件 删单个文件,文件不存在时会报 No such file or directory;加 -f 连这个报错都吞掉,所以脚本里才写 rm -f。日常手敲建议反过来:alias rm='rm -i',先看清楚再按 y。真正要删目录时先 ls 一遍目标,确认路径最后一个字符不是斜杠加星号。没有撤销,也没有确认框。
# 删单个文件
rm ./app.log
# 删目录(会逐个确认)
rm -ri ./cache
# 脚本里静默删
rm -f /tmp/app.sock
find
find 是按条件在目录树里找文件。它能查的东西比 ls 多得多:按名字、按大小、按修改时间、按属主、按权限位,找到之后还能直接对结果执行命令。清理磁盘、定位大日志、批量改权限,都靠它。
- 优点 · 条件能叠加:-name 加 -size 加 -mtime,一次筛出“七天前、超过 100M 的日志”。
- 优点 · 找到就能处理:-delete 或 -exec 直接对结果动手,不用先存成列表再遍历。
- 缺点 · 慢:从根目录搜要遍历整棵树,机械盘上跑一次可能几分钟。
- 缺点 · -exec 语法容易写错:少一个分号、少一对花括号,命令就报错或者行为不对。
| 参数 | 作用 |
|---|---|
-name "*.log" | 按名字匹配,区分大小写 |
-iname | 按名字匹配,不区分大小写 |
-type f / -type d | 只要普通文件 / 只要目录 |
-size +100M | 大于 100M,- 表示小于 |
-mtime +7 | 修改时间在 7 天以前 |
-maxdepth 2 | 只往下找两层,提速明显 |
-delete | 直接删掉命中的文件 |
-exec 命令 {} \; | 对每个结果执行一次命令 |
find / -name "*.log" 会把整块盘翻一遍,输出几千行,通常不是想要的。find /var/log -type f -name "*.log" -size +100M -mtime +7 把范围收到一个目录、限定普通文件、三个条件叠加,出来的一般只剩十几条,可以直接接 -delete。限制目录和层数,是让 find 变快最有效的两招。
# 找七天前、超过 100M 的日志
find /var/log -type f -name "*.log" -size +100M -mtime +7
# 只看不删,先确认
find /data -type f -size +1G -maxdepth 2
# 批量改权限
find /var/www -type d -exec chmod 755 {} \;
grep
grep 在文件里找符合条件的行。看日志时九成时间都在用它:某个 IP 有没有来过、某个报错出现了几次、某个接口的耗时是多少。
- 优点 · 上下文一起给:-C 3 把命中行的前后三行都打出来,报错的原因通常就在上面几行。
- 优点 · 能递归整棵树:-r 在目录里搜,改配置前确认某个参数在哪些文件里出现过。
- 缺点 · 两套正则容易混:基础正则里 + ? | 要转义,不带 -E 时经常写出“什么都没匹配到”。
- 缺点 · 大文件直接刷屏:几个 G 的日志一口气打几千屏,得配 head 或 less。
| 参数 | 作用 |
|---|---|
-n | 显示行号 |
-i | 忽略大小写 |
-v | 反选,输出不含关键词的行 |
-r | 递归搜目录 |
-l | 只输出文件名,不输出内容 |
-c | 只输出命中的行数 |
-C 3 | 前后各 3 行上下文,-A 只看后、-B 只看前 |
-w | 全词匹配,找 root 不会命中 rootfs |
-E | 扩展正则 |
grep error app.log 只把含 error 的行吐出来,一行行刷过去看不出因果。grep -n -C 3 -i "error" app.log 带行号、忽略大小写、上下各三行,一次就能看到哪个请求触发了什么错误。查某个配置项被谁写死了,用 grep -rn --include="*.conf"。
# 带上下文看报错
grep -n -C 3 -i "error" /var/log/app.log
# 递归搜配置,只列文件名
grep -rl "10.0.0.12" /etc/nginx/
# 统计出现次数
grep -c "timeout" /var/log/app.log
tar
tar 是打包,把一堆文件合成一个,再交给 gzip 或 xz 压缩。发布版本、备份配置、把日志带走,基本都走这一步。它的参数是老式写法,-czvf 四个字母各管一件事,记住组合就行。
- 优点 · 保留权限和目录结构:解压出来的属主、权限、软链接都在,迁移服务目录不会散架。
- 优点 · 能流式处理:直接管道给 ssh 或 split,不落地也能传、能切片。
- 缺点 · 参数靠背:-c 建包、-x 解包、-t 只看内容,三个动作长得像但完全不能混。
- 缺点 · 压缩不并行:单线程 gzip 吃不满多核,几十 G 的包要等很久。
| 参数 | 作用 |
|---|---|
-c | 创建归档 |
-x | 解开归档 |
-t | 只看里面有什么,不解开 |
-z | gzip 压缩 / 解压,.tar.gz |
-J | xz 压缩 / 解压,体积最小但最慢 |
-v | 列出处理的文件 |
-f 文件名 | 指定归档文件,必须紧跟在参数后面 |
-C 目录 | 解压到指定目录 |
--exclude=模式 | 打包时排除某些文件 |
tar -cf backup.tar /etc/nginx 只打包不压缩,出来和原目录差不多大。加 -z 之后体积通常能小到三分之一,代价是压缩时一个核跑满。tar -tzf backup.tar.gz 是解压前先看一眼里面有什么,确认路径层级再 -xzf,能避免解压出一堆文件散在当前目录。先 -t 再 -x,少一次事故。
# 打包并压缩
tar -czf nginx-$(date +%F).tar.gz /etc/nginx
# 先看内容,再解压到指定目录
tar -tzf nginx-2026-11-11.tar.gz | head
tar -xzf nginx-2026-11-11.tar.gz -C /tmp/restore
# 边打包边传到另一台机器
tar -czf - /var/log/app | ssh root@10.0.0.8 "cat > /backup/app.tar.gz"
Linux 怎么改文件和目录的权限
权限这件事,第一次接触会觉得抽象:三个身份乘三种操作,再用一个数字表示。真正记住它靠的不是背表,而是遇到一次“文件明明在、就是不让写”的报错。chmod 管“能做什么”,chown 管“这文件是谁的”,两个命令经常要连着用。
chmod
chmod 改权限位。三组人(属主、属组、其他人)各三种权限(读、写、执行),组合成三位八进制数。644 和 755 这两个数字在运维里出现的频率高得离谱,前者对应普通文件,后者对应目录和可执行脚本,记住这两条已经够应付大半场景。
- 优点 · 两种写法都支持:八进制 755 一次设完三组,符号 u+x、g-w、o=r 只动其中一位。
- 优点 · -R 能整棵目录一次改完:部署完站点,一条命令把目录设 755、文件设 644。
- 缺点 · 777 是万能解也是万能坑:图省事全开,等于把写权限交给任何能登录的人。
- 缺点 · 目录的执行位含义不同:目录没有 x 就进不去,哪怕有 r 能列出名字也没用。
| 参数 | 作用 |
|---|---|
-R | 递归,目录下所有东西一起改 |
-v | 显示每个文件的变更 |
--reference=文件 | 照抄另一个文件的权限 |
数字模式 755 / 644 / 600 | 一次设定三组人的权限 |
符号模式 u+x g-w o=r a+x | 只增减某一组 |
chmod 644 app.conf 把属主设成读写、其他人只读,这是配置文件的常规姿势。chmod u+x deploy.sh 只给属主加执行位,其他人的权限一个不动——八进制写法做不到“只加一位”,符号写法可以。给目录做 chmod -R 755 之前先想清楚,里面是不是混着不该有执行位的普通文件。权限出问题,先看这文件到底是谁的。
# 配置文件:属主读写,其他人只读
chmod 644 /etc/nginx/nginx.conf
# 只给属主加执行位
chmod u+x /usr/local/bin/deploy.sh
# 目录 755、文件 644 分开设
find /var/www -type d -exec chmod 755 {} \;
find /var/www -type f -exec chmod 644 {} \;
chown
chown 改属主和属组。权限位决定“能做什么”,属主决定“这东西是谁的”。网站 502、数据库起不来、SFTP 登录提示 Permission denied,有一半的原因出在属主上。它和 chmod 通常一起用,顺序是先 chown 再 chmod。
- 优点 · 属主属组一次改完:写成“用户:组”一行搞定,不用分两次调用。
- 优点 · --reference 能照抄:让新文件对齐老文件的属主,比先查 UID 再写好用。
- 缺点 · -R 很容易改过头:把整个站点目录给了 nginx,上传目录也跟着变主,PHP 反而写不进去。
- 缺点 · 写错用户名不报错到脚本:只提示 invalid user,放在批量脚本里经常被忽略过去。
| 参数 | 作用 |
|---|---|
用户 | 只改属主 |
用户:组 | 属主和属组一起改 |
:组 | 只改属组 |
-R | 递归整棵目录 |
--reference=文件 | 参照某个文件的属主属组 |
chown nginx app.log 只把属主改成 nginx,属组不动。chown nginx:nginx app.log 两个一起改。chown -R nginx:nginx /var/www 会连上传目录一并换主,通常不是想要的结果——更稳的做法是给目录设 setgid,让新建文件自动继承属组:chmod g+s /var/www/upload,这样属主是谁都不影响同组写入。
# 单个文件改属主属组
chown nginx:nginx /var/www/html/index.html
# 递归改(先确认目录里没有例外)
chown -R www-data:www-data /var/www/html
# 目录继承属组,新文件自动跟随
chmod g+s /var/www/html/upload
Linux 怎么管理用户
加人、改权限、走人,这三件事在交接期特别密集。用户管理的命令都直接改 /etc/passwd、/etc/shadow、/etc/group 三个文件,改完立刻生效,没有“申请—审批”那层缓冲,所以出错也是立刻出错。
useradd
useradd 建用户,一条命令能完成大部分事,但它有个发行版差异必须知道:Ubuntu 上 useradd 默认不建家目录、不给可登录 shell,建完 su 过去会没有提示符;CentOS 和 RHEL 上默认会建。所以生产脚本里通常把 -m 和 -s 显式写上,两边行为才一致。
- 优点 · 一条命令定好家目录和 shell:适合写进脚本批量建号,不用一层层改配置文件。
- 优点 · 默认不设密码:账号建出来就是锁定状态,不会留下一个空密码的口子。
- 缺点 · 发行版默认值不一样:同一行命令在两套系统上结果不同,是新手最常踩的一脚。
- 缺点 · 密码策略取系统默认:不改 /etc/login.defs 的话,UID 从 1000 起、有效期也按默认值走。
| 参数 | 作用 |
|---|---|
-m | 建家目录 |
-M | 不建家目录 |
-s /bin/bash | 指定登录 shell |
-d /data/zhangsan | 指定家目录路径 |
-G wheel,docker | 追加到这些附加组 |
-g dev | 指定主组 |
-u 1500 | 指定 UID |
-e 2027-01-01 | 账号到期日 |
-r | 建系统账号,UID 小于 1000 |
useradd zhangsan 在 CentOS 上建出 /home/zhangsan 和 bash,在 Ubuntu 上只往 /etc/passwd 写了一行,家目录和 shell 都是空的。显式写 useradd -m -s /bin/bash zhangsan,两边行为就一致了。要建不能登录的服务账号,用 -r -s /sbin/nologin -M,三个参数一起给全。发行版默认值的差异,比参数本身更值得记。
# 建普通用户,明确要家目录和 bash
useradd -m -s /bin/bash zhangsan
# 建运维账号,加入 wheel 和 docker
useradd -m -s /bin/bash -G wheel,docker ops
# 建不能登录的服务账号
useradd -r -s /sbin/nologin -M appsvc
usermod
usermod 改已经存在的账号:加组、换 shell、改家目录、锁定解锁。它比 useradd 更常被用到,因为需求总是后来才变的——人换部门了要加组,登录方式要禁掉,账号要临时停用几天。
- 优点 · 覆盖账号全生命周期:改名、换组、改家目录、锁定都能做,不用删了重建。
- 优点 · -L 比改密码干脆:在 /etc/shadow 前面加一个感叹号,密码立刻失效,账号和数据都还留着。
- 缺点 · -G 不带 -a 会覆盖:只想加一个组,结果把原来的附加组全清了,这条命令最著名的坑。
- 缺点 · 改 UID 不修历史文件:家目录里的老文件还是旧 UID,权限看着对、实际不匹配。
| 参数 | 作用 |
|---|---|
-aG 组 | 追加附加组,必须带 a |
-G 组 | 直接覆盖附加组 |
-s /sbin/nologin | 改登录 shell |
-d /new/home -m | 改家目录并把内容搬过去 |
-L / -U | 锁定 / 解锁账号 |
-e 2027-01-01 | 设到期日,传空串取消 |
-l 新名 | 改登录名,家目录要另外改 |
usermod -G docker zhangsan 会把附加组改成只有 docker,原来在 wheel 里的权限就没了;usermod -aG docker zhangsan 才是追加。锁定账号用 usermod -L,解锁用 -U。但如果当初是用 passwd -l 锁的,得用 passwd -u 解——两套锁写在同一处,混着用会留下一个解不开的感叹号。少写一个 a,组就丢了。
# 追加组(注意 -a)
usermod -aG docker zhangsan
# 禁止 shell 登录,但保留账号
usermod -s /sbin/nologin zhangsan
# 临时停用 / 恢复
usermod -L zhangsan
usermod -U zhangsan
userdel
userdel 删账号。它默认只删 /etc/passwd、/etc/shadow、/etc/group 里的记录,家目录和邮箱原封不动,于是留下一堆孤儿文件,占着磁盘还带着旧 UID。
- 优点 · 默认不删数据:误删了账号还有机会把家目录捞回来。
- 优点 · -r 一步清干净:家目录、邮箱、cron 一起带走,不留尾巴。
- 缺点 · 默认留垃圾:UID 被回收给新用户后,新用户可能直接继承老用户留下的文件。
- 缺点 · 用户还在登录时删不掉:得先 kill 掉他的进程,或者加 -f。
| 参数 | 作用 |
|---|---|
-r | 连家目录和邮箱一起删 |
-f | 强制删除,即使账号还在登录 |
-Z | 一并处理 SELinux 上下文 |
userdel zhangsan 之后 /home/zhangsan 还在,id 却查不到这个人,ls -l 显示的是一个纯数字 UID。要彻底清干净用 userdel -r zhangsan。删之前先跑一遍 find / -uid <旧UID> -print,看一眼这个人在系统别处留了什么,重点看 /var/spool/cron 和 /tmp。
# 先看这个 UID 在别处留了什么
find / -uid 1500 -print 2>/dev/null
# 连家目录一起删
userdel -r zhangsan
Linux 怎么设置和重置密码
密码相关的命令比看起来要多:改自己的、重置别人的、批量初始化、锁定和解锁。分清楚 passwd 和 chpasswd 的用途,能省掉一大半重复劳动。
passwd
passwd 改密码。普通用户只能改自己的,root 可以改任何人的。它写的是 /etc/shadow 里的哈希,不是明文。日常用得最多的是三种:给自己改、给同事重置、把某个账号锁掉。
- 优点 · 交互输入不回显:密码不会留在 shell 历史和进程列表里。
- 优点 · -S 一次看清状态:是否设了密码、锁没锁、什么时候过期,一行输出全有。
- 缺点 · 不能批量:一次只能改一个,几十个账号只能写循环。
- 缺点 · 脚本里传密码不安全:echo 会被 history 和 ps 抓到,--stdin 也只有 RHEL 系支持。
| 参数 | 作用 |
|---|---|
| 不带参数 | 改自己的密码 |
passwd 用户名 | root 重置别人的密码 |
-l / -u | 锁定 / 解锁密码 |
-d | 清空密码,等于免密登录,慎用 |
-e | 下次登录强制改密码 |
-S | 查看密码状态 |
--stdin | 从标准输入读密码,仅 RHEL 系 |
直接敲 passwd 回车,连问两遍新密码,输入不显示,这是最安全的用法。passwd -S zhangsan 输出一行:用户名、状态、最后修改日期、最短有效期、最长有效期、警告天数。第二个字段是 PS 表示正常、LK 表示锁定、NP 表示空密码,查“这账号到底能不能登”比翻 /etc/shadow 快得多。
# 给自己改
passwd
# root 给别人重置
passwd zhangsan
# 看状态:PS 正常 / LK 锁定 / NP 空密码
passwd -S zhangsan
# 强制下次登录改密码
passwd -e zhangsan
chpasswd
chpasswd 从标准输入批量读“用户名:密码”,一次改一批。它存在的理由很实际:初始化一批机器、给一批测试账号设同一个初始密码,用 passwd 一个个敲要敲到天亮。
- 优点 · 真正能批量:一行一条记录,管道喂进去就完事,不用写循环。
- 优点 · 支持已加密的哈希:-e 传 SHA-512 串,密码本身不出现在任何日志里。
- 缺点 · 明文会进 shell 历史:命令执行完要清 history,多人共用的跳板机上尤其要注意。
- 缺点 · 不做强度校验:设成 123456 也照收,密码策略得另外靠 PAM 管。
| 参数 | 作用 |
|---|---|
| 不带参数 | 从 stdin 读“用户:密码” |
-e | 输入的是已加密的密码 |
-c 方法 | 指定加密算法,部分版本支持 |
echo "zhangsan:Init@2026" | chpasswd 直接生效,不给任何提示,改错了也不会告诉你。批量时用 heredoc 一次喂几十行。要避免明文外泄,先用 openssl passwd -6 算出哈希,再用 chpasswd -e 喂进去,哈希反推不出原文,落进日志也只是一串字符。
# 单个
echo "zhangsan:Init@2026" | chpasswd
# 批量
cat <<'EOF' | chpasswd
zhangsan:Init@2026
lisi:Init@2026
wangwu:Init@2026
EOF
# 传哈希,避免明文
HASH=$(openssl passwd -6 'Init@2026')
echo "zhangsan:$HASH" | chpasswd -e
Linux 怎么查看性能:CPU、内存、磁盘、网络
“机器变慢了”这句话本身没有信息量,得把它拆成四份:CPU 在忙什么、内存还剩多少、磁盘是不是满了、网络连不连得出去。下面四个命令分别对应其中一项,排查的顺序通常也是这个顺序。
top
top 是登上去第一眼该看的命令。它把负载、CPU、内存、进程一次铺在一个屏幕上,默认两秒刷一次。真正需要盯的是三处:第一行的 load average、内存那一行的 available,以及列表里占 CPU 最高的那几个进程。
- 优点 · 关键指标在一个屏里:负载、CPU 分布、内存、进程列表都在,不用来回切命令。
- 优点 · 交互键能就地排查:按 1 展开每个核、按 M 按内存排序、按 k 直接杀进程。
- 缺点 · CPU 那行是全核平均:四核机器上一个核跑满,这里只显示 25%,容易误判成“没那么忙”。
- 缺点 · 只看当下,不能回看:想找“三分钟前那波尖峰”,得靠 sar 或监控系统。
| 参数 | 作用 |
|---|---|
-d 2 | 刷新间隔 2 秒 |
-n 3 | 刷新 3 次后自动退出 |
-p 1234 | 只看指定 PID |
-u nginx | 只看指定用户的进程 |
-b | 批处理模式,适合重定向到文件 |
-H | 显示线程而不是进程 |
交互 1 / M / P / k | 展开每核 / 按内存排 / 按 CPU 排 / 杀进程 |
top 直接跑,两秒刷一次,占满整个终端,Ctrl+C 退出。top -b -n 1 > /tmp/top.txt 只抓一次快照写进文件,适合放进定时任务留历史。top -p 1234 只盯一个进程,服务 CPU 突然拉高时比在大列表里翻快得多。load average 后面三个数分别是 1、5、15 分钟的平均值,要和核数对照着看——4 核机器上 4.0 意味着刚好跑满,8.0 就是有一半在排队。
# 只盯一个进程
top -p $(pgrep -f java | head -1)
# 抓一次快照存下来
top -b -n 1 -o %CPU | head -20
# 进去之后:1 展开每核,M 按内存排,k 杀进程
free
free 看内存。输出里有一列叫 available,这才是该看的数字,不是第一列的 free。Linux 会把空闲内存拿去做页缓存,所以 free 很小是正常的,available 才代表“还能给新程序用多少”。
- 优点 · 一眼看出够不够:available 接近 0 才说明内存真的紧张,其余情况都是缓存。
- 优点 · -s 能持续盯:每两秒刷一次,内存有没有缓慢泄漏这样看最直接。
- 缺点 · 默认单位是 KB:一屏数字没有量级感,不换算基本读不出结论。
- 缺点 · 缓存和真实占用容易混:buff/cache 大不代表内存被程序吃掉了,恰恰相反。
| 参数 | 作用 |
|---|---|
-h | 人类可读单位 |
-m / -g | 按 MB / GB 显示 |
-s 2 | 每 2 秒刷新一次 |
-t | 多输出一行总计 |
-w | 把 buff 和 cache 拆成两列 |
free 直接跑,单位是 KB,一屏数字看不出所以然。free -h 出来是 3.2Gi、512Mi 这种,判断够不够只看 available 那一列。free -h -s 2 每两秒刷一次,内存泄漏就是靠这样盯出来的:available 一路往下掉且不回头,基本可以确定有进程在漏。缓存占着不是坏事,available 掉下去才是。
# 人类可读
free -h
# 每 2 秒刷新
free -h -s 2
# 只看总量和可用
free -h | awk 'NR<=2 {print $1, $2, $7}'
df 与 du
df 看文件系统还剩多少,du 看某个目录占了多少。两个一起用才能回答“磁盘为什么满了”:df 告诉你哪块盘满,du 告诉你那块盘里谁占的地方。它们不是一回事,只跑一个经常得不出结论。
- 优点 · 分工清楚:df 站在文件系统看总量,du 站在目录看占用,问题定位靠两者对照。
- 优点 · df -i 能查 inode:空间还剩一半却写不进去,八成是 inode 用完了。
- 缺点 · du 慢且吃 IO:几十万个小文件的目录要跑很久,还可能把磁盘 IO 打满。
- 缺点 · du 的结果常常小于 df:被删除但还有进程开着的文件、被挂载点覆盖的目录,du 都算不到。
| 参数 | 作用 |
|---|---|
df -h | 人类可读的容量 |
df -i | 看 inode 使用率 |
df -T | 显示文件系统类型 |
du -s | 只给总计,不逐层列 |
du --max-depth=1 | 只往下钻一层 |
du -h | 人类可读 |
df -h 输出里 Use% 接近 100% 的那一行就是问题所在。接着 du -h --max-depth=1 /var | sort -h 一层层往下钻,通常十分钟内能定位到是哪个目录。df -i 是另一条线:IUse% 满了但空间还有一半,删日志没用,得清理大量小文件——/var/spool/postfix 和 session 文件是常见元凶。
# 哪块盘满了
df -hT
# inode 是不是用完了
df -i
# 逐层找占空间最多的目录
du -h --max-depth=1 /var | sort -h | tail -5
# 只看一个目录总大小
du -sh /var/log
ss
ss 是 netstat 的替代品,查端口和连接。netstat 在新系统上默认不装,ss 更快,因为它直接读内核里的 socket 表,不逐个读 /proc。运维里九成的用法是确认“服务到底有没有在监听那个端口”。
- 优点 · 比 netstat 快得多:连接数上万时差距明显,本机上跑一次几乎不耗时。
- 优点 · -p 直接给进程名和 PID:不用再跑 lsof 反查是谁占着端口。
- 缺点 · 参数组合要记:-tlnp 四个字母,少一个就少一类信息。
- 缺点 · 普通用户看不到归属:不带 sudo 时只能看到自己的 socket 关联进程。
| 参数 | 作用 |
|---|---|
-t / -u | 只看 TCP / 只看 UDP |
-l | 只看监听状态 |
-n | 不解析域名和端口名,直接显示数字 |
-p | 显示进程名和 PID |
-a | 所有状态,不只监听 |
-s | 连接状态汇总统计 |
ss -tlnp 是查端口的标准姿势:只列 TCP、只听、显示数字、带进程。不加 -n 的话 22 会显示成 ssh,看着友好但在脚本里没法精确 grep。查某个端口被谁占着,用 ss -tlnp | grep ':8080';查连接堆积,用 ss -s 看 timewait 有多少。端口对了,再去看防火墙。
# 监听端口和对应进程
ss -tlnp
# 谁占了 8080
ss -tlnp | grep ':8080'
# 连接状态汇总
ss -s
Linux 怎么看系统信息
装包前确认架构、判断内核版本支不支持某个特性、查服务为什么起不来——这三件事都要先拿到系统事实。下面这几个命令不用装任何东西,任何环境都能跑。
uname 与 lscpu
uname 报内核信息,lscpu 报 CPU 信息。装软件前确认架构、判断内核版本够不够、看机器有几核,都靠这两个。它们不带参数就能出结果,参数只是把范围收窄。
- 优点 · 到处都有:容器、救援模式、最小化系统里都在,不依赖额外软件包。
- 优点 · 输出稳定好解析:-m 出来就是 x86_64 或 aarch64,可以直接写进脚本判断。
- 缺点 · uname 不给发行版:想知道是 Ubuntu 还是 CentOS,得看 /etc/os-release。
- 缺点 · lscpu 字段名不固定:不同内核版本输出的行顺序会变,别按固定行号取值。
| 参数 | 作用 |
|---|---|
uname -a | 全部信息 |
uname -r | 只要内核版本 |
uname -m | 只要硬件架构 |
uname -n | 只看主机名 |
| lscpu | 不带参数直接输出表格 |
lscpu -e | 列表形式,更好读 |
uname 单独跑只输出 Linux 一个词,等于没说。uname -a 一次给全:内核名、主机名、内核版本、编译时间、架构。装二进制包之前先看 uname -m,x86_64 和 aarch64 的包不能互换,下错了会报 cannot execute binary file。lscpu 不带参数就是一张表,CPU(s) 那一行就是逻辑核数。
# 内核 + 架构一次看全
uname -a
# 装包前确认架构
uname -m
# CPU 型号和核数
lscpu | grep -E 'Model name|^CPU\(s\)'
journalctl
journalctl 读 systemd 的日志,把内核日志、服务日志、启动日志收在一处,不用再分别翻 /var/log/messages 和 dmesg。查“服务为什么起不来”时,journalctl -u 服务名 是第一步。
- 优点 · 按服务、时间、级别筛:条件直接写在参数里,不用在大文件上 grep 再人肉过滤。
- 优点 · -f 能实时跟:改完配置重启服务,日志立刻滚出来,比 tail -f 准。
- 缺点 · 默认不持久化:不少发行版重启后日志就没了,要手动创建 /var/log/journal。
- 缺点 · 默认进 less 分页:不加 --no-pager 在脚本里会卡在等按键那一步。
| 参数 | 作用 |
|---|---|
-u nginx | 只看某个服务 |
-f | 实时跟随 |
-n 100 | 最后 100 行 |
--since "1 hour ago" | 时间范围,也接受 today 这类写法 |
-p err | 只看 error 及以上级别 |
-b / -b -1 | 本次启动 / 上一次启动 |
-k | 只看内核日志,等于 dmesg |
--no-pager | 不分页,直接打印完 |
journalctl 直接跑会把所有日志从头翻给你,几万行,还默认用 less 分页。journalctl -u nginx -n 50 --no-pager 是排查服务最顺手的组合:只看这个服务、最后 50 行、打完就退出。想确认重启之后到底起没起来,加 -b 限定本次启动,上一次开机的噪音就被滤掉了。
# 某个服务最后 50 行
journalctl -u nginx -n 50 --no-pager
# 实时跟
journalctl -u nginx -f
# 今天的错误
journalctl --since today -p err --no-pager
# 本次启动的内核日志
journalctl -k -b
Linux 怎么安装软件
Linux 装软件分两套体系:Debian 系用 apt(底层 dpkg),RHEL 系用 dnf 或 yum(底层 rpm)。包名一样、命令不一样,先把“你的机器属于哪一套”搞清楚,能省掉大量搜索时间。装完还有一步不能漏——启动并设为开机自启,那是 systemctl 的事。
apt
apt 是 Debian 系(Ubuntu、Debian)的包管理器。它自己不搬文件,实际安装交给 dpkg,apt 负责找源、解依赖、算方案。装任何东西之前必须先 update 一次,这一步不是可选的。
- 优点 · 依赖自动处理:装一个包会把它需要的库一起装上,不用手动找、手动按顺序装。
- 优点 · 版本来源清楚:apt policy 能看到候选版本来自哪个源,装错源的问题一眼可见。
- 缺点 · update 和 upgrade 容易混:update 只刷新索引,一个包都不升级,新手常以为敲完就更新完了。
- 缺点 · 不做自动清理:旧内核和不再需要的依赖会一直留着,/boot 满了多半是这个原因。
| 参数 | 作用 |
|---|---|
update | 刷新软件源索引,只改索引不升级 |
upgrade | 升级已装的包,不为解依赖删包 |
full-upgrade | 升级并允许为解依赖删包 |
install 包名 | 安装 |
remove / purge | 卸载 / 连配置文件一起删 |
autoremove | 清掉不再被依赖的包 |
policy 包名 | 看候选版本和来源 |
-y | 全部自动确认 |
--no-install-recommends | 不装推荐包,镜像更小 |
apt install nginx 会先列出要装哪些包、占多少空间,再问一句要不要继续,按 Y 才动。加 -y 就直接装完,适合脚本。加 --no-install-recommends 只装必需依赖,容器镜像能小几十兆。装之前 apt update 一次,否则可能拿着几个月前的索引去要包,报 404 Not Found 还以为是源挂了。
# 装之前先刷新索引
apt update
# 安装
apt install -y nginx
# 卸载并清掉配置
apt purge -y nginx
# 清掉不再需要的依赖
apt autoremove -y
dnf
dnf 是 RHEL 8 之后的默认包管理器,CentOS 7 及更早用 yum。两者命令几乎一样,dnf 依赖解析更快、内存占用更低。老教程里写 yum,新系统上照样能跑,因为 yum 现在是指向 dnf 的软链。
- 优点 · 事务式安装:装到一半失败能整体回滚,不会留下半装状态。
- 优点 · history 能回退:dnf history 列出每次操作,undo 一个编号就撤回去。
- 缺点 · 源配置比 apt 麻烦:要手动放 .repo 文件,baseurl 写错时报错也不太直观。
- 缺点 · 缓存要手动清:不定期 dnf clean all,元数据过期会报校验失败。
| 参数 | 作用 |
|---|---|
install / remove | 安装 / 卸载 |
upgrade | 升级 |
search / info | 搜索 / 看详情 |
list installed | 已安装的包 |
provides /usr/sbin/ss | 反查某个命令属于哪个包,要写绝对路径 |
history | 操作历史 |
clean all | 清缓存 |
-y | 自动确认 |
dnf install nginx 会先算依赖再问确认。dnf provides /usr/sbin/ss 在不知道 ss 属于哪个包时特别有用,它直接告诉你来自 iproute。写成星号的 */ss 会顺带匹配一堆同名的 locale 和 man 文件,反查要用绝对路径。dnf history 后面接 undo 编号,能把刚才那次误装整个撤掉,这一点比 apt 直观。在 CentOS 7 上敲 dnf 会提示找不到命令,换成 yum 就行,参数一模一样。
# 安装
dnf install -y nginx
# 反查命令属于哪个包
dnf provides /usr/sbin/ss
# 看历史并回退最近一次
dnf history
dnf history undo 12
systemctl
systemctl 管 systemd 的服务:启动、停止、开机自启、看状态。装完软件不 enable,重启就没了;改完 unit 文件不 daemon-reload,改动根本不生效。这两个是新手最常漏的步骤,也是“明明改了却没反应”的头号原因。
- 优点 · 状态信息全:status 一次给出运行状态、主 PID、最近十行日志、启动时间。
- 优点 · enable 和 start 分开:可以只设开机自启不现在启动,也可以反过来,控制粒度清楚。
- 缺点 · 只管 systemd 的服务:老式 init 脚本、容器里的前台进程都不归它管。
- 缺点 · 容器里常常用不了:PID 1 不是 systemd 时会报 Failed to connect to bus。
| 参数 | 作用 |
|---|---|
start / stop / restart | 启停 |
reload | 重读配置,不重启进程 |
status 服务名 | 看状态和最近日志 |
enable / disable | 开机自启 开 / 关 |
is-active / is-enabled | 判断状态,适合写进脚本 |
list-units --type=service --state=running | 列出正在跑的服务 |
daemon-reload | 改完 unit 文件后必须执行 |
mask | 彻底禁用,防止被依赖顺带拉起 |
systemctl start nginx 只启动这一次,重启机器就没了;systemctl enable nginx 只设开机自启,现在并不启动。两个都要就 systemctl enable --now nginx。改完 /etc/systemd/system/xxx.service 之后必须先 daemon-reload,否则 restart 用的还是内存里的旧配置——这个坑几乎每个人都踩过一次。enable 和 start 是两件事,别当成一件。
# 启动并设开机自启
systemctl enable --now nginx
# 看状态和最近日志
systemctl status nginx
# 改完 unit 文件之后
systemctl daemon-reload && systemctl restart nginx
# 脚本里判断是否在跑
systemctl is-active --quiet nginx && echo running
Linux 怎么下载和传输文件
服务器上没有浏览器,也没有 FTP 客户端。要把安装包拉进来、把日志拉出来、把代码推到另一台机器,用的就是下面四个命令。前两个解决“从网上拿”,后两个解决“在两台机器之间搬”。
wget
wget 专门下文件,不干别的。它的长处是能续传、能递归镜像、断了重跑会接着下。服务器上拉个 ISO、下个安装包、半夜跑批下载,用它比 curl 省心。
- 优点 · 默认支持断点续传:-c 一条命令接着上次的位置下,几百兆的包不用从头来。
- 优点 · 能后台跑:-b 丢到后台,关掉 SSH 也会继续。
- 缺点 · 复杂场景不灵活:带认证、带自定义头、要发 POST 的下载,不如 curl 好使。
- 缺点 · 不校验完整性:下完是多大就是多大,包坏了要到解压或安装时才发现。
| 参数 | 作用 |
|---|---|
-O 文件名 | 另存为指定名字 |
-c | 断点续传 |
-P 目录 | 存到指定目录 |
-q | 安静模式,不输出进度 |
-b | 后台下载 |
--limit-rate=2m | 限速,别把带宽占满 |
--no-check-certificate | 跳过证书校验,内网自签证书时用 |
wget https://example.com/app.tar.gz 会把文件存成 app.tar.gz,进度条一路刷到底。加 -O /tmp/app.tgz 改名并存到指定路径;加 -c 在断掉之后重跑同一条命令,从断点接着下。默认会校验 HTTPS 证书,内网自签证书的地址会报 certificate not trusted,得加 --no-check-certificate 才过得去。
# 下载并另存
wget -O /tmp/app.tar.gz https://example.com/app.tar.gz
# 断点续传 + 限速
wget -c --limit-rate=2m https://example.com/big.iso
# 后台下载,日志写文件
wget -b -o /tmp/dl.log https://example.com/big.iso
curl
curl 是通用 HTTP 客户端,能做的事比 wget 多得多:发 POST、自定义头、只看响应头、测接口。运维里它更像“从命令行调接口”的工具,而不是下载工具。
- 优点 · 什么请求都能发:GET、POST、带 JSON body、带认证头,一条命令搞定。
- 优点 · -I 只看响应头:测地址通不通、跳没跳转、返回什么状态码,不用下整个页面。
- 缺点 · 默认输出到屏幕:忘了加 -O 或 -o,二进制内容会直接刷满终端,还可能把字符集搞乱。
- 缺点 · 不自动续传:大文件断了只能重下,这一点不如 wget。
| 参数 | 作用 |
|---|---|
-O | 用远端文件名保存 |
-o 文件名 | 指定保存名 |
-L | 跟随跳转 |
-I | 只要响应头 |
-s | 静默,不显示进度 |
-k | 忽略证书校验 |
-H "头: 值" | 自定义请求头 |
-d '数据' | POST 数据 |
-X 方法 | 指定请求方法 |
-w "%{http_code}" | 自定义输出,脚本里常用来取状态码 |
curl https://example.com 把整个 HTML 打到屏幕上,只能看不能用。curl -O 才是存成文件。curl -I https://example.com 只回响应头,第一行的 200 就是结论。脚本里判断接口活着没,用 curl -s -o /dev/null -w '%{http_code}' https://example.com/health,标准输出只有一个 200,可以直接拿去比较。
# 只取状态码
curl -s -o /dev/null -w '%{http_code}\n' https://example.com/health
# 下载,保留远端文件名
curl -LO https://example.com/app.tar.gz
# 调接口:POST JSON + 认证头
curl -s -X POST https://api.example.com/v1/login \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer xxx' \
-d '{"user":"admin"}'
scp
scp 走 SSH 传文件,语法和 cp 几乎一样,只是路径里多了个 主机: 前缀。它是最不用动脑子的传输方式:两边都有 sshd 就能用,不用另装服务、不用开端口。
- 优点 · 零配置:只要有 SSH 权限就能传,不用起 FTP 或共享目录。
- 优点 · 语法直观:本地路径和远端路径并排写,跟 cp 一样。
- 缺点 · 大文件慢:加密开销加上不支持增量,传 10G 比 rsync 慢一截。
- 缺点 · 断了就得重来:没有续传,传到 90% 掉线只能从头开始。
| 参数 | 作用 |
|---|---|
-r | 递归传目录 |
-P 2222 | 指定端口,大写 P |
-p | 保留修改时间和权限,小写 p |
-C | 传输时压缩,对文本有效 |
-l 8000 | 限速,单位 Kbit/s |
-i 私钥 | 指定密钥文件 |
scp app.tar.gz root@10.0.0.8:/tmp/ 把本地文件推到远端。scp -r ./dist root@10.0.0.8:/var/www/ 传整个目录。最容易错的是端口:-P 必须大写,写成小写 p 会被当成“保留时间戳”,然后它去连 22 端口失败,报 connection refused,让人以为对面防火墙拦了。
# 本地推到远端
scp app.tar.gz root@10.0.0.8:/tmp/
# 从远端拉回来
scp -r root@10.0.0.8:/var/log/app ./logs/
# 非默认端口(大写 P)
scp -P 2222 ./dist.tar.gz root@10.0.0.8:/opt/
rsync
rsync 是增量同步。第一次全量,之后只传变化的部分,所以定时备份、发布代码、迁移机器都该用它而不是 scp。它还有个别的工具没有的能力:--dry-run 先模拟一遍,看清楚要删什么再真跑。
- 优点 · 增量传输:改了一个文件,第二次同步只传那一个,省时间也省带宽。
- 优点 · --dry-run 能预演:配 --delete 时几乎是必需的,否则可能把目标端多出来的东西全删掉。
- 缺点 · 参数多,配错代价大:源路径末尾有没有斜杠,结果完全不同。
- 缺点 · 默认不删多余文件:想真正镜像必须显式加 --delete,这一点常被误解。
| 参数 | 作用 |
|---|---|
-a | 归档模式,等于 -rlptgoD,保留权限属主时间 |
-v | 显示过程 |
-z | 传输时压缩 |
--delete | 删掉目标端源里没有的文件 |
-n | 只模拟不执行 |
-P | 显示进度并支持断点续传 |
--exclude=模式 | 排除某些文件 |
-e "ssh -p 2222" | 指定 ssh 参数 |
rsync -av /data/ backup/ 和 rsync -av /data backup/ 结果不一样:源路径带斜杠是“同步目录里的内容”,不带是“把目录本身放进去”,最后会变成 backup/data/。要配 --delete 之前,先跑一次加 -n 的版本,输出里每个将被删的文件前面带 deleting,看清楚了再执行。差一个斜杠,差一层目录。
# 先预演,看要删什么
rsync -avn --delete /data/ /backup/data/
# 确认后真跑
rsync -av --delete /data/ /backup/data/
# 走非默认 SSH 端口
rsync -avz -e "ssh -p 2222" ./dist/ root@10.0.0.8:/var/www/html/
一张速查表
把这几个场景里最常用的形态压成一张表,贴在第二块屏幕上或者记事本里都行。表里只写了最常用的一两个参数组合,不是全集。
| 要干什么 | 敲什么 | 看哪一眼 |
|---|---|---|
| 目录里有什么、谁最近改过 | ls -lht | 时间列和大小列 |
| 找某个时间之后改过的文件 | find /path -type f -mtime -1 | 先把 -delete 去掉再跑 |
| 找哪个配置写了这个值 | grep -rn "10.0.0.12" /etc | 文件名和行号 |
| 改配置文件 | cp x.conf x.conf.bak && vim x.conf | 先备份再动手 |
| 服务有没有在监听 | ss -tlnp | 进程名和端口 |
| 内存还剩多少 | free -h | available 那列 |
| 磁盘满在哪 | df -hT 再 du -h --max-depth=1 | Use% 和目录大小 |
| 服务起没起来 | systemctl status 服务名 | Active 那行和最近十行日志 |
| 看最近的报错 | journalctl -u 服务名 -n 50 --no-pager | 最后几行的关键词 |
| 装个软件 | apt install 或 dnf install | 先确认是哪个系 |
| 把文件传到另一台机器 | rsync -avz ./dist/ root@ip:/path/ | 源路径末尾的斜杠 |
回到开头那三个瞬间:退出 vim 是按 Esc 再输入 :wq;free 要看 available 那一列,不是 free;ftp 早被 scp 和 rsync 替代了。这三个动作串起来,大概就是“能自己登上一台 Linux 干活”的门槛。
再往下走有两个方向。一个是把这些命令塞进 crontab,让它定时自己跑,比如每天把磁盘和内存状态发到邮箱——这件事我写过一篇 用邮件日报监控软路由,思路套到任何一台 Linux 上都一样。另一个是折腾网络,端口转发、内网穿透这类活儿,绕不开对 ss 和路由表的理解,可以从 NAT44 打洞 和 DNS 防绕过 这两篇看起。
先给自己定个小目标:下次登上一台不熟的机器,不看笔记,把“谁在占端口、盘还剩多少、服务起没起来”这三件事查清楚。能做到这一步,剩下的命令都是在这个骨架上长出来的。
如果你觉得这篇文章不错,有用的话可以点击下面的“赞赏”支持作者,你的支持是我更新的动力(饿饿吃饭)。


Comments NOTHING