# Linux 命令 --- ## 一、SSH 远程连接与配置 ### 1.1 SSH 服务端配置(以 frunoob.cn 为例) > **服务器**: frunoob.cn > **系统**: Ubuntu 22.04.5 LTS > **SSH版本**: OpenSSH > **配置日期**: 2026-06-02 #### 配置摘要 当前服务器已配置为**同时支持密钥和密码登录**,并进行了安全加固。 **认证方式:** - ✅ **密钥认证** (首选): `PubkeyAuthentication yes` - ✅ **密码认证** (备用): `PasswordAuthentication yes` - ✅ **Root登录**: `PermitRootLogin yes` **安全加固:** - 最大认证尝试: 4次 (`MaxAuthTries 4`) - 会话超时: 60秒 (`LoginGraceTime 60`) - 严格模式检查 (`StrictModes yes`) - 禁用空密码 (`PermitEmptyPasswords no`) #### `/etc/ssh/sshd_config` 关键设置 ```ini # --- 认证核心设置 --- PermitRootLogin yes # 允许root登录 PubkeyAuthentication yes # 启用密钥认证 PasswordAuthentication yes # 启用密码认证 StrictModes yes # 严格模式检查 MaxAuthTries 4 # 最大认证尝试次数 MaxSessions 5 # 最大并发会话数 LoginGraceTime 60 # 登录超时(秒) # --- 网络设置 --- Port 22 # SSH端口 AddressFamily inet # IPv4 ListenAddress 0.0.0.0 # 监听所有地址 # --- 保活设置 --- ClientAliveInterval 60 # 每60秒发送保活包 ClientAliveCountMax 3 # 最大保活失败次数 # --- PAM认证 --- UsePAM yes # 使用PAM模块 ``` #### 密钥管理 **查看已授权的密钥:** ```bash cat /root/.ssh/authorized_keys ``` **添加新密钥:** ```bash # 方法1: 直接追加 echo "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQC..." >> /root/.ssh/authorized_keys # 方法2: 使用ssh-copy-id (推荐) ssh-copy-id -i ~/.ssh/id_rsa.pub root@frunoob.cn ``` **删除密钥:** ```bash nano /root/.ssh/authorized_keys # 编辑删除指定行 ``` #### SSH 服务常用操作 **检查SSH服务状态:** ```bash systemctl status sshd ``` **重启SSH服务:** ```bash # 优雅重启 systemctl reload sshd # 强制重启 systemctl restart sshd ``` **查看SSH连接:** ```bash # 当前SSH连接 ss -tulpn | grep :22 # 查看登录日志 tail -f /var/log/auth.log | grep ssh ``` **防火墙设置:** ```bash # 检查端口开放 ufw status # 允许SSH端口 ufw allow 22/tcp ``` #### 安全建议 1. **使用强密码**: 如果启用密码登录,请确保使用强密码 2. **限制登录尝试**: 已设置MaxAuthTries=4 3. **定期更新密钥**: 定期更换SSH密钥 4. **禁用密码登录**: 在生产环境中,建议禁用密码登录,只使用密钥 5. **使用Fail2ban**: 防止SSH暴力破解 6. **更改默认端口**: 可以考虑更改SSH端口(22)为其他端口 #### 备份与恢复 **备份配置:** ```bash cp /etc/ssh/sshd_config /etc/ssh/sshd_config.backup.$(date +%Y%m%d) ``` **恢复配置:** ```bash # 恢复到备份 cp /etc/ssh/sshd_config.backup.20240602 /etc/ssh/sshd_config systemctl reload sshd ``` #### 故障排查 **常见错误:** 1. **Permission denied (publickey,password)** - 检查密钥权限: `chmod 600 ~/.ssh/id_rsa` - 检查authorized_keys权限: `chmod 600 /root/.ssh/authorized_keys` - 检查目录权限: `chmod 700 /root/.ssh/` 2. **Connection refused** - 检查SSH服务: `systemctl status sshd` - 检查防火墙: `ufw status` 3. **Too many authentication failures** - 检查MaxAuthTries设置 - 等待一段时间后重试 #### 配置验证 检查当前配置: ```bash # 查看运行时配置 sshd -T | grep -E '(passwordauthentication|pubkeyauthentication|permitrootlogin)' # 验证配置语法 sshd -t ``` ### 1.2 SSH 客户端使用 **使用密钥登录(推荐):** ```bash # 默认密钥位置 ssh root@frunoob.cn # 指定密钥文件 ssh -i ~/.ssh/private_key root@frunoob.cn ``` **使用密码登录:** ```bash ssh root@frunoob.cn # 输入root密码 ``` ### 1.3 SCP 远程文件传输 ```bash # 从远程拷贝单个文件 scp @: # 从远程拷贝整个目录 scp -r @: # 上传本地文件到远程 scp -P @:/remote/folder/fileName ``` --- ## 二、用户与权限管理 ### 2.1 用户基础命令 | 命令 | 作用 | | --- | --- | | `useradd username` | 创建用户 | | `passwd username` | 设置密码 | | `usermod -aG group user` | 将用户加入附加组 | | `userdel -r username` | 删除用户(含家目录) | | `groupadd groupname` | 创建组 | | `id username` | 查看用户UID/GID信息 | **关键文件:** | 文件 | 说明 | | --- | --- | | `/etc/passwd` | 用户信息(UID、家目录、shell) | | `/etc/shadow` | 密码哈希 | | `/etc/group` | 组信息 | | `/etc/sudoers` | sudo 权限配置(用 `visudo` 编辑) | ### 2.2 切换到 root 用户 ```bash sudo -i ``` > **注意:** 无论是否设置了密码,都要在添加用户之后再次设置一次密码,否则远程登陆时无法正常登录。例如:`sudo passwd test` ### 2.3 文件权限管理 ```bash # 修改文件权限 chmod 755 file # rwxr-xr-x chmod u+x script.sh # 给所有者添加执行权限 chmod u=rwx,g=r,o=r chmod u+r chmod -R 777 # 递归变更权限 # 修改属主/属组 chown user:group file chown -R user:group dir # 递归修改 # 特殊权限 chmod u+s binary # SUID(以文件所有者权限运行) chmod g+s dir # SGID(目录内新建文件继承组) chmod +t dir # Sticky Bit(仅所有者能删除自己的文件) ``` ### 2.4 清理无用用户 **先检查用户:** ```bash # 查看所有可登录用户 cat /etc/passwd | grep -E "/bin/bash|/bin/sh" # 示例输出: # root:x:0:0:root:/root:/bin/bash # steam:x:1003:1003::/home/steam:/bin/sh # 查看最近登录过的用户 lastlog | grep -v "Never" # 示例输出: # Username Port From Latest # root pts/0 120.xxx.130.xxx Sat May 30 23:02:32 +0800 2026 # 找出 UID >= 1000 的普通用户(系统用户 UID < 1000) awk -F: '$3 >= 1000 && $3 != 65534 {print $1, $3, $6}' /etc/passwd # 示例输出: # www 1000 /home/www # springboot 1001 /home/springboot # mysql 1002 /home/mysql # steam 1003 /home/steam # redis 1004 /home/redis # 检查哪些用户有 sudo 权限 grep -Po '^sudo.+:\K.*' /etc/group cat /etc/sudoers | grep -v "^#" | grep -v "^$" # 示例输出: # Defaults env_reset # Defaults mail_badpass # Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin" # Defaults use_pty # root ALL=(ALL:ALL) ALL # %admin ALL=(ALL) ALL # %sudo ALL=(ALL:ALL) ALL # @includedir /etc/sudoers.d ``` **安全删除用户流程(以删除 `steam`、`springboot` 为例):** ```bash # 1. 先锁定用户(观察几天确认无影响) usermod -L username # 2. 确认用户没有运行中的进程 ps -u username # 3. 删除用户及家目录(谨慎!) userdel -r username # 4. 或仅删除用户,保留家目录(后续手动清理) userdel username rm -rf /home/username ``` --- ## 三、进程管理与监控 ### 3.1 进程查看 **ps —— 查看进程快照:** ```bash ps aux ``` **top —— 实时进程监控:** top 用于持续刷新进程信息。 | 字段 | 含义 | | --- | --- | | PID | 进程 ID | | %CPU | CPU 使用率 | | %MEM | 内存使用率 | | VSZ | 虚拟内存大小 | | RSS | 物理内存大小 | | TTY | 终端 | | STAT | 进程状态 | | START | 启动时间 | | TIME | 累计 CPU 运行时间 | | COMMAND | 命令 | ### 3.2 定时任务(crontab) crontab 是用于安装、卸载或列出驱动 cron 守护进程的表的程序。每个用户都可以拥有自己的 crontab,这些文件位于 `/var/spool/cron/crontabs`,但不应直接编辑。 ```bash crontab -e # 打开配置文件进行编辑 ``` ### 3.3 终止进程 ```bash # 按进程名终止 kill -9 $(ps aux | grep 'top' | awk '{print $2}' | head -n 1) ``` **忽略挂断信号 —— nohup:** 当 SSH 连接断开时,所有子进程都会中断。使用 `nohup` 可以让命令忽略挂断信号继续运行: ```bash nohup COMMAND & ``` ### 3.4 网络连接与端口查看(ss) > **注意:** `netstat` 已是过时命令,以下为替换命令: | 旧命令 | 新命令 | | --- | --- | | `netstat` | `ss` | | `netstat -r` | `ip route` | | `netstat -i` | `ip -s link` | | `netstat -g` | `ip maddr` | > 为什么要换?因为新的命令能提供更详细的信息。 **根据监听端口号查找进程:** ```bash # 使用 netstat(旧方式) netstat -lpWn | grep 4200 # Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name # tcp 0 0 0.0.0.0:4200 0.0.0.0:* LISTEN 3098302/ng serve -- # 使用 ss(推荐方式) ss -lntp | grep 4200 # State Recv-Q Send-Q Local Address:Port Peer Address:Port Process # LISTEN 0 511 0.0.0.0:4200 0.0.0.0:* users:(("ng serve --conf",pid=3098302,fd=208)) ``` ### 3.5 服务监控(watch) ```bash # 查看服务运行情况,并可以开启或关闭指定服务 sudo update-rc.d ServiceName remove # 每 2 秒刷新一次传感器信息 watch -n 2 sensors ``` 示例输出: ``` Every 2.0s: sensors penetration-fqq: Mon Jun 6 15:56:22 2022 coretemp-isa-0000 // CPU 两个物理核心 Adapter: ISA adapter Package id 0: +37.0°C (high = +100.0°C, crit = +100.0°C) Core 0: +38.0°C (high = +100.0°C, crit = +100.0°C) Core 1: +35.0°C (high = +100.0°C, crit = +100.0°C) amdgpu-pci-0100 // GPU Adapter: PCI adapter vddgfx: 806.00 mV edge: +39.0°C (crit = +104000.0°C, hyst = -273.1°C) slowPPT: 572.15 W (cap = 15.00 W) pch_skylake-virtual-0 Adapter: Virtual device temp1: +39.5°C BAT0-acpi-0 Adapter: ACPI interface in0: 8.44 V ``` --- ## 四、内存监控与管理 ### 4.1 查看内存使用(free) | 字段 | 含义 | | --- | --- | | total | 总物理内存 | | used | 已使用(含缓存) | | free | 完全空闲 | | shared | 共享内存 | | buff/cache | 缓存/缓冲区(可回收) | | available | 真正可用(free + 可回收 cache) | ```bash # 最常用:人类可读格式 free -h # total used free shared buff/cache available # Mem: 1.8Gi 920Mi 156Mi 10Mi 800Mi 763Mi # Swap: 1.0Gi 172Mi 851Mi # 详细内存分布 cat /proc/meminfo # MemTotal: 1922096 kB # MemFree: 160364 kB # MemAvailable: 781632 kB # Buffers: 101500 kB # Cached: 599036 kB # SwapCached: 19476 kB # Active: 549892 kB # Inactive: 959720 kB # Active(anon): 176756 kB # Inactive(anon): 643364 kB # Active(file): 373136 kB # Inactive(file): 316356 kB # Unevictable: 1536 kB # Mlocked: 0 kB # SwapTotal: 1048572 kB # SwapFree: 872404 kB # 按进程排序(RES 为实际物理内存) ps aux --sort=-%mem | head -20 ``` 示例输出(内存占用排行): ``` USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 51346 1.4 26.1 2377392 503040 ? Ssl May30 8:26 /projects/java/task_center/jdk-21.0.11+10/bin/java ... root 57207 0.2 7.9 18455000 153604 ? Ssl May30 0:03 node /root/.local/share/fnm/node-versions/v24.16.0/installation/lib/node_modules/@musistudio/claude-code-router/dist/cli.js start root 37831 0.0 4.7 500072 90960 ? Sl May29 0:41 /usr/bin/python3 /usr/local/bin/mitmdump ... root 370 0.0 3.1 167560 61148 ? S ~~没想到 PHP 竟然是比 Python、Node、Java 内存占用都低的存在!~~ 我才发现php开了多个进程。 ```bash ps aux --sort=-%mem |grep php www-data 156919 0.0 1.9 304276 37752 ? S Jun03 0:02 php-fpm: pool blog www-data 156918 0.0 1.7 302072 34444 ? S Jun03 0:02 php-fpm: pool blog www-data 157015 0.0 1.7 227228 33180 ? S Jun03 0:01 php-fpm: pool blog root 156916 0.0 1.3 223500 26904 ? Ss Jun03 0:00 php-fpm: master process (/projects/runtime/php/8.1/php-fpm.conf) www-data 156920 0.0 0.5 224004 10564 ? S Jun03 0:00 php-fpm: pool www www-data 156921 0.0 0.5 224004 10564 ? S Jun03 0:00 php-fpm: pool www ``` ### 4.2 内存分析工具 ```bash # 实时进程内存 top htop # 更详细的内存分析 smem -r -k # 按实际使用排序,人类可读 pmap -x PID # 查看单个进程的内存映射 # 查看内存占用最高的进程 ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%mem | head # PID PPID CMD %MEM %CPU # 51346 1 /projects/java/task_center/ 26.1 1.4 # 57207 1 node /root/.local/share/fnm 7.9 0.1 # 37831 37827 /usr/bin/python3 /usr/local 4.7 0.0 # 370 1 /lib/systemd/systemd-journa 3.2 0.0 # 679 1 /usr/sbin/mariadbd --defaul 2.1 0.0 # 55899 682 php-fpm: pool blog 1.5 0.0 # 33398 682 php-fpm: pool blog 1.3 0.0 # 8664 682 php-fpm: pool blog 1.2 0.0 # 656 1 /usr/bin/python3 -m anki.sy 0.7 0.0 ``` --- ## 五、文件与磁盘管理 ### 5.1 文件查看 **cat —— 查看与拼接文件:** ```bash cat -n # 显示行号 cat -b # 显示行号(跳过空白行) cat -b >> # 将前两个文件内容追加到第三个 cat /dev/null > # 清空文件 cat /dev/fd0 > # 制作镜像文件 cat > /dev/fd0 # 将文件写入到软盘 ``` ### 5.2 文件查找(find) ```bash find ./ -name 'log.txt' # 按名称查找 find ./ -perm -u=x -type f # 查找类型为普通文件且可执行的文件 ``` ### 5.3 压缩与解压 **7za —— 7z 格式压缩:** 压缩指定文件夹及其子文件(默认递归压缩全部子文件和目录,不需要 `-r` 参数): ```bash 7za a -t7z 目标文件名称.7z /path/to/directory ``` 解压: ```bash 7za x 压缩文件.7z ``` **tar —— 归档打包:** ```bash # 常用示例 tar -cf archive.tar foo bar # 从 foo 和 bar 创建归档 tar -tvf archive.tar # 详细列出归档内容 tar -xf archive.tar # 解包全部文件 tar -rvf archive.tar newfile # 向归档末尾追加文件 # 主要操作模式 # -A, --catenate, --concatenate 追加 tar 文件到归档 # -c, --create 创建新归档 # --delete 从归档中删除(不适用于磁带!) # -d, --diff, --compare 比较归档与文件系统的差异 # -r, --append 追加文件到归档末尾 # --test-label 测试卷标并退出 # -t, --list 列出归档内容 # -u, --update 仅追加比归档中更新的文件 # -x, --extract, --get 从归档中提取文件 ``` **gzip —— 单文件压缩:** ```bash gzip -d archive.gz # 解压 .gz 文件 ``` ```text Usage: gzip [OPTION]... [FILE]... Compress or uncompress FILEs (by default, compress FILES in-place). -c, --stdout 写到标准输出,保留原始文件不变 -d, --decompress 解压 -f, --force 强制覆盖输出文件并压缩链接 -h, --help 显示帮助 -k, --keep 保留(不删除)输入文件 -l, --list 列出压缩文件内容 -L, --license 显示软件许可证 -n, --no-name 不保存或恢复原始文件名和时间戳 -N, --name 保存或恢复原始文件名和时间戳 -q, --quiet 抑制所有警告 -r, --recursive 递归操作目录 --rsyncable 生成 rsync 友好的归档 -S, --suffix=SUF 在压缩文件上使用指定后缀 --synchronous 同步输出(系统崩溃时更安全,但更慢) -t, --test 测试压缩文件完整性 -v, --verbose 详细模式 -V, --version 显示版本号 -1, --fast 更快压缩 -9, --best 更优压缩比 ``` ### 5.4 磁盘管理 ```bash du -sh * # 以合适的单位显示当前文件夹下所有文件大小(不递归子目录) df -h # 以合适的单位显示磁盘容量使用情况 ``` --- ## 六、文本编辑与内容处理 ### 6.1 文本统计与过滤 ```bash # 字数/行数统计 wc -w # 显示字数 wc -l # 显示行数 # 文本搜索 grep 'log' # 查找包含 'log' 的行 grep -v 'name' # 排除包含 'name' 的行(反向匹配) # 排序 sort -n [file] # 按数值大小排序 sort -r [file] # 逆排序 ``` ### 6.2 Vim 编辑器操作 #### 光标移动 | 命令 | 操作 | | --- | --- | | `2w` | 光标向前移动两个单词至单词开头 | | `3e` | 光标向前移动三个单词至单词末尾 | | `0` | 移动光标到行首 | | `G` | 移动光标到文件的最后一行 | | `g` | 移动光标到文本的第一行 | | `505G` | 移动到第 505 行 | | `CTRL-O` | 撤销行跳转操作 | | `CTRL-I` | 重做行跳转操作 | | `%` | 匹配光标所在括号对应的括号 | | `CTRL-G` | 显示文档状态 | #### 删除操作 | 命令 | 操作 | | --- | --- | | `dw` | 删除当前单词直到下一个单词开头(不包含首字母) | | `de` | 删除单词直到该单词末尾(包含最后一个字母) | | `d$` | 删除从光标到行尾 | | `d2w` | 删除两个单词 | | `dd` | 删除一整行,并保存到 vim 寄存器 | | `3dd` | 删除三行 | | `ce` | 删除单词至词尾并进入插入模式 | | `cc` | 清空本行并进入插入模式 | #### 查找与替换 | 命令 | 操作 | | --- | --- | | `?hello` | 向上查找当前光标之前的 "hello" | | `/hello` | 向下查找当前光标之后的 "hello" | | `/hello\c` | 本次查找忽略大小写 | | `n` | 移动到下一个查找结果 | | `N` | 移动到上一个查找结果 | | `:s/thee/the/g` | 替换当前行中所有的 "thee" 为 "the" | | `:1,5s/old/new/g` | 替换第 1 到 5 行的 "old" 为 "new" | | `:%s/old/new/g` | 全文替换 | | `:%s/old/new/gc` | 全文替换(每次替换前提示确认) | #### 撤销与重做 | 命令 | 操作 | | --- | --- | | `u` | 撤销动作 | | `U` | 撤销当前行的所有动作 | | `CTRL-R` | 重做 | #### 字符替换 | 命令 | 操作 | | --- | --- | | `rx` | 替换当前光标下的字符为 x | | `R` | 进入替换模式(连续替换) | #### 插入与编辑 | 命令 | 操作 | | --- | --- | | `o` | 在下方插入一行 | | `O` | 在上方插入一行 | | `a` | 在当前光标指向字符的后面插入 | | `y` | 复制 | | `p` | 粘贴(将寄存器内容插入到当前行的下一行) | | `j$` `j0` | 控制每次移动到下一行时光标在行首还是行尾 | #### 外部命令与保存 | 命令 | 操作 | | --- | --- | | `:!ls` | 执行外部命令 | | `:w filename` | 保存当前文件为指定名称 | | `CTRL-D` | 显示所有匹配的命令 | | `` | 自动补全 | #### 显示设置 | 命令 | 操作 | | --- | --- | | `:set hls` | 搜索结果高亮显示 | | `:set ic` | 忽略大小写 | | `:set noic` | 不忽略大小写 | | `:set number` | 显示行号 | ### 6.3 Vim 缓存恢复 ```bash vim -r # 显示 /tmp, /var/tmp/, ~/tmp/, './' 中的临时文件 ``` 例如 `vim -r flag` 会显示当前目录下 flag 文件的缓存文件。当对 flag 文件进行编辑时意外强制关闭 vim,可以通过此方法恢复文件:打开 `.flag.swq` 文件并执行 `:wq` 即可将缓存中的修改应用到原文件中,然后删除该缓存文件。 > **注意:** 若编辑缓存文件时再次意外退出 vim,会生成新的缓存文件 `.flag.swo`,以此类推可能生成 `.flag.swn`、`.flag.swm`、`.flag.swl` 等。必须将所有缓存文件全部删除后才能正常打开原始文件。 --- ## 七、Bash 脚本基础 > Bash 这个名字是 **Bourne-Again SHell** 的首字母缩写,是对 Stephen Bourne 这个名字的双关语——Stephen Bourne 是 Bash 前身之一的创造者。 ### 7.1 变量与运算 **赋值时等号两边不能有空格:** 错误示例: ```bash users = "a b c" ``` 正确写法: ```bash user="a b c" ``` **变量运算:** ```bash x=100 x=x/10 # 在输出时直接运算 echo $((x/10)) ``` ### 7.2 函数定义 如果可能的话,函数应该包含描述、全局变量、参数、输出和返回值的注释。 ```bash ####################################### # Description: Hello function # Globals: # None # Arguments: # Single input argument # Outputs: # Value of input argument # Returns: # 0 if successful, non-zero on error. ####################################### function hello(){ echo "Hello $1!" } ``` ### 7.3 条件表达式(if) - `[]` 代表单个表达式,例如:`if [ $name = "李明" ]` - `[[]]` 代表支持复合表达式,例如: ```bash if [[ 8 -eq 11 && "hello" == "hello" || 1 -eq 3 || 1 -eq 1 ]] ``` 或: ```bash if [[ ${name} = *"Li Ming"* ]] ``` ### 7.4 日期格式化 ```bash Usage: date +FORMAT ``` 常用 FORMAT(假设此时为 `Tue Jan 19 11:14:07 AM CST 2038`): | 格式符 | 说明 | | --- | --- | | `%d` | 本月第几号 | | `%H` | 获取当前小时 | | `%m` | 获取当前月份 | | `%Y` | 获取当前年份 | | `%s` | 自 1970-01-01 00:00:00 UTC 至今的秒数 | | `%N` | 获取当前纳秒 | 示例: ```bash $ echo $(date +%Y-%m-%d%t%H:%M:%S) 2022-08-31 17:48:45 ``` ### 7.5 管道输入变参数(xargs) 例如,删除当前文件夹下的所有文件: ```bash ls | xargs rm ``` ### 7.6 调试技巧 - 调试 Bash 脚本时可在执行脚本时使用参数 `-x` - `jq` —— JSON 处理器 --- ## 八、Git 常用操作 ```bash # 查看提交日志 git log git log --all # 比较版本差异 git diff HEAD HEAD^ # 重置到指定状态 git reset --hard HEAD^ # 分支操作 git branch -m [old_branch] # 修改分支名称 git branch -a # 显示全部分支 git branch --show-current # 显示当前分支名称 # 配置 git config --global --edit # 编辑用户名和邮箱配置 ``` **git log 示例输出:** ``` ┌──(frunoob㉿kali)-[/var/www/html/git_test] └─$ git log commit de14fcc22521e0c64bfdb4dccbda9e281efe2acc (HEAD -> master) Author: root Date: Sat May 7 15:02:56 2022 +0800 edit flagj commit 1dbfdfb1d913a4c517f550fc65b9d24ee907c0ea Author: root Date: Sat May 7 14:17:31 2022 +0800 flag ``` **git diff 示例:** ``` ┌──(frunoob㉿kali)-[/var/www/html/git_test] └─$ git diff HEAD HEAD^ diff --git a/flag b/flag index 3d18cbe..4b30686 100644 --- a/flag +++ b/flag @@ -1,3 +1 @@ flag{} -nihao -laskfjaslfj ``` **git reset 示例:** ``` ┌──(frunoob㉿kali)-[/var/www/html/git_test] └─$ sudo git reset --hard HEAD^ HEAD is now at 1dbfdfb flag └─$ git log commit 1dbfdfb1d913a4c517f550fc65b9d24ee907c0ea (HEAD -> master) Author: root Date: Sat May 7 14:17:31 2022 +0800 flag ``` --- # Windows 命令 ### 9.1 测试代理连通性 ```bash powershell -Command "Invoke-WebRequest -Uri http://httpbin.org/ip -Proxy http://ip:port -UseBasicParsing | Select-Object -ExpandProperty Content" ``` Loading... # Linux 命令 --- ## 一、SSH 远程连接与配置 ### 1.1 SSH 服务端配置(以 frunoob.cn 为例) > **服务器**: frunoob.cn > **系统**: Ubuntu 22.04.5 LTS > **SSH版本**: OpenSSH > **配置日期**: 2026-06-02 #### 配置摘要 当前服务器已配置为**同时支持密钥和密码登录**,并进行了安全加固。 **认证方式:** - ✅ **密钥认证** (首选): `PubkeyAuthentication yes` - ✅ **密码认证** (备用): `PasswordAuthentication yes` - ✅ **Root登录**: `PermitRootLogin yes` **安全加固:** - 最大认证尝试: 4次 (`MaxAuthTries 4`) - 会话超时: 60秒 (`LoginGraceTime 60`) - 严格模式检查 (`StrictModes yes`) - 禁用空密码 (`PermitEmptyPasswords no`) #### `/etc/ssh/sshd_config` 关键设置 ```ini # --- 认证核心设置 --- PermitRootLogin yes # 允许root登录 PubkeyAuthentication yes # 启用密钥认证 PasswordAuthentication yes # 启用密码认证 StrictModes yes # 严格模式检查 MaxAuthTries 4 # 最大认证尝试次数 MaxSessions 5 # 最大并发会话数 LoginGraceTime 60 # 登录超时(秒) # --- 网络设置 --- Port 22 # SSH端口 AddressFamily inet # IPv4 ListenAddress 0.0.0.0 # 监听所有地址 # --- 保活设置 --- ClientAliveInterval 60 # 每60秒发送保活包 ClientAliveCountMax 3 # 最大保活失败次数 # --- PAM认证 --- UsePAM yes # 使用PAM模块 ``` #### 密钥管理 **查看已授权的密钥:** ```bash cat /root/.ssh/authorized_keys ``` **添加新密钥:** ```bash # 方法1: 直接追加 echo "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQC..." >> /root/.ssh/authorized_keys # 方法2: 使用ssh-copy-id (推荐) ssh-copy-id -i ~/.ssh/id_rsa.pub root@frunoob.cn ``` **删除密钥:** ```bash nano /root/.ssh/authorized_keys # 编辑删除指定行 ``` #### SSH 服务常用操作 **检查SSH服务状态:** ```bash systemctl status sshd ``` **重启SSH服务:** ```bash # 优雅重启 systemctl reload sshd # 强制重启 systemctl restart sshd ``` **查看SSH连接:** ```bash # 当前SSH连接 ss -tulpn | grep :22 # 查看登录日志 tail -f /var/log/auth.log | grep ssh ``` **防火墙设置:** ```bash # 检查端口开放 ufw status # 允许SSH端口 ufw allow 22/tcp ``` #### 安全建议 1. **使用强密码**: 如果启用密码登录,请确保使用强密码 2. **限制登录尝试**: 已设置MaxAuthTries=4 3. **定期更新密钥**: 定期更换SSH密钥 4. **禁用密码登录**: 在生产环境中,建议禁用密码登录,只使用密钥 5. **使用Fail2ban**: 防止SSH暴力破解 6. **更改默认端口**: 可以考虑更改SSH端口(22)为其他端口 #### 备份与恢复 **备份配置:** ```bash cp /etc/ssh/sshd_config /etc/ssh/sshd_config.backup.$(date +%Y%m%d) ``` **恢复配置:** ```bash # 恢复到备份 cp /etc/ssh/sshd_config.backup.20240602 /etc/ssh/sshd_config systemctl reload sshd ``` #### 故障排查 **常见错误:** 1. **Permission denied (publickey,password)** - 检查密钥权限: `chmod 600 ~/.ssh/id_rsa` - 检查authorized_keys权限: `chmod 600 /root/.ssh/authorized_keys` - 检查目录权限: `chmod 700 /root/.ssh/` 2. **Connection refused** - 检查SSH服务: `systemctl status sshd` - 检查防火墙: `ufw status` 3. **Too many authentication failures** - 检查MaxAuthTries设置 - 等待一段时间后重试 #### 配置验证 检查当前配置: ```bash # 查看运行时配置 sshd -T | grep -E '(passwordauthentication|pubkeyauthentication|permitrootlogin)' # 验证配置语法 sshd -t ``` ### 1.2 SSH 客户端使用 **使用密钥登录(推荐):** ```bash # 默认密钥位置 ssh root@frunoob.cn # 指定密钥文件 ssh -i ~/.ssh/private_key root@frunoob.cn ``` **使用密码登录:** ```bash ssh root@frunoob.cn # 输入root密码 ``` ### 1.3 SCP 远程文件传输 ```bash # 从远程拷贝单个文件 scp <user-name>@<remote-ip>:<source-file-name> <target-file-path-name> # 从远程拷贝整个目录 scp -r <user-name>@<remote-ip>:<source-directory-name> <target-directory-name> # 上传本地文件到远程 scp -P <port> <local/file/path> <user name>@<ip>:/remote/folder/fileName ``` --- ## 二、用户与权限管理 ### 2.1 用户基础命令 | 命令 | 作用 | | --- | --- | | `useradd username` | 创建用户 | | `passwd username` | 设置密码 | | `usermod -aG group user` | 将用户加入附加组 | | `userdel -r username` | 删除用户(含家目录) | | `groupadd groupname` | 创建组 | | `id username` | 查看用户UID/GID信息 | **关键文件:** | 文件 | 说明 | | --- | --- | | `/etc/passwd` | 用户信息(UID、家目录、shell) | | `/etc/shadow` | 密码哈希 | | `/etc/group` | 组信息 | | `/etc/sudoers` | sudo 权限配置(用 `visudo` 编辑) | ### 2.2 切换到 root 用户 ```bash sudo -i ``` > **注意:** 无论是否设置了密码,都要在添加用户之后再次设置一次密码,否则远程登陆时无法正常登录。例如:`sudo passwd test` ### 2.3 文件权限管理 ```bash # 修改文件权限 chmod 755 file # rwxr-xr-x chmod u+x script.sh # 给所有者添加执行权限 chmod u=rwx,g=r,o=r <file> chmod u+r <file> chmod -R 777 <file> # 递归变更权限 # 修改属主/属组 chown user:group file chown -R user:group dir # 递归修改 # 特殊权限 chmod u+s binary # SUID(以文件所有者权限运行) chmod g+s dir # SGID(目录内新建文件继承组) chmod +t dir # Sticky Bit(仅所有者能删除自己的文件) ``` ### 2.4 清理无用用户 **先检查用户:** ```bash # 查看所有可登录用户 cat /etc/passwd | grep -E "/bin/bash|/bin/sh" # 示例输出: # root:x:0:0:root:/root:/bin/bash # steam:x:1003:1003::/home/steam:/bin/sh # 查看最近登录过的用户 lastlog | grep -v "Never" # 示例输出: # Username Port From Latest # root pts/0 120.xxx.130.xxx Sat May 30 23:02:32 +0800 2026 # 找出 UID >= 1000 的普通用户(系统用户 UID < 1000) awk -F: '$3 >= 1000 && $3 != 65534 {print $1, $3, $6}' /etc/passwd # 示例输出: # www 1000 /home/www # springboot 1001 /home/springboot # mysql 1002 /home/mysql # steam 1003 /home/steam # redis 1004 /home/redis # 检查哪些用户有 sudo 权限 grep -Po '^sudo.+:\K.*' /etc/group cat /etc/sudoers | grep -v "^#" | grep -v "^$" # 示例输出: # Defaults env_reset # Defaults mail_badpass # Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin" # Defaults use_pty # root ALL=(ALL:ALL) ALL # %admin ALL=(ALL) ALL # %sudo ALL=(ALL:ALL) ALL # @includedir /etc/sudoers.d ``` **安全删除用户流程(以删除 `steam`、`springboot` 为例):** ```bash # 1. 先锁定用户(观察几天确认无影响) usermod -L username # 2. 确认用户没有运行中的进程 ps -u username # 3. 删除用户及家目录(谨慎!) userdel -r username # 4. 或仅删除用户,保留家目录(后续手动清理) userdel username rm -rf /home/username ``` --- ## 三、进程管理与监控 ### 3.1 进程查看 **ps —— 查看进程快照:** ```bash ps aux ``` **top —— 实时进程监控:** top 用于持续刷新进程信息。 | 字段 | 含义 | | --- | --- | | PID | 进程 ID | | %CPU | CPU 使用率 | | %MEM | 内存使用率 | | VSZ | 虚拟内存大小 | | RSS | 物理内存大小 | | TTY | 终端 | | STAT | 进程状态 | | START | 启动时间 | | TIME | 累计 CPU 运行时间 | | COMMAND | 命令 | ### 3.2 定时任务(crontab) crontab 是用于安装、卸载或列出驱动 cron 守护进程的表的程序。每个用户都可以拥有自己的 crontab,这些文件位于 `/var/spool/cron/crontabs`,但不应直接编辑。 ```bash crontab -e # 打开配置文件进行编辑 ``` ### 3.3 终止进程 ```bash # 按进程名终止 kill -9 $(ps aux | grep 'top' | awk '{print $2}' | head -n 1) ``` **忽略挂断信号 —— nohup:** 当 SSH 连接断开时,所有子进程都会中断。使用 `nohup` 可以让命令忽略挂断信号继续运行: ```bash nohup COMMAND & ``` ### 3.4 网络连接与端口查看(ss) > **注意:** `netstat` 已是过时命令,以下为替换命令: | 旧命令 | 新命令 | | --- | --- | | `netstat` | `ss` | | `netstat -r` | `ip route` | | `netstat -i` | `ip -s link` | | `netstat -g` | `ip maddr` | > 为什么要换?因为新的命令能提供更详细的信息。 **根据监听端口号查找进程:** ```bash # 使用 netstat(旧方式) netstat -lpWn | grep 4200 # Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name # tcp 0 0 0.0.0.0:4200 0.0.0.0:* LISTEN 3098302/ng serve -- # 使用 ss(推荐方式) ss -lntp | grep 4200 # State Recv-Q Send-Q Local Address:Port Peer Address:Port Process # LISTEN 0 511 0.0.0.0:4200 0.0.0.0:* users:(("ng serve --conf",pid=3098302,fd=208)) ``` ### 3.5 服务监控(watch) ```bash # 查看服务运行情况,并可以开启或关闭指定服务 sudo update-rc.d ServiceName remove # 每 2 秒刷新一次传感器信息 watch -n 2 sensors ``` 示例输出: ``` Every 2.0s: sensors penetration-fqq: Mon Jun 6 15:56:22 2022 coretemp-isa-0000 // CPU 两个物理核心 Adapter: ISA adapter Package id 0: +37.0°C (high = +100.0°C, crit = +100.0°C) Core 0: +38.0°C (high = +100.0°C, crit = +100.0°C) Core 1: +35.0°C (high = +100.0°C, crit = +100.0°C) amdgpu-pci-0100 // GPU Adapter: PCI adapter vddgfx: 806.00 mV edge: +39.0°C (crit = +104000.0°C, hyst = -273.1°C) slowPPT: 572.15 W (cap = 15.00 W) pch_skylake-virtual-0 Adapter: Virtual device temp1: +39.5°C BAT0-acpi-0 Adapter: ACPI interface in0: 8.44 V ``` --- ## 四、内存监控与管理 ### 4.1 查看内存使用(free) | 字段 | 含义 | | --- | --- | | total | 总物理内存 | | used | 已使用(含缓存) | | free | 完全空闲 | | shared | 共享内存 | | buff/cache | 缓存/缓冲区(可回收) | | available | 真正可用(free + 可回收 cache) | ```bash # 最常用:人类可读格式 free -h # total used free shared buff/cache available # Mem: 1.8Gi 920Mi 156Mi 10Mi 800Mi 763Mi # Swap: 1.0Gi 172Mi 851Mi # 详细内存分布 cat /proc/meminfo # MemTotal: 1922096 kB # MemFree: 160364 kB # MemAvailable: 781632 kB # Buffers: 101500 kB # Cached: 599036 kB # SwapCached: 19476 kB # Active: 549892 kB # Inactive: 959720 kB # Active(anon): 176756 kB # Inactive(anon): 643364 kB # Active(file): 373136 kB # Inactive(file): 316356 kB # Unevictable: 1536 kB # Mlocked: 0 kB # SwapTotal: 1048572 kB # SwapFree: 872404 kB # 按进程排序(RES 为实际物理内存) ps aux --sort=-%mem | head -20 ``` 示例输出(内存占用排行): ``` USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 51346 1.4 26.1 2377392 503040 ? Ssl May30 8:26 /projects/java/task_center/jdk-21.0.11+10/bin/java ... root 57207 0.2 7.9 18455000 153604 ? Ssl May30 0:03 node /root/.local/share/fnm/node-versions/v24.16.0/installation/lib/node_modules/@musistudio/claude-code-router/dist/cli.js start root 37831 0.0 4.7 500072 90960 ? Sl May29 0:41 /usr/bin/python3 /usr/local/bin/mitmdump ... root 370 0.0 3.1 167560 61148 ? S<s May28 1:08 /lib/systemd/systemd-journald mysql 679 0.0 2.1 1548696 41448 ? Ssl May28 1:16 /usr/sbin/mariadbd ... www-data 55899 0.0 1.5 300080 29808 ? S May30 0:03 php-fpm: pool blog www-data 33398 0.0 1.3 300188 25056 ? S May29 0:30 php-fpm: pool blog www-data 8664 0.0 1.2 300296 24340 ? S May28 0:41 php-fpm: pool blog root 656 0.0 0.7 197136 15344 ? Ssl May28 0:01 /usr/bin/python3 -m anki.syncserver root 55753 0.0 0.6 18608 12528 ? Ss May30 0:00 sshd: root@notty root 55689 0.0 0.6 18708 12412 ? Ss May30 0:03 sshd: root@notty root 37827 0.0 0.6 103052 11600 ? Ssl May29 0:19 /usr/bin/python3 start_proxy.py root 1108 0.9 0.6 140136 11552 ? Ssl May28 39:09 /usr/local/aegis/aegis_client/aegis_12_93/AliYunDunMonitor root 665 0.2 0.5 1247780 11440 ? Ssl May28 8:21 /projects/frps/frps -c /projects/frps/frps.toml root 55959 0.0 0.5 17488 11404 ? Ss May30 0:00 sshd: root@notty www-data 56672 0.0 0.5 107704 11276 ? S May30 0:00 nginx: worker process root 56563 0.0 0.5 17196 11224 ? Ss May30 0:00 sshd: root@pts/0 root 655 0.0 0.5 689692 9848 ? Ssl May28 3:57 /usr/local/share/aliyun-assist/aliyun-service.symlink root 52006 0.0 0.5 106696 9640 ? Ss May30 0:00 nginx: master process /usr/sbin/nginx -c /projects/runtime/nginx/conf/nginx.conf ``` > ~~没想到 PHP 竟然是比 Python、Node、Java 内存占用都低的存在!~~ 我才发现php开了多个进程。 ```bash ps aux --sort=-%mem |grep php www-data 156919 0.0 1.9 304276 37752 ? S Jun03 0:02 php-fpm: pool blog www-data 156918 0.0 1.7 302072 34444 ? S Jun03 0:02 php-fpm: pool blog www-data 157015 0.0 1.7 227228 33180 ? S Jun03 0:01 php-fpm: pool blog root 156916 0.0 1.3 223500 26904 ? Ss Jun03 0:00 php-fpm: master process (/projects/runtime/php/8.1/php-fpm.conf) www-data 156920 0.0 0.5 224004 10564 ? S Jun03 0:00 php-fpm: pool www www-data 156921 0.0 0.5 224004 10564 ? S Jun03 0:00 php-fpm: pool www ``` ### 4.2 内存分析工具 ```bash # 实时进程内存 top htop # 更详细的内存分析 smem -r -k # 按实际使用排序,人类可读 pmap -x PID # 查看单个进程的内存映射 # 查看内存占用最高的进程 ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%mem | head # PID PPID CMD %MEM %CPU # 51346 1 /projects/java/task_center/ 26.1 1.4 # 57207 1 node /root/.local/share/fnm 7.9 0.1 # 37831 37827 /usr/bin/python3 /usr/local 4.7 0.0 # 370 1 /lib/systemd/systemd-journa 3.2 0.0 # 679 1 /usr/sbin/mariadbd --defaul 2.1 0.0 # 55899 682 php-fpm: pool blog 1.5 0.0 # 33398 682 php-fpm: pool blog 1.3 0.0 # 8664 682 php-fpm: pool blog 1.2 0.0 # 656 1 /usr/bin/python3 -m anki.sy 0.7 0.0 ``` --- ## 五、文件与磁盘管理 ### 5.1 文件查看 **cat —— 查看与拼接文件:** ```bash cat -n <file> # 显示行号 cat -b <file> # 显示行号(跳过空白行) cat -b <file1> <file2> >> <file3> # 将前两个文件内容追加到第三个 cat /dev/null > <file> # 清空文件 cat /dev/fd0 > <file> # 制作镜像文件 cat <IMG_file> > /dev/fd0 # 将文件写入到软盘 ``` ### 5.2 文件查找(find) ```bash find ./ -name 'log.txt' # 按名称查找 find ./ -perm -u=x -type f # 查找类型为普通文件且可执行的文件 ``` ### 5.3 压缩与解压 **7za —— 7z 格式压缩:** 压缩指定文件夹及其子文件(默认递归压缩全部子文件和目录,不需要 `-r` 参数): ```bash 7za a -t7z 目标文件名称.7z /path/to/directory ``` 解压: ```bash 7za x 压缩文件.7z ``` **tar —— 归档打包:** ```bash # 常用示例 tar -cf archive.tar foo bar # 从 foo 和 bar 创建归档 tar -tvf archive.tar # 详细列出归档内容 tar -xf archive.tar # 解包全部文件 tar -rvf archive.tar newfile # 向归档末尾追加文件 # 主要操作模式 # -A, --catenate, --concatenate 追加 tar 文件到归档 # -c, --create 创建新归档 # --delete 从归档中删除(不适用于磁带!) # -d, --diff, --compare 比较归档与文件系统的差异 # -r, --append 追加文件到归档末尾 # --test-label 测试卷标并退出 # -t, --list 列出归档内容 # -u, --update 仅追加比归档中更新的文件 # -x, --extract, --get 从归档中提取文件 ``` **gzip —— 单文件压缩:** ```bash gzip -d archive.gz # 解压 .gz 文件 ``` ```text Usage: gzip [OPTION]... [FILE]... Compress or uncompress FILEs (by default, compress FILES in-place). -c, --stdout 写到标准输出,保留原始文件不变 -d, --decompress 解压 -f, --force 强制覆盖输出文件并压缩链接 -h, --help 显示帮助 -k, --keep 保留(不删除)输入文件 -l, --list 列出压缩文件内容 -L, --license 显示软件许可证 -n, --no-name 不保存或恢复原始文件名和时间戳 -N, --name 保存或恢复原始文件名和时间戳 -q, --quiet 抑制所有警告 -r, --recursive 递归操作目录 --rsyncable 生成 rsync 友好的归档 -S, --suffix=SUF 在压缩文件上使用指定后缀 --synchronous 同步输出(系统崩溃时更安全,但更慢) -t, --test 测试压缩文件完整性 -v, --verbose 详细模式 -V, --version 显示版本号 -1, --fast 更快压缩 -9, --best 更优压缩比 ``` ### 5.4 磁盘管理 ```bash du -sh * # 以合适的单位显示当前文件夹下所有文件大小(不递归子目录) df -h # 以合适的单位显示磁盘容量使用情况 ``` --- ## 六、文本编辑与内容处理 ### 6.1 文本统计与过滤 ```bash # 字数/行数统计 wc -w # 显示字数 wc -l # 显示行数 # 文本搜索 grep 'log' # 查找包含 'log' 的行 grep -v 'name' # 排除包含 'name' 的行(反向匹配) # 排序 sort -n [file] # 按数值大小排序 sort -r [file] # 逆排序 ``` ### 6.2 Vim 编辑器操作 #### 光标移动 | 命令 | 操作 | | --- | --- | | `2w` | 光标向前移动两个单词至单词开头 | | `3e` | 光标向前移动三个单词至单词末尾 | | `0` | 移动光标到行首 | | `G` | 移动光标到文件的最后一行 | | `g` | 移动光标到文本的第一行 | | `505G` | 移动到第 505 行 | | `CTRL-O` | 撤销行跳转操作 | | `CTRL-I` | 重做行跳转操作 | | `%` | 匹配光标所在括号对应的括号 | | `CTRL-G` | 显示文档状态 | #### 删除操作 | 命令 | 操作 | | --- | --- | | `dw` | 删除当前单词直到下一个单词开头(不包含首字母) | | `de` | 删除单词直到该单词末尾(包含最后一个字母) | | `d$` | 删除从光标到行尾 | | `d2w` | 删除两个单词 | | `dd` | 删除一整行,并保存到 vim 寄存器 | | `3dd` | 删除三行 | | `ce` | 删除单词至词尾并进入插入模式 | | `cc` | 清空本行并进入插入模式 | #### 查找与替换 | 命令 | 操作 | | --- | --- | | `?hello` | 向上查找当前光标之前的 "hello" | | `/hello` | 向下查找当前光标之后的 "hello" | | `/hello\c` | 本次查找忽略大小写 | | `n` | 移动到下一个查找结果 | | `N` | 移动到上一个查找结果 | | `:s/thee/the/g` | 替换当前行中所有的 "thee" 为 "the" | | `:1,5s/old/new/g` | 替换第 1 到 5 行的 "old" 为 "new" | | `:%s/old/new/g` | 全文替换 | | `:%s/old/new/gc` | 全文替换(每次替换前提示确认) | #### 撤销与重做 | 命令 | 操作 | | --- | --- | | `u` | 撤销动作 | | `U` | 撤销当前行的所有动作 | | `CTRL-R` | 重做 | #### 字符替换 | 命令 | 操作 | | --- | --- | | `rx` | 替换当前光标下的字符为 x | | `R` | 进入替换模式(连续替换) | #### 插入与编辑 | 命令 | 操作 | | --- | --- | | `o` | 在下方插入一行 | | `O` | 在上方插入一行 | | `a` | 在当前光标指向字符的后面插入 | | `y` | 复制 | | `p` | 粘贴(将寄存器内容插入到当前行的下一行) | | `j$` `j0` | 控制每次移动到下一行时光标在行首还是行尾 | #### 外部命令与保存 | 命令 | 操作 | | --- | --- | | `:!ls` | 执行外部命令 | | `:w filename` | 保存当前文件为指定名称 | | `CTRL-D` | 显示所有匹配的命令 | | `<TAB>` | 自动补全 | #### 显示设置 | 命令 | 操作 | | --- | --- | | `:set hls` | 搜索结果高亮显示 | | `:set ic` | 忽略大小写 | | `:set noic` | 不忽略大小写 | | `:set number` | 显示行号 | ### 6.3 Vim 缓存恢复 ```bash vim -r # 显示 /tmp, /var/tmp/, ~/tmp/, './' 中的临时文件 ``` 例如 `vim -r flag` 会显示当前目录下 flag 文件的缓存文件。当对 flag 文件进行编辑时意外强制关闭 vim,可以通过此方法恢复文件:打开 `.flag.swq` 文件并执行 `:wq` 即可将缓存中的修改应用到原文件中,然后删除该缓存文件。 > **注意:** 若编辑缓存文件时再次意外退出 vim,会生成新的缓存文件 `.flag.swo`,以此类推可能生成 `.flag.swn`、`.flag.swm`、`.flag.swl` 等。必须将所有缓存文件全部删除后才能正常打开原始文件。 --- ## 七、Bash 脚本基础 > Bash 这个名字是 **Bourne-Again SHell** 的首字母缩写,是对 Stephen Bourne 这个名字的双关语——Stephen Bourne 是 Bash 前身之一的创造者。 ### 7.1 变量与运算 **赋值时等号两边不能有空格:** 错误示例: ```bash users = "a b c" ``` 正确写法: ```bash user="a b c" ``` **变量运算:** ```bash x=100 x=x/10 # 在输出时直接运算 echo $((x/10)) ``` ### 7.2 函数定义 如果可能的话,函数应该包含描述、全局变量、参数、输出和返回值的注释。 ```bash ####################################### # Description: Hello function # Globals: # None # Arguments: # Single input argument # Outputs: # Value of input argument # Returns: # 0 if successful, non-zero on error. ####################################### function hello(){ echo "Hello $1!" } ``` ### 7.3 条件表达式(if) - `[]` 代表单个表达式,例如:`if [ $name = "李明" ]` - `[[]]` 代表支持复合表达式,例如: ```bash if [[ 8 -eq 11 && "hello" == "hello" || 1 -eq 3 || 1 -eq 1 ]] ``` 或: ```bash if [[ ${name} = *"Li Ming"* ]] ``` ### 7.4 日期格式化 ```bash Usage: date +FORMAT ``` 常用 FORMAT(假设此时为 `Tue Jan 19 11:14:07 AM CST 2038`): | 格式符 | 说明 | | --- | --- | | `%d` | 本月第几号 | | `%H` | 获取当前小时 | | `%m` | 获取当前月份 | | `%Y` | 获取当前年份 | | `%s` | 自 1970-01-01 00:00:00 UTC 至今的秒数 | | `%N` | 获取当前纳秒 | 示例: ```bash $ echo $(date +%Y-%m-%d%t%H:%M:%S) 2022-08-31 17:48:45 ``` ### 7.5 管道输入变参数(xargs) 例如,删除当前文件夹下的所有文件: ```bash ls | xargs rm ``` ### 7.6 调试技巧 - 调试 Bash 脚本时可在执行脚本时使用参数 `-x` - `jq` —— JSON 处理器 --- ## 八、Git 常用操作 ```bash # 查看提交日志 git log git log --all # 比较版本差异 git diff HEAD HEAD^ # 重置到指定状态 git reset --hard HEAD^ # 分支操作 git branch -m [old_branch] <new_branch> # 修改分支名称 git branch -a # 显示全部分支 git branch --show-current # 显示当前分支名称 # 配置 git config --global --edit # 编辑用户名和邮箱配置 ``` **git log 示例输出:** ``` ┌──(frunoob㉿kali)-[/var/www/html/git_test] └─$ git log commit de14fcc22521e0c64bfdb4dccbda9e281efe2acc (HEAD -> master) Author: root <root@kali.frunoob> Date: Sat May 7 15:02:56 2022 +0800 edit flagj commit 1dbfdfb1d913a4c517f550fc65b9d24ee907c0ea Author: root <root@kali.frunoob> Date: Sat May 7 14:17:31 2022 +0800 flag ``` **git diff 示例:** ``` ┌──(frunoob㉿kali)-[/var/www/html/git_test] └─$ git diff HEAD HEAD^ diff --git a/flag b/flag index 3d18cbe..4b30686 100644 --- a/flag +++ b/flag @@ -1,3 +1 @@ flag{} -nihao -laskfjaslfj ``` **git reset 示例:** ``` ┌──(frunoob㉿kali)-[/var/www/html/git_test] └─$ sudo git reset --hard HEAD^ HEAD is now at 1dbfdfb flag └─$ git log commit 1dbfdfb1d913a4c517f550fc65b9d24ee907c0ea (HEAD -> master) Author: root <root@kali.frunoob> Date: Sat May 7 14:17:31 2022 +0800 flag ``` --- # Windows 命令 ### 9.1 测试代理连通性 ```bash powershell -Command "Invoke-WebRequest -Uri http://httpbin.org/ip -Proxy http://ip:port -UseBasicParsing | Select-Object -ExpandProperty Content" ``` 最后修改:2026 年 06 月 04 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 你的点赞将成为我坚持的动力,之一