导读

很多刚接触 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 # 只输出文本保存为报告

如果你经常需要在服务器上排查磁盘问题,ncdudu 直观得多——它给你一个类似浏览器的界面,一层层往下钻,一眼看出哪个文件夹吃了最多空间。搭配我们正文中的基础 du 命令一起学效果最好。


快速参考卡片(一张图总览)

Linux 常用命令分类总览


结语

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,已在脚本注释中说明用途——仅在包管理器安装阶段需要,其余步骤均为只读查询,不会修改系统配置。