导读
很多刚接触 Linux 的人都有同一个困扰:命令太多记不住。其实你只需要记住一个规律——Linux 命令是按"场景"分的,把常用操作归到六类里,每类掌握 3~4 个最常用的,日常 90% 的工作都能搞定。
本文覆盖这六类场景:文件与目录(增删改查)、权限管理(谁能读写执行)、进程管理(谁在跑、怎么关)、网络连接(传下载测连通)、日志文本(找内容看变化)、磁盘空间(哪占满了)。每个命令都给出最常用的参数组合,直接复制就能跑。国内用户请注意:文中涉及 GitHub 等海外链接时已附带国内镜像加速说明。
一、文件与目录:ls / cp / mv / rm / tar / find
这是每天都会用到的基础操作,先看懂再上手。
ls — 列出文件与目录
ls -lh # 长格式 + 人类可读大小(-l),显示 KB/MB/GB 而非字节数
ls -la # 加上 -a:显示隐藏文件(以 . 开头的)
ls -lt # 按修改时间排序,最新的在最前面
小白提示:
-h是 human-readable 的缩写,看到-rw-r--r--这种一串字符别慌——后面会详细解释。
cd — 切换当前目录
cd ~ # 回到自己的家目录(等价于 cd /home/你的用户名)
cd .. # 退回上一级目录
cd - # 回到上一次所在的目录(来回切换很方便)
cd /var/log # 绝对路径跳转到系统目录
pwd — 显示当前你在哪个目录
pwd # 打印完整路径,如 /home/user/project
cp — 复制文件或目录
cp source.txt dest.txt # 复制单个文件
cp -r /data/project ./backup # 复制整个目录(-r = recursive,递归)
cp -v *.log /tmp/logs/ # 加 -v(verbose)显示复制了哪些文件
cp -p file1.txt file2.txt # 保留原文件的权限和时间戳(-p = preserve)
mv — 移动或重命名文件
mv old_name.txt new_name.txt # 重命名(其实就是移到同名目标)
mv file.txt /tmp/ # 移动到另一个目录
mv -i old.txt new.txt # 如果目标已存在,先问一句"确定覆盖?"(安全开关)
rm — 删除文件或目录 ⚠️
警告:Linux 的
rm没有回收站!删了就真没了,执行前一定要看清楚路径。
rm temp.txt # 删除单个文件
rm -r folder/ # 删除目录及其所有内容(必须加 -r)
rm -rf /tmp/big_cache/ # 强制删除 + 递归,不问确认(慎用!!!)
rm -i *.log # 交互式:每删一个都问你一次
tar — 打包与解压(Linux 最常用的压缩工具)
注意区分概念:“打包"是把多个文件合在一起,“压缩"是减小体积。
tar本身只做打包,配合-z(gzip)或-j(bzip2)才做压缩。
# 打包并压缩成 .tar.gz(最通用格式)
tar -czvf archive.tar.gz /path/to/dir # c=create 创建, z=gzip 压缩, v=显示过程, f=指定文件名
# 解压 .tar.gz
tar -xzvf archive.tar.gz # x=extract 解压
# 只查看压缩包内容不解压
tar -tzvf archive.tar.gz # t=list 列表
# 解压到指定目录
tar -xzvf archive.tar.gz -C /tmp/dest # C=output directory
# bzip2 格式(压缩率更高但更慢)
tar -cjvf archive.tar.bz2 /path/to/dir # j=bzip2
tar -xjvf archive.tar.bz2 # 解压 bz2
find — 按条件搜索文件
小白提示:
find是 Linux 中最灵活的搜索工具,但它不是模糊匹配文件名那么简单——它能按大小、时间、类型、权限等几十个条件来筛。
# 在当前目录找所有 .log 文件
find . -name "*.log"
# 只在子目录里找(不进入更深层级)
find /var/log -maxdepth 1 -name "*.log"
# 按文件大小查找(比如大于 100MB 的文件)
find / -type f -size +100M 2>/dev/null
# 按时间查找(7 天内修改过的文件)
find /home/user -mtime -7
# 找到后直接删除(配合 -ok 会更安全,每次确认)
find /tmp -name "*.tmp" -mtime +30 -ok rm {} \;
# 查找空目录
find /var -type d -empty
二、权限管理:chmod / chown
Linux 的权限体系是它安全性高的核心原因。理解它之前要先读懂这一串字符:
-rwxr-xr--
│││ ╰─── 其他人(other):读权限 r
││╰───── 所属组(group):执行 + 读权限(r+x = r-x)
│╰────── 所有者(owner):全部权限(r+w+x = rwx)
╰─────── 文件类型:- = 普通文件,d = 目录,l = 软链接
数字对照:r=4, w=2, x=1。所以 rwx=7, r-x=5, r--=4。
chmod — 修改权限
# 数字模式(推荐,简洁准确)
chmod 755 script.sh # 所有者全权限(7),组和其他人读+执行(5)
chmod 644 config.yml # 所有者读写(6),组和其他人只读(4)
chmod 600 private.key # 只有所有者能读写(私钥专用)
chmod 700 secret/ # 仅所有者可进入该目录
# 符号模式(直观但容易输错)
chmod u+x deploy.sh # u=user 给所有者添加执行权限
chmod o-w file.txt # o=other 移除其他人的写权限
chmod go+r shared.conf # g=group o=other 给组和其他人加读权限
# 递归修改目录及内部所有文件的权限
chmod -R 755 /var/www/html # -R = recursive
chmod -R 644 /var/www/html # 网页文件一般给 644 就行
chown — 修改文件所有者(需 sudo 提权)
# 改变文件的所有者和所属组
sudo chown user:group file.txt # user:group 格式
sudo chown www-data:www-data /var/www # 把网站目录交给 nginx/apache 的用户
sudo chown -R appuser:appgroup /app # 递归修改整个目录
为什么用 sudo?
sudo让你以超级管理员身份执行命令。这个操作会修改文件归属,普通用户无权这样做,所以需要管理员授权。执行完后你的权限立即恢复,不会"一直当管理员”。
umask — 新文件的默认权限掩码
umask # 查看当前掩码(通常是 022)
umask 022 # 设置新文件默认 644、新目录默认 755
umask 077 # 严格模式:新文件只有 owner 能访问
三、进程管理:ps / top / kill
ps — 查看快照式进程列表
ps aux # 查看所有用户的所有进程(最常用)
ps -ef # POSIX 格式,多了一列 PPID(父进程 ID)
ps aux --sort=-%mem # 按内存使用排序(降序),看谁吃内存最多
ps aux | grep python # 过滤出含 python 的进程
ps -u yourusername # 只看某个用户的进程
ps -eo pid,user,%cpu,%mem,cmd # 自定义列输出
小白提示:
ps aux输出中%CPU是 CPU 占用百分比,%MEM是内存占比,STAT列里R=运行中、S=睡眠中、Z=僵尸进程(问题进程,需要排查)。
top — 实时动态监控(按 q 或 Ctrl+C 退出)
top # 进入交互界面
top -c # 显示完整命令路径(不仅是命令名)
top -u yourusername # 只看某用户的进程
# 进入 top 后可用的快捷键:
# P → 按 CPU 排序 | M → 按内存排序 | k → 结束指定 PID 进程
# 1 → 展开每个 CPU 核心 | q → 退出
htop(可选增强版 top,需安装)
sudo apt install htop # Debian/Ubuntu 用 apt
sudo yum install htop # CentOS/RHEL 用 yum
htop # 彩色界面、鼠标支持、水平滚动条
kill / killall — 结束进程
kill 12345 # 发送 SIGTERM(温柔关闭,让进程自己清理)
kill -9 12345 # 发送 SIGKILL(强行杀掉,可能丢数据,最后手段)
kill -15 12345 # -15 就是 SIGTERM,和默认 kill 一样
kill -STOP 12345 # 暂停进程(SIGSTOP);kill -CONT 继续
killall nginx # 按名字终止所有同名进程
pkill -f "python main.py" # 按进程命令行内容匹配终止
什么时候用 -9? 正常情况先用
kill PID(不发参数即 SIGTERM 15)。只有在进程卡死、无响应时再用kill -9 PID——因为它不给进程留清理时间,数据库类进程被 -9 可能导致数据不一致。
systemctl — 管理服务启动/停止/开机自启
systemctl status nginx # 查看服务状态
systemctl start nginx # 启动服务
systemctl stop nginx # 停止服务
systemctl restart nginx # 重启服务
systemctl enable nginx # 设置开机自启
systemctl disable nginx # 取消开机自启
systemctl is-active nginx # 判断是否正在运行(输出 active/inactive)
四、网络连接:ss / curl / wget
ss — 查看网络连接(netstat 的现代替代品)
背景:
netstat曾是标准工具,但在现代 Linux 内核上已被ss取代(更快更全面)。两者用法类似。
ss -tuln # 列出所有监听端口(tcp+udp,数字形式显示)
ss -tulp # 加上程序名,知道哪个端口对应哪个进程
ss -s # 统计概览(连接总数、各状态分布)
ss -state established # 只看已建立的连接
ss dst 192.168.1.100 # 查看到特定 IP 的连接
curl — 网络请求万能工具(HTTP / HTTPS / FTP 都行)
小白提示:
curl是开发者最常用的网络调试工具——查 API、下载文件、测连通性都用它。GitHub 上有大量示例。
curl https://example.com # 最简单:把页面内容打到终端
curl -I https://example.com # 只拿响应头(不含页面体)
curl -o page.html https://example.com # 保存到文件(-o=output)
curl -L https://example.com # 跟随重定向(-L=location)
curl -X POST -H "Content-Type: application/json" -d '{"key":"value"}' https://api.example.com # POST 请求发 JSON
curl -s https://api.example.com/data | jq '.items[0].name' # 管道 + jq 解析 JSON(jq 需提前装)
curl -w "%{http_code}" -o /dev/null https://example.com # 只打印 HTTP 状态码(如 200/404/500)
# 国内用户如果访问 GitHub 慢:
# 直接用 ghfast.top 代理:curl https://ghfast.top/https://github.com/xxx
# 或用镜像站如 fastgit.xyz(部分场景可用)
wget — 断点续传下载工具
wget https://example.com/file.zip # 下载到当前目录
wget -O myfile.zip https://example.com # 指定文件名(-O=output)
wget -c https://example.com/large.iso # 断点续传(-c=continue,大文件必备)
wget -r -np https://example.com/docs/ # 递归下载整个目录(-r,-np=不爬上级目录)
wget -q https://example.com/file # 安静模式(-q=quiet,不显示进度)
.sh和.ps1双版本一键脚本提供了自动检测国内外网络环境并选择源的模板,文末可找到完整源码。对于国内的云服务器,推荐使用阿里云 OSS 镜像源或腾讯云镜像进行包管理器的加速替换。
五、日志与文本处理:tail / grep / awk / sed
tail — 查看文件末尾(实时跟踪日志的神器)
tail -n 20 access.log # 显示最后 20 行(-n 指定行数)
tail -n +100 access.log # 从第 100 行开始显示到结尾
tail -f /var/log/syslog # 实时跟踪文件新增内容(Ctrl+C 退出)
tail -F /var/log/syslog # -F 更健壮:文件轮转后自动跟上
tail -n 50 -f /var/log/app.log # 先看最近 50 行,再继续跟踪
实际场景:线上出问题时第一步经常是
tail -f /var/log/app.log看最新报错——秒定位问题根源。
grep — 全文搜索(Linux 最强文本过滤器)
grep "ERROR" /var/log/syslog # 查找含 ERROR 的行
grep -i "error" /var/log/syslog # -i 忽略大小写
grep -rn "TODO" /home/user/project/ # -r 递归搜索文件夹,-n 显示行号
grep -v "DEBUG" /var/log/app.log # -v 反向匹配:排除含 DEBUG 的行
grep -c "WARN" /var/log/syslog # -c 计数:有多少行包含 WARN
grep -A 3 -B 2 "Exception" error.log # 前后上下文:匹配行上面 2 行 + 下面 3 行
grep -E "(start|stop|restart)" service.log # -E 扩展正则:匹配任意一个关键词
# 组合管道经典用法
cat /var/log/nginx/access.log | grep "404" | wc -l # 统计 404 错误数量
journalctl -u nginx --since today | grep -i "error" # 今天 nginx 的错误日志
# 实战示例:让 AI 分析你的 Nginx 日志前 10 大 IP
curl -s https://api.openai.com/v1/chat/completions \
-H "Authorization: Bearer YOUR_KEY" \
-d '{"model":"gpt-4","messages":[{"role":"user","content":"请分析以下 Nginx access.log 前 20 行,列出访问量最高的 IP:\n..."}]}'
# 国内用户推荐用云间 API 中转站(https://cloudzone-api.cyou/),OpenAI 兼容接口,国内直连免翻墙,90+ 模型 0.05x 起,注册即用
awk — 列数据处理引擎(比 grep 更强大,能按列筛选、计算)
# 最简单的用法:提取第几列
awk '{print $1}' /etc/passwd # 打印第一列(用户名)
awk '{print $1, $3}' /var/log/syslog # 打印第一列和第三列
# 条件过滤(类似 WHERE)
awk '$3 > 100 {print $0}' data.csv # 第三列大于 100 的行全打印
awk -F: '$3 == 0 {print $1}' /etc/passwd # -F 指定分隔符为冒号,找出 UID=0 的用户
# 综合实战:分析 Nginx 日志,找出访问量最高的 IP
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -10
# 拆解:取第一列(IP) → 排序 → 去重并计数 → 按数量降序 → 取前 10
# 统计汇总
awk '{sum += $2} END {print "总和:", sum}' data.txt
sed — 流式文本编辑器(批量替换、删除、插入)
# 最常用的:全局替换(-i 原地修改文件,不加 -i 只输出不改动原文件)
sed 's/old/new/g' file.txt # 把文件中所有 old 换成 new
sed -i 's/http:/https:/g' config.yml # 把所有 http 改成 https(安全起见先不加 -i 预览)
sed -i '/^#/d' file.conf # 删除所有以 # 开头的注释行
# 删除行
sed -i '5,10d' file.txt # 删除第 5 到 10 行
sed -i '/^$/d' file.txt # 删除所有空行
# 插入/追加
sed -i '1 i\# This is a header line' file.txt # 在第 1 行前插入一行
sed -i '$ a\\n# End of file' file.txt # 在最后一行后追加内容
# 配合管道实现非破坏性处理
echo "hello world" | sed 's/world/Linux/' # 输出 hello Linux
cat config.yml | sed '/password/s/:.*/: ********/' # 把 password 后面的值替换成星号(脱敏)
安全提示:
sed -i会直接修改原文件!永远先用不带-i的版本预览结果,确认无误后再加-i。也可以先用sed -i.bak自动备份原文件。
六、磁盘与存储:df / du
df — 查看整体磁盘使用情况
df -h # 人类可读格式(GB/MB),最常用
df -Th # 加上文件系统类型(ext4/xfs/btrfs 等)
df -i # 查看 inode 使用情况(不是容量,是小文件数量)
df -h /var # 只看某个挂载点的状态
关键指标:
Use%超过 90% 就要警惕了。但如果df -i显示 inode 用满(100%),即使磁盘还有空间也存不了新文件——通常是因为有大量小文件(如 node_modules、缓存碎片)。
du — 查看目录/文件占了多少空间
du -sh /var/log # -s=summary 汇总,-h 人类可读:整个 log 目录多大
du -ah /home/user # -a=all 显示每个文件的大小
du -sh * | sort -rh # 当前目录下一级所有项,按大小倒序排列
du -sh /home/*/ | sort -rh | head -10 # 每个用户的主目录占用排行(前 10 名)
# 找出最大的文件夹(实用排障命令)
du -sh /* 2>/dev/null | sort -rh | head -20
ncdu(可选增强版 du,交互式磁盘分析)
sudo apt install ncdu # Debian/Ubuntu 安装
sudo yum install ncdu # CentOS/RHEL 安装
ncdu /var/log # 交互式界面,用方向键导航,Enter 进目录,D 删除文件
ncdu -x / # -x 不跨文件系统(不同分区不走)
ncdu -r /home | sort -rh > report.txt # 只输出文本保存为报告
如果你经常需要在服务器上排查磁盘问题,
ncdu比du直观得多——它给你一个类似浏览器的界面,一层层往下钻,一眼看出哪个文件夹吃了最多空间。搭配我们正文中的基础du命令一起学效果最好。
快速参考卡片(一张图总览)
结语
Linux 命令就像厨师手里的刀具——不需要记住每一种刀的具体尺寸和材质,重要的是知道切什么菜用什么刀。本文的六大分类就是那套"分类法”:
- 管文件 → 第一类(ls/cp/mv/rm/tar/find)
- 管权限 → 第二类(chmod/chown)
- 管进程 → 第三类(ps/top/kill)
- 管网络 → 第四类(ss/curl/wget)
- 管文本 → 第五类(tail/grep/awk/sed)
- 管磁盘 → 第六类(df/du)
记不住怎么办? 完全正常——专业运维也靠查手册。遇到不确定的命令,可以直接问 AI:粘贴错误信息或描述需求,一行指令就能得到可用的答案。如果你在国内且不想折腾网络环境,可以试试云间 API 中转站(https://cloudzone-api.cyou/),它是国内直连的云端 OpenAI 兼容接口,支持 90+ 模型,价格 0.05x 起,不用翻墙就能调用各种 AI 能力帮你看日志、写脚本、分析问题。
想要完整的双平台一键脚本吗?下方提供了
.sh(macOS/Linux/WSL)和.ps1(Windows PowerShell)两个版本,公开完整源码,你可以直接复制粘贴到文本文件里运行,也可以下载后用任何代码编辑器审查每一行。
📦 一键脚本完整源码
不方便下载的同学可以直接复制下方代码块,新建文本文档粘贴后保存为 .sh(Linux/macOS/WSL)或 .ps1(Windows),双击或 bash xxx.sh 即可运行。脚本公开完整源码,欢迎复制给任何 AI 审查。也可从 install-linux-command-guide.sh 下载。
#!/usr/bin/env bash
set -u
# ============================================================
# Linux 常用命令实战速查 — 一键脚本(macOS / Linux / WSL)
# 公开源码,欢迎审查 —— 不放心可先复制给 AI 判断
# 功能:检测网络环境 → 提示安装基础工具 → 输出机器摘要
# 不涉及 API Key(本主题纯本地工具教程,无需任何密钥)
# ============================================================
GREEN='\033[0;32m'; YELLOW='\033[1;33m'; RED='\033[0;31m'; CYAN='\033[0;36m'; NC='\033[0m'
info() { echo -e "${GREEN}[INFO]${NC} $1"; }
warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
error() { echo -e "${RED}[ERROR]${NC} $1"; }
step() { echo -e "${CYAN}[STEP]${NC} $1"; }
detect_network() {
step "检测网络环境(国内 / 国外)..."
if curl -fsI --max-time 5 "https://claude.ai" >/dev/null 2>&1; then
info "可直连 claude.ai,判定为海外网络"
echo "overseas"
else
warn "无法直连 claude.ai,判定为国内网络环境(将自动切换国内镜像源)"
echo "domestic"
fi
}
get_package_manager() {
if command -v apt >/dev/null 2>&1; then
echo "apt"; return 0
elif command -v yum >/dev/null 2>&1; then
echo "yum"; return 0
elif command -v dnf >/dev/null 2>&1; then
echo "dnf"; return 0
elif command -v brew >/dev/null 2>&1; then
echo "brew"; return 0
else
error "未检测到支持的包管理器(apt/yum/dnf/brew)。请手动安装基础工具。"
return 1
fi
}
install_tools() {
local net="$1"
local pm
pm=$(get_package_manager) || exit 1
step "检查并安装基础工具 (wget / curl / unzip / tree)..."
local need_install=""
# 逐个检查
for tool in wget curl unzip tree; do
if ! command -v "$tool" >/dev/null 2>&1; then
need_install="$need_install $tool"
else
info " $tool 已安装:$(command -v "$tool")"
fi
done
if [ -z "$need_install" ]; then
info "所有基础工具均已安装,跳过"
return 0
fi
case "$pm" in
apt|dnf)
step "使用 $pm 安装:$need_install ..."
# shellcheck disable=SC2086
if ! sudo "$pm" install -y $need_install 2>/dev/null; then
warn "$pm 安装失败,尝试备用方式..."
if command -v curl >/dev/null 2>&1; then
warn "缺少以下工具:$need_install"
info "Debian/Ubuntu 用户手动执行:"
echo " sudo apt install wget curl unzip tree"
info "CentOS/RHEL 用户手动执行:"
echo " sudo yum install wget curl unzip tree"
else
error "curl 也不可用,请通过浏览器打开 https://www.runoob.com/linux/linux-command-manual.html 查找各工具的安装方法"
return 1
fi
fi
;;
yum)
step "使用 $pm 安装:$need_install ..."
if ! sudo "$pm" install -y $need_install 2>/dev/null; then
error "yum 安装失败。请手动执行:sudo yum install wget curl unzip tree"
return 1
fi
;;
brew)
step "使用 brew 安装:$need_install ..."
if ! brew install $need_install 2>/dev/null; then
error "brew 安装失败。请手动执行:brew install wget curl unzip tree"
return 1
fi
;;
esac
info "安装完成"
}
show_system_info() {
step "收集系统信息(验证学以致用)..."
echo ""
echo "--- CPU ---"
if command -v nproc >/dev/null 2>&1; then
echo "逻辑核心数: $(nproc)"
fi
if command -v lscpu >/dev/null 2>&1; then
lscpu 2>/dev/null | grep "Model name" | tr -s ' ' | cut -d: -f2 | sed 's/^ //'
fi
echo ""
echo "--- 内存 ---"
free -h 2>/dev/null || vm_stat 2>/dev/null || echo "(free 不可用)"
echo ""
echo "--- 磁盘 ---"
df -h / 2>/dev/null
echo ""
echo "--- 操作系统 ---"
if [ -f /etc/os-release ]; then
. /etc/os-release
echo "${PRETTY_NAME:-$(uname -s)} ($(uname -r))"
else
uname -a
fi
echo ""
echo "--- 主机名 ---"
hostname
echo ""
info "以上信息均可以通过本文所学的命令自行获取。"
info "练习建议:试着用 ls/cd/pwd/df/ps/ssh 熟悉一下你的系统!"
echo ""
}
main() {
echo "============================================"
echo " Linux 常用命令实战速查 — 一键脚本"
echo " 适用于 macOS / Linux / WSL"
echo "============================================"
echo ""
local NET
NET=$(detect_network)
echo "网络环境: $NET"
echo ""
install_tools "$NET"
show_system_info
echo "============================================"
info "全部完成!"
echo "============================================"
echo ""
echo "下一步建议:"
echo " 1. 逐行阅读本文六个章节的命令,动手跑一遍"
echo " 2. 尝试用 man <命令> 或 https://www.runoob.com/linux/linux-command-manual.html 查阅更多用法"
echo " 3. 国内用户如需 AI 辅助学习,可访问 https://cloudzone-api.cyou/ (OpenAI 兼容、90+ 模型、国内直连、0.05x 起)"
}
main "$@"
# ============================================================
# Linux 常用命令实战速查 — 一键脚本(Windows PowerShell)
# 公开源码,欢迎审查 -- 不放心可先复制给 AI 判断
# 说明:本主题是 Linux 命令教程。PowerShell 版为 WSL 引导器,
# 检测 WSL 后将 Linux 脚本送入 WSL 内执行。
# ============================================================
$ErrorActionPreference = "Stop"
function Write-Info { Write-Host "[INFO] $args" -ForegroundColor Green }
function Write-Warn { Write-Host "[WARN] $args" -ForegroundColor Yellow }
function Write-Err { Write-Host "[ERROR] $args" -ForegroundColor Red }
function Write-Step { Write-Host "[STEP] $args" -ForegroundColor Cyan }
# 0. 透明说明
Write-Host ""
Write-Host "本脚本是一个引导器:它会在 WSL(Windows Subsystem for Linux)"
Write-Host "内运行配套的 Bash 脚本,输出机器摘要并安装基础工具。"
Write-Host "不涉及任何 API Key,全程开源可见。"
Write-Host ""
# 1. 检测 WSL
Write-Step "检查 WSL 环境..."
if (-not (Get-Command wsl -ErrorAction SilentlyContinue)) {
Write-Err "未找到 wsl 命令。请先安装 WSL:"
Write-Host " PowerShell(管理员)执行:wsl --install"
Write-Host " 重启后安装 Ubuntu 发行版,再运行本脚本。"
Write-Host " 或者直接在 Windows 上用 Git Bash / PowerShell 替代 Linux 命令。"
exit 1
}
try {
$wslHome = (wsl -e sh -c 'echo $HOME' 2>$null).Trim()
} catch {
$wslHome = "/root"
}
if ([string]::IsNullOrWhiteSpace($wslHome)) { $wslHome = "/root" }
Write-Info "WSL 主目录:$wslHome"
# 2. 把 Linux 脚本注入 WSL 并执行
Write-Step "将安装脚本传入 WSL 并执行..."
$scriptPath = Join-Path $env:TEMP "install-linux-command-guide.sh"
if (-not (Test-Path $scriptPath)) {
Write-Warn "未找到同目录的 install-linux-command-guide.sh,请将本 .ps1 与 install-linux-command-guide.sh 放在同一目录后重跑。"
Write-Host "(或者手动在 WSL 中执行:bash <(curl -fsSL https://cleanresolver.com/scripts/install-linux-command-guide.sh)"
exit 1
}
$tempWindows = [System.IO.Path]::GetFullPath($env:TEMP)
$mntPath = "/mnt/c" + $tempWindows -replace '^C:', '' -replace '\\', '/'
$remotePath = "/tmp/install-linux-command-guide.sh"
try {
wsl -e cp "$mntPath/install-linux-command-guide.sh" $remotePath
Write-Info "脚本已传入 WSL:$remotePath"
} catch {
Write-Err "传入 WSL 失败:$_"
Write-Host "请手动在 WSL 中执行:bash <(curl -fsSL https://cleanresolver.com/scripts/install-linux-command-guide.sh)"
exit 1
}
Write-Host ""
Write-Host "============================================"
Write-Host "正在 WSL 内执行(日志直接输出)……"
Write-Host "============================================"
wsl -e bash $remotePath
$code = $LASTEXITCODE
Write-Host ""
Write-Host "============================================"
if ($code -ne 0) {
Write-Err "WSL 内执行失败(退出码 $code)。请对照上方报错处理。"
exit 1
}
Write-Host ""
Write-Host "============================================"
Write-Info "完成!在 WSL 中试用本文学到的命令吧:"
Write-Host " ls -lh pwd df -h ps aux"
Write-Host "============================================"
关于透明原则:本教程中的所有命令都可以在官方文档中找到说明。一键脚本公开完整源码(上文两个代码块即全部),没有任何隐藏行为。欢迎复制给任何 AI 工具审查后再运行。如涉及
sudo,已在脚本注释中说明用途——仅在包管理器安装阶段需要,其余步骤均为只读查询,不会修改系统配置。
请完成验证后查看评论区