拾忆🍂拾忆🍂
  • cpp
  • MySQL
  • Oracle
  • PostgreSQL
  • MyBatis
  • API升级
  • HMOS
  • 百变小组件
  • hdc
  • 元服务
  • Java
  • MinIO
  • Stream
  • JSP & Struts2
  • Spring
  • FFmpeg
  • Linux
  • Git
  • Nginx
  • Ollama
  • Adobe Audition
  • Aseprite
  • Excel
  • Markdown基本用法
  • MuseScore 4.x
  • UVR
  • Windows
  • emoji-cheat-sheet
  • IDE快捷键
  • obs-studio
  • YOLO
  • Python
  • VuePress 2.x
  • 内置组件
  • markdown-container
  • markdown-ext
  • markdown-hint
  • markdown-preview
  • markdown-tab
  • Markdown扩展语法
  • 插件配置
  • prismjs
  • 样式
  • CSS
  • JS
  • TS
  • Vue3
主页
梦的开始🌅
  • cpp
  • MySQL
  • Oracle
  • PostgreSQL
  • MyBatis
  • API升级
  • HMOS
  • 百变小组件
  • hdc
  • 元服务
  • Java
  • MinIO
  • Stream
  • JSP & Struts2
  • Spring
  • FFmpeg
  • Linux
  • Git
  • Nginx
  • Ollama
  • Adobe Audition
  • Aseprite
  • Excel
  • Markdown基本用法
  • MuseScore 4.x
  • UVR
  • Windows
  • emoji-cheat-sheet
  • IDE快捷键
  • obs-studio
  • YOLO
  • Python
  • VuePress 2.x
  • 内置组件
  • markdown-container
  • markdown-ext
  • markdown-hint
  • markdown-preview
  • markdown-tab
  • Markdown扩展语法
  • 插件配置
  • prismjs
  • 样式
  • CSS
  • JS
  • TS
  • Vue3
主页
梦的开始🌅
  • 「从开始,到永久」
  • C艹

    • cpp
  • Database

    • MySQL
    • Oracle
    • PostgreSQL
    • MyBatis
  • HarmonyOS

    • API升级
    • HMOS
    • 百变小组件
    • hdc
    • 元服务
  • Java

    • Java
    • MinIO
    • Stream
    • JSP & Struts2
    • Spring
  • Linux

    • FFmpeg
    • Linux
    • Git
    • Nginx
  • LLM

    • Ollama
  • Others

    • Adobe Audition
    • Aseprite
    • Excel
    • Markdown基本用法
    • MuseScore 4.x
    • UVR
    • Windows
    • emoji-cheat-sheet
    • IDE快捷键
    • obs-studio
    • YOLO
  • Python

    • Python
  • VuePress

    • VuePress 2.x
    • 内置组件
    • markdown-container
    • markdown-ext
    • markdown-hint
    • markdown-preview
    • markdown-tab
    • Markdown扩展语法
    • 插件配置
    • prismjs
    • 样式
  • Web

    • CSS
    • JS
    • TS
    • Vue3
  • 主页

Ubuntu22.04

目录

  • 目录
  • 手册
    • 0. 杂项
    • 1. 用户
    • 2. 权限
    • 3. ssh
    • 4. apt 软件源
    • 5. curl & wget
    • 6. tar&zip
    • 7. 文件/文件夹操作
    • 8. less
    • 9. java
    • 10. ip和port
    • 11. systemctl
    • 12. hostnamectl
    • 13. 环境变量
    • 14. sudo
    • 15. 防火墙
    • 16. shutdown
    • 97. shell
    • 98. nginx
    • 99. docker
    • 998. 系统日志
    • 999. MobaXterm没有颜色

手册

0. 杂项

# 查看Linux版本信息
uname -a
# 查看文件列表
ls -al == ll

# 查看资源占用(更推荐htop)
top
# 界面更友好,支持颜色标记和鼠标操作(可能需要安装)
htop
# 查看内存占用(-h 自动转换单位:GB/MB)
free -h

# 根据关键字查看进程信息 (grep -i 不区分大小写)
ps -ef | grep java
# 杀进程(根据上一个命令获取到的pid)
kill [pid]
# 关闭所有程序并正常关机
shutdown -h now
# -h 代表命令参数 +G 代表进入命令之后键盘键入一个G,其他命令类似
# 重启
reboot

# 查看ip
ip addr # 简写: ip a
# 释放dhcp获取的ip [或指定某个网卡的]
sudo dhclient -r [指定网卡id]
# 重新获取dhcp [或某个网卡的]
sudo dhclient [指定网卡id]

# 查看所有服务状态
systemctl status
# 命令后面加 -h或--help 命令的帮助文档
tar -h
# 当有命令输出的内容过长,左下角显示lines *** 等属性是
f:下一页
b:上一页
G:底部
g:顶部
/:后面输入字符回车之后检索关键字 n:下一个 N:上一个
:q 退出

# 设置时区
sudo timedatectl set-timezone 'Asia/Shanghai' # date -R 验证

# 历史命令
history # -c 清空历史命令

命令符号的意义

基础符号规则

使用 命令 --help 或者 命令 --usage 得到的列表中的符号释义:

符号含义示例及说明
[]可选参数ls [-l]:-l 参数可加可不加,不加时使用默认输出格式。
<>必填的占位符cp <源文件> <目标路径>:必须替换为实际的文件名或路径。
|互斥选项ffmpeg -c:v [libx264 | h264]: 视频编码器只能选择 libx264 或 h264 中的一种,两者不可共存。
...可重复参数tar -xvf 文件1 文件2 ...:可接受多个文件名。
-短选项(单字符)-a:通常用单横线引导,如 ls -a。
--长选项(完整单词)--all:如 ls --all,与 -a 等价。

特殊符号与组合

  1. 选项与参数的分组

    • 无括号的连续短选项:
      tar -xzvf 等价于 tar -x -z -v -f,但 -f 需接参数(如 -f filename)。
    • 组合中的必填参数:
      grep [OPTIONS] PATTERN [FILE]:PATTERN 是必填的,而 FILE 是可选的。
  2. 管道符 | 的含义

    将前一个命令的输出作为后一个命令的输入:

    ps aux | grep nginx
    
    • ps aux 列出所有进程
    • grep nginx 从中筛选包含 "nginx" 的行
  3. 省略号 ... 的扩展用法

    • 在路径中:/home/user/.../file 表示中间任意多级目录(非命令参数,常见于描述)。
    • 在参数中:rm 文件1 文件2 ... 表示可删除多个文件。

⚠️ 三、易混淆场景解析

  1. <> 与 [] 的嵌套
    • 命令 [--option=<值>]:整个 --option 是可选的,但如果使用,必须提供 <值>。
      示例:git commit [-m <消息>]
    • 命令 <必填> [可选]:如 chmod <权限> 文件,权限参数必填,文件名可选(默认当前目录)。
  2. 长选项的等号使用
    • --output=FILE 必须写成等号形式,不可空格分隔(如 --output FILE 会报错)。
    • 例外:部分命令支持空格(如 dd if=file),需查阅具体帮助。

🛠️ 四、实战案例:解读 grep --help 片段

bash

用法: grep [OPTION]... PATTERN [FILE]...
选项:
  -i, --ignore-case   忽略大小写
  -v, --invert-match  选中不匹配的行
  -E, --extended-regexp 使用扩展正则
  -m <NUM>, --max-count=<NUM>  匹配 <NUM> 次后停止
  • [OPTION]...:零或多个可选选项(如 -i、-v 等)。
  • PATTERN:必填参数(搜索模式)。
  • [FILE]...:零或多个文件(不提供时从标准输入读取)。
  • -m <NUM>:必填参数,需替换为数字(如 -m 10)。

💡 五、学习建议

  1. 查阅 man 手册:
    输入 man 命令名(如 man grep),文档更详细,包含参数类型说明(如 <NUM> 需数字)。
  2. 注意非标准符号:
    少数命令(如 find)可能用 {} 表示占位符(如 -exec rm {} \;),需单独学习。
  3. 实践验证:
    对不确定的参数,用小规模测试(如 mkdir --help | grep "verbose" 查找 -v 说明)。

1. 用户

启用root用户

# (新装ubuntu时候可能需要)启用root账户(命令执行后输入的是要设置的root的密码)
sudo passwd root
# 屏蔽root账户
sudo passwd -l root
# 模拟初始登录的环境,加载root用户的配置文件,最小安全环境(不是本用户也不是root环境)(使用本账户密码)
sudo -i
# 切换到 root 用户并使用root环境变量(使用root用户的密码)
su -

[详情请看](###14. sudo)

新建用户组和用户

  1. 创建新用户组:
sudo groupadd mygroup

这会创建一个名为 mygroup 的新用户组。你也可以使用 -g 选项指定组ID:

sudo groupadd -g 1000 mygroup

这将创建一个组ID为 1000 的新用户组。

  1. 创建新用户:
sudo useradd -m -g mygroup -s /bin/bash myuser

这会创建一个名为 myuser 的新用户,将其加入到 mygroup 用户组,设置其家目录 (-m 选项),并将其默认 shell 设置为 /bin/bash (-s 选项)。

如果要为新用户设置密码,可以使用 passwd 命令:

sudo passwd myuser

这将提示你设置密码。

上述命令中:

  • -m:表示创建用户时,同时创建用户的家目录。
  • -g:表示将用户添加到指定的用户组。
  • -s:表示设置用户的默认 shell。
查看用户所属组
  1. groups 命令
    直接显示当前用户所属的所有用户组:

    groups
    

    示例输出: 当前用户 : group1 group2 group3

  2. id 命令
    查看更详细的用户与组信息(包括UID、GID及附属组):

    id
    

    示例输出: uid=1000(user) gid=1000(group1) groups=1000(group1),27(sudo),113(docker)

  3. 查看所有用户及其主组

    getent passwd | awk -F: '{print $1 " (主组ID:" $4 ")"}'
    
查看所有用户组及成员
  1. 列出所有用户组及成员

    getent group
    

    输出格式: 组名:密码占位符:GID:成员列表
    示例:

    sudo:x:27:user1,user2
    docker:x:113:user3,user4
    users:x:100:user5
    
  2. 通过系统文件查看

    cat /etc/group   # 直接读取用户组配置文件
    
  3. 查询特定用户组的成员

    getent group sudo  # 查看sudo组的成员
    

新建用户并设置root权限

# 1.创建新用户:在执行这个命令后,系统会提示你设置新用户的密码等信息。
sudo adduser enlin

# 2.将新用户添加到 sudo 组:
sudo usermod -aG sudo enlin
这个命令将用户 enlin 添加到 sudo 组中。现在,enlin 就有了执行 sudo 命令的权限。

# 3.验证:登录到新用户
su - enlin
# 尝试执行需要超级用户权限的任务:
sudo ls /root
# 如果你输入了正确的密码,并且没有出现权限错误,说明新用户已经成功添加到 sudo 组,可以以 sudo 的方式执行任务。

更改用户密码

  1. 更改当前用户密码

    passwd
    

    按提示输入当前密码 → 新密码 → 确认新密码。

  2. 更改其他用户密码(需sudo权限)

    sudo passwd username  # 替换username为目标用户名
    

    输入sudo密码 → 设置新用户密码。

2. 权限

1) chmod

介绍

在 Unix/Linux 操作系统中,需要理解三个核心维度:

  • 用户身份

    • u: 文件所有者(User/Owner)
    • g: 文件所属组(Group)
    • o: 其他用户(Others)
    • (隐含) a 代表 u, g, o 的总和,表示所有(ALL)
  • 权限类型 (每个用户身份是有可以拥有多个权限类型的)

    • r: 读(Read)
    • w: 写(Write)
    • x: 可执行(Execute)
  • 权限表示法(符号和数字)

    • 符号表示法

      提示

      使用ls -l 或者 ll,得到的列表,默认就是符号表示法:

      • 第一列显示文件类型和权限(10个字符),例如:-rwxr-xr--
        • -:文件类型(- 普通文件,d 目录,l 链接等)。
        • rwx:所有者 (u) 权限:读、写、执行。
        • r-x:所属组 (g) 权限:读、执行(无写)。
        • r--:其他用户 (o) 权限:读(无写,无执行)。
      • 第三列显示所有者 (u)。
      • 第四列显示所属组 (g)。
    • 数字表示法
      将 rwx 看作三位的二进制数:

      • r = 4 (2^2)
      • w = 2 (2^1)
      • x = 1 (2^0)
      • - = 0:什么权限都没有

      数字相加,就是拥有多个权限。

修改权限
  • 符号模式: chmod [ugoa][+-=][rwx] 文件/目录
    • [ugoa]: 指定要修改的用户类别 (u, g, o, a 或组合如 ug)。a 是默认值(如果省略)。
    • [+-=]: + 添加权限,- 移除权限,= 设置确切权限(覆盖原有)。
    • [rwx]: 要操作的权限。
    • 示例:
      • chmod u+x script.sh:给所有者 (u) 添加执行 (x) 权限。
      • chmod go-w important.txt:移除组 (g) 和其他用户 (o) 的写 (w) 权限。
      • chmod a=rx sharedir/:设置所有用户 (a) 的权限为读 (r) 和执行 (x)(即 r-xr-xr-x / 555)。
      • chmod o=r file:设置其他用户 (o) 的权限仅为读 (r)。
      • chmod u=rwx,g=rw,o=r filename: 设定权限组合,设置文件所有者为读写执行,组为读写,其他用户为读。
  • 数字模式: chmod 数字 文件/目录
    • 示例:
      • chmod 755 script.sh:设置权限为 rwxr-xr-x (所有者完全控制,组和其他可读可执行)。
      • chmod 644 config.conf:设置权限为 rw-r--r-- (所有者可读写,组和其他只读)。
      • chmod 700 ~/.ssh/:设置目录权限为 rwx------ (仅所有者可完全访问,常用于 .ssh 目录)。
  • 递归修改 (-R): 修改目录及其所有内容(子目录和文件)的权限。非常谨慎使用!
    • 示例:chmod -R 755 public_html/ (将 public_html 目录下所有内容设为 755)。
  1. 设定权限组合:

    • :

      
      
    • 设置所有用户为只读:

      chmod a=r filename
      

2) chown

修改所有者和所属组:

  • chown (Change Owner): chown [新所有者][:[新组]] 文件/目录
    • 需要 root 权限或相应权限。
    • 示例:
      • chown alice report.txt:将 report.txt 的所有者改为 alice。
      • chown alice:developers project/:将 project/ 目录的所有者改为 alice,所属组改为 developers。
      • chown :www-data logfile.log:仅将 logfile.log 的所属组改为 www-data。
    • 递归修改:chown -R alice:developers project/
  • chgrp (Change Group): chgrp [新组] 文件/目录 (功能是 chown :[新组] 的子集)。
    • 示例:chgrp www-data /var/www/ (将 /var/www/ 目录的所属组改为 www-data)。
# chown 需要管理员权限
# 文件所属权 sudo chown [新所有者][:[新组]] 文件/目录
sudo chown [新所有者]:[新所属组] 文件或目录
# 或不写组
sudo chown [新所有者] 文件或目录

# 将文件所有者更改为新用户:
sudo chown enlin myfile.txt
# 将目录及其内容的所有者更改为新用户和新组:
sudo chown -R enlin:newgroup mydirectory

3. ssh

重要

首先,ssh有的两个配置文件

  • ssh_config: 你作为客户端的配置,是你连接别人的时候的使用的。
  • sshd_config: 你作为是服务端的配置,是别人连接你的时候使用的。
特性ssh_configsshd_config
作用对象SSH 客户端 (ssh 命令)SSH 服务端 (sshd 守护进程)
文件路径/etc/ssh/ssh_config (系统级) ~/.ssh/config (用户级)/etc/ssh/sshd_config (仅系统级)
配置目标控制客户端连接行为(如连接参数、跳板设置)控制服务端认证与访问规则(如端口、登录限制)
生效范围用户发起 SSH 连接时生效系统启动 SSH 服务时生效
典型配置项Host、Port、User、ProxyJumpPort、PermitRootLogin、PasswordAuthentication

安装open-ssh

# 使用root用户
sudo apt install openssh-server

# 启动服务(如果安装好没有自动启动的话)
systemctl start ssh

连接

#开始连接(如果是默认`22`端口,就不用带参数`-p`)
ssh username@host-ip_or_domain -p 2222
# 首次连接会提示确认主机指纹,输入 yes 继续。

注意

# 确保本机`ssh`服务已启动
sudo systemctl status ssh

# 在目标主机上执行,获得目标主机的ip
ip a

更改端口号

  1. 编辑SSH配置文件
    打开终端,执行:

    sudo vim /etc/ssh/sshd_config
    
  2. 修改端口号
    找到 #Port 22 这一行(默认被注释),删除 # 并修改端口号(例如改为 2222):

    Port 2222  # 取消注释并替换为自定义端口
    

    警告

    • 避免使用已知服务端口(如80、443),建议选择 1024-65535 之间的端口。
    • 修改端口之后一定要在使用新端口连接成功之前,保持一个 活动的SSH窗口 。防止自己再也登录不上主机。
  3. 重启SSH服务

    sudo systemctl restart ssh
    
  4. 允许新端口通过防火墙

    # 替换为你的新端口号
    sudo ufw allow 2222
    sudo ufw reload
    
  5. 测试连接
    使用新端口连接服务器:

    ssh username@server_ip -p 2222
    
  6. (可选)关闭默认22端口
    确认新端口可用后,在配置文件中删除 Port 22 或注释它:

    #Port 22  # 注释此行以禁用22端口
    

    再次重启SSH服务。

允许 ssh 登录的用户

需同时满足两个条件:

  1. 用户拥有有效密码
    检查 /etc/shadow 中用户密码字段不为 * 或 !:

    sudo awk -F: '$2 !~ /[!*]/ {print $1}' /etc/shadow
    
  2. SSH服务允许密码认证
    在 /etc/ssh/sshd_config 中确认:

    PasswordAuthentication yes  # 必须为yes,此项未配置即默认yes
    

警告

即使满足以上条件,用户还需拥有合法的Shell(在 /etc/passwd 中Shell不是 /sbin/nologin 等)。

黑、白名单用户

vim /etc/ssh/sshd_config
  • 黑名单,禁止特定用户登录:

    DenyUsers user1 user2
    
  • 白名单,仅允许特定用户登录:

    AllowUsers user1 user2
    

SSH 服务在验证登录请求时,会按以下顺序检查:

  1. DenyUsers → 若命中则拒绝。
  2. AllowUsers → 若未命中则拒绝。
  3. (root用户)PermitRootLogin → 仅当通过前两步后才会生效。

查看当前 ssh 活动中的用户

使用 last 命令查看登录历史

允许 root 登录

sudo vim /etc/ssh/sshd_config

# 使用 /PermitRootLogin 定位位置(修改,如果没有就新增)

# 修改以下配置:
#LoginGraceTime 2m
#PermitRootLogin prohibit-password # root禁密码,需要使用密钥登录
#StrictModes yes
#MaxAuthTries 6
#MaxSessions 10

# 为

LoginGraceTime 2m	# 连接ssh之后身份验证有效时间
PermitRootLogin yes # 只改这一条也行
StrictModes yes # 严格模式,`~`文件夹只有自己有权限才可以使用ssh登录进去
#MaxAuthTries 6
#MaxSessions 10


# 重启 ssh
systemctl restart ssh

重要

sshd_config 重要配置解析

# 仅控制root用户登录方式(优先级低于下方两个验证):
## yes: 允许密码或SSH密钥
## no: 禁止登录
## without-password: 禁密码,只可以使用SSH密钥(同 `prohibit-password`:旧版本名称)
permitrootlogin without-password

# 全局密码验证开关:yes no
passwordauthentication yes

# 全局密钥验证开关:yes no
pubkeyauthentication yes

提示

permitrootlogin 相等于在走完 passwordauthentication 和 pubkeyauthentication 验证之后,仅对于 root 用户的一道验证方式,如果这两个都是 no ,天王老子来了 root 也不能登录。

配置验证命令

  • 客户端配置检查

    ssh -G myserver
    

    注

    显示最终生效的客户端配置(含别名解析)

  • 服务端配置检查

    sudo sshd -T
    

    注

    解析并验证当前 sshd_config 的有效配置

登录日志

📜 一、查看系统日志文件(最常用)

不同发行版的 SSH 日志存储位置不同:

  1. Debian/Ubuntu 等系统

    sudo cat /var/log/auth.log | grep sshd
    
  2. CentOS/RHEL/Fedora 等系统

    sudo cat /var/log/secure | grep sshd
    

🔍 常用过滤技巧:

  • 查看所有 SSH 登录记录

    grep 'sshd' /var/log/auth.log  # 或 /var/log/secure
    
  • 仅查看成功登录记录

    grep 'Accepted password' /var/log/secure  # 认证方式可能是 password/publickey
    
  • 仅查看失败登录记录

    grep 'Failed password' /var/log/auth.log  # 包含无效用户、密码错误等
    
  • 按 IP 地址过滤

    grep 'sshd.*192.168.1.100' /var/log/secure
    
  • 实时监控新日志

    sudo tail -f /var/log/secure | grep sshd  # CentOS
    sudo tail -f /var/log/auth.log | grep sshd  # Debian/Ubuntu
    

⚙️ 二、使用 journalctl 查询 Systemd 日志(Systemd 系统适用)

若系统使用 systemd,可通过以下命令查看 SSH 服务(sshd)日志:

sudo journalctl -u sshd

🔍 高级过滤选项:

  • 查看本次启动后的日志

    sudo journalctl -u sshd -b
    
  • 仅显示失败登录

    sudo journalctl -u sshd -g 'Failed|Invalid'  # 包含无效用户、认证失败等
    
  • 按时间范围查询

    sudo journalctl -u sshd --since "2025-07-23 09:00:00" --until "2025-07-23 12:00:00"
    
  • 持续跟踪新日志

    sudo journalctl -u sshd -f
    

👤 三、使用 last 命令查看登录历史

快速查看用户登录/登出记录(含 SSH 会话):

# 查看当前活跃会话
last | grep -i "still logged in"
# 显示关机/重启事件
last -x
# 显示 IP 地址而非主机名
last -a -i

🔐 关键日志条目解析

日志内容示例事件类型
Accepted publickey for user1 from 192.168.1.10公钥认证成功登录
Accepted password for user2 from 192.168.1.20密码认证成功登录
Failed password for invalid_user from 192.168.1.30无效用户登录尝试
Failed publickey for user1 from 192.168.1.40公钥认证失败
User root not allowed because not listed in AllowUsers访问控制拒绝

⚠️ 注意事项

  1. 权限要求:查看完整日志需 root 或 sudo 权限。
  2. 日志轮转:旧日志可能被压缩(如 /var/log/secure-20250701.gz),需用 zcat 或 zgrep 查看。
  3. 配置路径:若日志位置不符,检查 /etc/rsyslog.conf 中的配置。
  4. 深度分析:结合 awk 或日志分析工具(如 Logwatch)可生成登录统计报告。

提示

💡 建议:日常监控使用 tail -f 或 journalctl -f 实时跟踪;审计时用 grep 按 IP/用户/状态过滤,重点关注 Failed 和 Invalid 条目以识别暴力破解行为。

4. apt 软件源

查看

# 查看软件源配置文件内容
sudo less -N /etc/apt/sources.list
# 按i修改内容之后,按下Esc,输入:wq(保存并退出)
sudo vim /etc/apt/sources.list

更改软件源

/etc/apt/sources.list
# vim /etc/apt/sources.list

# 添加一下内容 以下为以华为云镜像源举例
# deb http://deb.debian.org/debian $(lsb_release -cs) main
deb https://mirrors.huaweicloud.com/debian trixie main
deb https://mirrors.huaweicloud.com/debian trixie -updates main
deb https://mirrors.huaweicloud.com/debian-security trixie -security main

提示

  • 上文中的 trixie 为 Debian 13.2 的发行版名称,使用命令 lsb_release -cs 查看并替换为你的Linux发行版名称。
  • 更改了软件源之后需要执行 sudo apt update 刷新软件缓存。(过程中也会输出当前软件源的URI地址也可以以此判断是否更改成功)

5. curl & wget

# -o 指定保存的文件路径和文件名
curl -o /path/to/save/file.txt http://example.com/file.txt

# -P指定要保存的路径
wget -P /home/user/downloads/ http://example.com/myfile.zip

curl 和 wget 都是用于从命令行下载文件的工具,但它们之间有一些区别:

  1. 协议支持:

    • curl 支持多种协议,包括 HTTP、HTTPS、FTP、FTPS、SCP、SFTP、LDAP 等,而且它更像一个通用的数据传输工具,支持很多其他功能,如代理、用户认证等。
    • wget 主要用于 HTTP、HTTPS 和 FTP 下载。
  2. 用法和参数:

    • curl 的语法通常更灵活,它有很多选项和参数,支持更复杂的操作。它的输出默认直接显示在终端,可以通过 -o 参数指定保存文件。
    • wget 的语法相对简单,它的输出默认保存到文件中,可以通过 -O 参数指定文件名。
  3. 递归下载:

    • wget 内置支持递归下载,可以下载整个目录,而 curl 需要使用 -r 参数来实现类似的功能。
  4. 续传:

    • wget 默认支持断点续传,如果下载中断,可以通过 -c 参数继续下载。curl 也支持续传,需要使用 -C - 参数。
  5. 输出显示:

    • curl 的输出默认直接显示在终端,你可以使用 -o 参数将其保存到文件中。
    • wget 的输出默认保存到文件中,显示简洁。

总的来说,如果你只是简单地下载文件,两者都可以胜任。如果需要更复杂的操作,比如递归下载、续传等,你可能需要根据具体需求选择使用 curl 或 wget。

6. tar&zip

tar

  • -x:解压缩文件。
  • -c:创建新的 tar 归档文件。
  • -z:使用 gzip 进行压缩。
  • -v:显示详细的文件列表。
  • -f:指定归档文件的名称。
  • -t:列出归档文件中的内容。
  • -r:追加文件到已有的归档文件。
  • -C /path/to/extract/folder:指定要将文件提取到的目标文件夹。
  1. 创建 tar 归档文件:
tar -cvf archive.tar file1 file2 directory/
  1. 解压 tar 归档文件:
tar -xvf archive.tar
  1. 创建 gzip 压缩的 tar 归档文件:
tar -czvf archive.tar.gz file1 file2 directory/
  1. 解压缩 gzip 压缩的 tar 归档文件:
tar -xzvf archive.tar.gz -C /document/
  1. 列出 tar 归档文件内容:
tar -tvf archive.tar
  1. 追加文件到已有的 tar 归档文件:
tar -rvf archive.tar newfile
  1. 从 tar 归档文件中提取部分文件:
tar -xvf archive.tar file1 file2

zip & unzip

  • -e: 启用zip文件的加密。
  • -u: 更新现有的zip文件,将新文件添加到归档中。
  • -P password: 提供zip文件的密码。
  • -l: 列出zip文件中的内容。
  • -d :指定要将文件提取到的目标文件夹。
  1. 创建zip归档文件:包含指定的文件和目录。
zip archive.zip file1 file2 directory/
  1. 解压缩zip归档文件:
unzip archive.zip -d /document/
  1. 创建具有密码保护的zip归档文件:系统会提示你输入密码。
zip -e archive.zip file1 file2 directory/
  1. 解压缩具有密码保护的zip归档文件:其中 password 是你设置的密码。
unzip -P password archive.zip
  1. 列出zip归档文件内容:
unzip -l archive.zip
  1. 将文件添加到zip归档文件:向现有的zip归档文件中添加新文件 newfile。
zip -u archive.zip newfile
  1. 仅解压指定文件或目录:
unzip archive.zip file1 directory/

这些是 zip 和 unzip 命令的一些基本用法。你可以使用 man zip 和 man unzip 命令查看详细的文档。

7. 文件/文件夹操作

mv

mv 命令在Linux中用于移动文件或重命名文件,以下是一些 mv 命令的常用方法,包括一些覆盖文件的情况:

mv [选项] 源文件/目录 目标文件/目录

mv 命令提供了几个选项来控制其行为:

  • -i(interactive): 在覆盖文件之前提示用户确认
  • -f(force): 强制覆盖目标文件,不会提示用户确认
  • -u(update): 只有当源文件比目标文件新,或者目标文件不存在时,才会移动文件
  • -v(verbose): 显示操作的详细过程
  1. 移动文件或目录:
mv <sourcefile | sourcepath> /path/to/destination/

这将把 sourcefile 文件或 sourcepath 目录移动到指定的目标路径下。

  1. 移动并重命名文件或目录:
mv <[sourcefile] | [sourcepath]> /path/to/destination/newname

这将把 sourcefile 移动到指定的目标路径,并重命名为 newname。

  1. 批量移动文件:
mv file1 file2 file3 /path/to/destination/

这将把多个文件一次性移动到指定的目标路径。

  1. 使用通配符:
mv *.txt /path/to/destination/
  1. 强制移动并覆盖目标文件:
mv -f sourcefile /path/to/destination/

这将强制移动 sourcefile 到目标路径,如果目标路径已存在同名文件,将会被覆盖。

  1. 交互式移动,避免覆盖:
mv -i sourcefile /path/to/destination/

这将在移动文件时进行交互式操作,如果目标路径已存在同名文件,会询问是否覆盖。

cp

cp 命令用于复制文件或目录。以下是一些 cp 命令的常用方法,包括一些覆盖文件的情况:

  1. 复制文件:
cp sourcefile /path/to/destination/

这将复制 sourcefile 到指定的目标路径。

  1. 复制并重命名文件:
cp sourcefile /path/to/destination/newname

这将复制 sourcefile 到指定的目标路径,并重命名为 newname。

  1. 复制多个文件到目录:
cp file1 file2 file3 /path/to/destination/

这将复制多个文件到指定的目标路径。

  1. 递归复制目录及其内容:
cp -r sourcedirectory /path/to/destination/

或者使用 -R 选项:

cp -R sourcedirectory /path/to/destination/

这将递归地复制目录及其所有内容。

  1. 强制复制并覆盖目标文件:
cp -f sourcefile /path/to/destination/

这将强制复制 sourcefile 到目标路径,如果目标路径已存在同名文件,将会被覆盖。

  1. 交互式复制,避免覆盖:
cp -i sourcefile /path/to/destination/

这将在复制文件时进行交互式操作,如果目标路径已存在同名文件,会询问是否覆盖。

  1. 复制并保留源文件的时间戳等信息:
cp --preserve=timestamps sourcefile /path/to/destination/

这将复制文件并保留源文件的时间戳等信息。

rm

rm 命令用于删除文件或目录。请注意,rm 命令是一个非常强大的命令,删除的文件无法被恢复,请谨慎使用。以下是一些 rm 命令的常用方法:

  1. 删除文件:
rm filename

这将删除当前工作目录下的 filename 文件。

  1. 删除多个文件:
rm file1 file2 file3

这将删除多个文件。

  1. 删除目录及其内容:
rm -r directory

或者使用 -R 选项。

  1. 交互式删除:
rm -i filename

这将在删除文件时进行交互式操作,确认是否删除。

  1. 强制删除,不进行确认:
rm -f filename

这将强制删除文件,不进行任何确认。慎用此选项,因为删除后无法恢复。

  1. 递归删除目录,不进行确认:
rm -rf directory

或者使用 -Rf 选项:

rm -Rf directory

这将递归地强制删除目录及其所有内容,不进行任何确认。

  1. 删除空目录:
rmdir directory

这将删除空目录。

mkdir

mkdir 命令用于创建目录。以下是一些 mkdir 命令的常用用法:

  1. 创建单个目录:
mkdir directory_name

这将在当前工作目录中创建一个名为 directory_name 的目录。

  1. 创建多个目录:
mkdir dir1 dir2 dir3

这将在当前工作目录中创建多个目录。

  1. 创建嵌套目录:
mkdir -p parent_directory/child_directory

使用 -p 选项,可以创建包含子目录的嵌套目录。如果 parent_directory 不存在,它也会被创建。

  1. 创建绝对路径的目录:
mkdir /path/to/directory

这将在指定的路径中创建目录。

  1. 创建目录并设置权限:
mkdir -m 755 directory_name

使用 -m 选项可以设置新创建目录的权限。这里的 755 是权限的数字表示法,你可以根据需要调整。

  1. 创建多级嵌套目录并设置权限:
mkdir -m 755 -p /path/to/nested/directory

这将创建多级嵌套目录,并为每个新创建的目录设置权限。 -p 选项会自动创建不存在的父目录。

  1. 创建临时目录:
mkdir -p /tmp/new_directory

你可以使用 -p 选项创建临时目录,例如在 /tmp 目录下创建新目录。

vim

新建

使用 Vim 新建文件的常用方法是通过以下步骤:

  1. 打开终端。

  2. 输入以下命令来创建新文件并用 Vim 打开:

vim filename

这将创建一个名为 filename 的新文件,并用 Vim 打开。如果文件不存在,Vim 将会创建它。

  1. 按下 i 键进入插入模式,这样你就可以开始输入内容。

  2. 输入你的文本。

  3. 按下 Esc 键退出插入模式。

  4. 输入 :wq 并按下 Enter 保存文件并退出 Vim。如果你想在不保存的情况下退出,可以使用 :q!。

如果你想在不保存的情况下退出 Vim,可以按下 Esc 进入命令模式,然后输入 :q! 并按下 Enter。

如果你只是想保存文件而不退出 Vim,可以按下 Esc 进入命令模式,然后输入 :w 并按下 Enter。

编辑

Vim 是一个强大而灵活的文本编辑器,具有许多功能和命令。以下是一些 Vim 的其他常用用法:

  1. 移动光标:

    • h:左移光标
    • j:下移光标
    • k:上移光标
    • l:右移光标
  2. 删除和复制文本:

    • x:删除光标下的字符
    • dd:删除整行
    • yy:复制整行
    • p:在光标后粘贴
  3. 撤销和重做:

    • u:撤销上一步操作
    • Ctrl + r:重做
  4. 搜索和替换:

    • /search_term:向下搜索指定字符串(回车之后,按n下一个,N上一个)
      • /search_term\c:\c 意为不区分大小写
    • ?search_term:向上搜索指定字符串
    • :s/old/new/g:替换每一行中的所有匹配项
    • :1,10s/old/new/g:只替换第1到第10行的匹配项
  5. 保存和退出:

    • :w:保存文件
    • :q:退出 Vim
    • :wq 或 ZZ:保存并退出
    • :q!:强制退出,不保存更改
  6. 显示行号:

    • :set number:显示行号
    • :set nonumber:关闭行号显示
  7. 跳转到指定行:

    • :n:跳转到第 n 行
  8. 分割窗口:

    • :sp:水平分割窗口
    • :vsp:垂直分割窗口
    • Ctrl + w + w:在窗口之间切换
  9. 多文件编辑:

    • :e filename:打开另一个文件
    • :n:打开下一个文件
    • :N:打开上一个文件
  10. 宏录制和重放:

  • q<letter>:开始录制宏到指定寄存器 <letter>
  • q:停止录制宏
  • @<letter>:重放宏

find

find 路径 条件 文件名

# 通过名称
find / -name *.conf
# 在/etc 文件夹下搜索所有大于1MB的文件
find /etc -size +1M
# 列出当前工作目录中的所有文件、目录以及子文件信息
find /home -user enlin

-name 匹配文件名   
-nouser 匹配无所属主的文件 
-perm 匹配文件权限 
-nogroup 匹配无所属组的文件
-user 匹配文件所属主 
-newer 匹配比指定文件更新的文件
-group 匹配文件所属组
-type 匹配文件类型 主要有:一般正规文件(f)、设备文件(b,c)、目录(d)、连接文件(l)、socket(s)及FIFO(p)等属性
-mtime 匹配最后修改文件内容时间 
-size 匹配文件大小 
-atime 匹配最后读取文件内容时间 
-prune 不搜索指定目录 
-ctime 匹配最后修改文件属性时间 
-exec…… {}\; 进一步处理搜索结果

8. less

# -h 代表命令参数 +G 代表进入命令之后键盘键入一个G,其他命令类似

# 带行号打开log文件并直接跳转最后一行
less -N +G filename.log
# +G 相当于less进去之后键盘键入了一个大写G,代表跳转最后一行
:10 跳转到第10行
回车 向下滚动一行
空格/f 向下滚动一屏
b向上滚动一屏
F 进入“实时跟踪”模式 类似tail -f (ctrl+C退出实时跟踪模式)

# less -N带行号 +G跳转到最后一行 -p根据关键字 -j前25行 -z后30行 文件名称
less -N +G -p 关键字 -j25 -z30 your_file.txt
# 执行完less之后,按下/ 输入关键字,如 /talent
# 也可以直接再命令中设置:less -N +G your_file.txt +/talent
# 执行命令 F,可以实现类似 tail -f 的效果(实时刷新,按Ctrl+C退出到less状态)

下面是这四个命令的一些常见用法:

命令主要用途是否交互适合文件大小关键特性
cat显示/合并整个文件内容❌小文件一次性输出全部内容
echo输出文本/变量值❌不适用生成文本,常用于脚本
less分页查看文件(可前后翻页)✔️大文件交互式浏览,支持搜索
tail查看文件末尾内容/实时跟踪日志❌(-f 是动态)任意大小监控日志更新,查看结尾
  1. **tail 命令:**适合跟踪文件的动态变化,查看日志等文件

    • 查看文件的末尾内容。

    • 示例:

      tail filename
      
    • 实时动态查看文件末尾:

      tail -f filename
      
      # 过滤关键字
      tail -f filename | grep "ERROR"
      
  2. less 命令:

    • 适合在终端中按页查看较大的文本文件,提供交互式浏览功能。
    • 进入less之后,键盘键入F可以达到类似tail -f的实时效果,按ctrl+c退出到less状态。
    • b:向上滚一屏
    • f:向下滚一屏
    • G:跳转到最后一行
    • g:跳转到第一行
    • less -N带行号 +G跳转到最后一行 -p根据关键字 -j前25行 -z后30行 文件名称
      less -N +G -p 关键字 -j25 -z30 your_file.txt
      
    • /: 进入less之后的关键字搜索,例如/Root回车之后就会高亮关键字(区分大小写),
      按下n下一个,N上一个。
    • -I: 不区分大小写,可以在less后加上,也可以在进入less之后输入-I,这样使用/检索也不区分大小写了。
  3. echo 命令:

    • 在终端中输出文本内容。

    • 示例:

      echo "Hello, World!"
      
    • 将文本输出到文件:

      echo "Hello, World!" > output.txt
      
  4. cat 命令:

    • 连接文件并打印到标准输出。

    • 示例:

      cat filename
      
    • 合并多个文件内容到一个新文件:

      cat file1 file2 > combinedfile
      # 如果不想保存只查看,可以省略'>'符号
      

9. java

启动

# 控制台启动,ctrl+c之后应用即关闭
java -jar -Dspring.active.profiles=prod file-api.jar
# 后台启动
nohup java -jar -Dspring.active.profiles=prod file-api.jar &

10. ip和port

ping 主要是判断网络的连通性,tracert 主要是判断网络路径和延时,telnet 常用于连接远端设备的端口。

  • ping

    Ping [目标域名]
    
  • tracert

    Tracert -d [目标IP]
    :: 或
    Tracert -d [目标域名]
    
  • talnet

    telnet [ip] [端口]
    

DHCP改固定ip

提示

  • 如果是在 VMware 中配置,仅适用于桥接模式(直接连接物理网络)

  • 使用 ip addr [show] 查看本机ip地址

  • 使用一下命令查看当前系统网络配置方式

    # 查看NetworkManager管理的接口
    nmcli device status
          
    # 检查systemd-networkd服务
    systemctl status systemd-networkd
          
    # 查看netplan配置
    ls /etc/netplan/
          
    # 检查传统的interfaces配置
    cat /etc/network/interfaces
    

一、interfaces方式

  1. 备份网络配置文件

    sudo cp /etc/network/interfaces /etc/network/interfaces.backup
    
  2. 编辑网络配置文件

    sudo vim /etc/network/interfaces
    

    按照以下内容编辑

    提示

    常见接口名称:eth0, enp3s0, ens33 等,使用 ip addr [show] 查看。

    /etc/network/interfaces
    source /etc/network/interfaces.d/*
    
    # The loopback network interface
    auto lo
    iface lo inet loopback
    
    # The primary network interface
    # 注释掉DHCP方式获取ip配置
    # allow-hotplug ens33
    # iface ens33 inet dhcp
    
    # 键入固定ip配置
    auto ens33
       iface ens33 inet static
           # ip地址
           address 192.168.3.15
           # 子网掩码
           netmask 255.255.255.0
           # 网关
           gateway 192.168.3.1
           # dns服务器地址
           dns-nameservers 192.168.3.1
    
  3. 重启网络服务

    sudo systemctl restart networking
    

二、Netplan方式

  1. 备份

    sudo cp /etc/netplan/00-installer-config.yaml /etc/netplan/00-installer-config.yaml.backup
    # 或备份所有配置
    sudo cp -r /etc/netplan/ /etc/netplan.backup
    
  2. 编辑配置文件,文件可能为:

    • 00-installer-config.yaml(Ubuntu 安装器创建)
    • 01-netcfg.yaml
    • 50-cloud-init.yaml(云实例)
    # 编辑配置文件
    sudo nano /etc/netplan/00-installer-config.yaml
    # 或使用 vim/vi
    sudo vim /etc/netplan/00-installer-config.yaml
    
    network:
      version: 2
      ethernets:
        eth0:                    # 你的网卡名称
          dhcp4: no              # 禁用 DHCP
          addresses: 
            - 192.168.1.100/24   # 静态 IP 地址和子网掩码
          routes:
            - to: default
              via: 192.168.3.1   # 网关
              metric: 100        # 路由优先级
          nameservers:
            addresses:           # DNS 服务器
              - 8.8.8.8
              - 8.8.4.4
    
  3. 应用配置

    # 测试配置语法(不应用)
    sudo netplan try
    # 按 Enter 确认,如果 120 秒内不确认会自动回滚
    
    # 或直接应用配置
    sudo netplan apply
    
    # 强制应用(即使有错误也应用)
    sudo netplan --debug apply
    

telnet

# 如果端口打开,你会看到一些连接信息。如果端口关闭,你可能会收到连接失败的消息。
telnet [hostname or IP address] [port]

nc

#  nc 命令(netcat)进行端口测试,命令会尝试连接到远程主机的指定端口,但不会发送任何数据。如果端口打开,你将看到一行 succeeded! 的消息。
nc -zv example.com 80
# 一些参数解释
-z 使用0输入/输出模式,只在扫描通信端口时使用。
-v 显示指令执行过程。
-w<超时秒数> 设置等待连线的时间。

端口占用检查

sudo ss -tuln | grep ':2222'  # 检查2222端口占用

11. systemctl

参考Linux-systemctl.md文件

  • 启动

    sudo systemctl start <服务名>
    
  • 停止

    sudo systemctl stop <服务名>
    
  • 重启

    sudo systemctl restart <服务名>
    
  • 重新加载配置(不中断服务)

    sudo systemctl reload <服务名>
    
  • 状态

    sudo systemctl status <服务名>
    
    • ACTIVE: 主状态(子状态)

      状态说明常见场景
      running主进程正在运行。如 Nginx、数据库等常驻后台的服务。
      exited服务成功执行单次任务后退出。如定时任务或脚本。
      waiting服务已启动,正在等待特定事件。如插拔设备。
      inactive服务未运行,完全停止状态。未启动或已停止的服务。
      failed服务启动失败(需排查日志:journalctl -u 服务名)。配置错误、依赖缺失或端口冲突。
      activating服务正在启动过程中(如执行 ExecStartPre 脚本)。启动耗时较长的服务。
      deactivating服务正在停止过程中。执行复杂停止脚本的服务。
      reloading服务正在重新加载配置(主进程未重启)。执行 systemctl reload 服务名 时。
      maintenance服务处于维护模式(需人工干预)。数据库修复或文件系统检查。

    服务启用与禁用

    1. 设置开机自启
      sudo systemctl enable <服务名>
    2. 禁止开机自启
      sudo systemctl disable <服务名>
    3. 检查是否启用
      systemctl is-enabled <服务名>
      返回 enabled 或 disabled

    系统状态查看

    1. 列出所有活动服务
      systemctl list-units --type=service --state=running
      • --all 显示包括inactive的所有单元
    2. 查看失败的服务
      systemctl --failed
      快速定位启动故障
    3. 服务是否活跃
      systemctl is-active <服务名>
      返回 active (运行中) 或 inactive (未运行)

    日志与故障排查

    1. 查看服务日志
      journalctl -u <服务名>
      结合 -f 实时跟踪(如 journalctl -u sshd -f)
    2. 筛选时间范围
      journalctl -u <服务名> --since "2024-01-01" --until "2024-01-02"

    进阶操作

    1. 重新加载 systemd 配置
      sudo systemctl daemon-reload
      ⚠️ 修改服务文件(.service)后必须执行!

    2. 查看服务依赖关系
      systemctl list-dependencies <服务名>

    3. **挂起/恢复服务

      sudo systemctl suspend      # 挂起到内存(睡眠)
      sudo systemctl hibernate    # 挂起到磁盘(休眠)
      sudo systemctl hybrid-sleep # 混合休眠
      
    4. 重启系统
      sudo systemctl reboot

    5. 关机
      sudo systemctl poweroff


    关键提示

    • 服务名格式:通常为 xxx.service,但多数命令可省略 .service(如 nginx 等价于 nginx.service)。
    • 权限要求:服务启停/启用需 sudo 或 root 权限。
    • 配置路径:服务文件位于 /etc/systemd/system/(自定义)或 /usr/lib/systemd/system/(系统默认)。

    常用组合示例

    # 启用并立即启动 Nginx
    sudo systemctl enable --now nginx
    
    # 检查失败服务并查看日志
    systemctl --failed
    journalctl -xe -u <失败的服务名>
    
    # 列出所有已启用的服务
    systemctl list-unit-files --state=enabled
    

12. hostnamectl

  • 查看当前主机名设置

    hostnamectl status
    
  • 修改主机名(推荐)

    sudo hostnamectl set-hostname 新主机名
    # 可能需要修改 /etc/hosts
    # 找到类似 127.0.1.1 旧主机名 的行,将旧主机名替换为新主机名
    
  • 修改主机名(确保一致性)

    # 修改 /etc/hostname 文件
    sudo vim /etc/hostname  # 删除旧名称,写入新主机名后保存
    
    # 更新 /etc/hosts 文件,避免本地解析错误
    sudo vim /etc/hosts
    # 找到类似 127.0.1.1 旧主机名 的行,将旧主机名替换为新主机名
    
    • 之后可能需要重启系统才能彻底生效
      sudo reboot
      
      # 或仅重启部分服务(临时生效)
      sudo systemctl restart systemd-hostnamed
      
  • 验证

    hostnamectl  # 查看 "Static hostname" 字段
    或
    hostname     # 直接输出当前主机名
    或
    cat /etc/hostname  # 检查配置文件
    

13. 环境变量

  1. 显示所有环境变量

    printenv   # 或使用 env
    

    输出示例:

    PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
    HOME=/home/user
    LANG=en_US.UTF-8
    ...
    
  2. 查看特定环境变量

    echo $PATH      # 查看PATH变量
    echo $HOME      # 查看用户主目录路径
    

14. sudo

  • 需要 sudo shell 的时候,优先用 sudo -i

  • 需要完整 root 环境的时候,使用 su -

在Linux系统中,普通用户切换到root用户的常见方式有su、su -和sudo命令,它们在环境变量继承、工作目录切换、安全性上有显著区别。以下是详细对比及其与环境变量的关系:


1. su (Switch User)

  • 命令:su
  • 行为:
    • 切换到root身份,保留当前用户的环境变量(如PATH, HOME, PWD等)。
    • 不切换工作目录(仍在原目录)。
    • 需要输入root密码。
  • 环境变量影响:
    # 切换前用户的环境变量会被保留
    $ echo $PATH
    /home/user/.local/bin:/usr/local/bin:/usr/bin:/bin
    
    $ su
    Password:  # 输入root密码
    # echo $PATH  # 仍为原用户的PATH
    
  • 风险:可能导致root使用普通用户的配置(如PATH包含不安全路径),存在安全隐患。

2. su - (Login Shell)

  • 命令:su - 或 su -l
  • 行为:
    • 模拟root登录,完全加载root的环境变量(如/root/.bashrc)。
    • 工作目录切换到/root。
    • 需要输入root密码。
  • 环境变量影响:
    $ su -
    Password:  # 输入root密码
    # echo $PATH
    /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin  # root的PATH
    # pwd
    /root  # 目录切换
    
  • 优点:环境干净,避免普通用户配置污染root。

3. sudo (Superuser Do)

  • 命令:sudo <command> 或 sudo -i

  • 行为:

    • 不切换用户,以root权限执行单条命令(sudo <command>)。
    • sudo -i模拟登录root,加载root环境(类似su -)。
    • 需要输入当前用户的密码(而非root密码),权限由/etc/sudoers控制。
  • 环境变量影响:

    • 默认继承部分环境变量(可通过env_reset配置重置)。
    • 通过/etc/sudoers的env_keep可指定保留的变量(如PATH)。
    $ sudo echo $PATH  # 继承原用户的PATH
    /home/user/.local/bin:...
    
    $ sudo -i
    # echo $PATH  # 使用root的PATH
    /usr/local/sbin:...
    
  • 安全性优势:

    • 细粒度权限控制(允许特定命令)。
    • 所有操作被记录(/var/log/auth.log)。
    • 避免共享root密码。

关键区别总结

命令密码要求环境变量工作目录安全性典型场景
suroot密码保留原用户环境不变低(环境污染)临时获取root权限(不推荐)
su -root密码加载root环境切换到/root中需要完整root环境
sudo <cmd>当前用户密码默认继承或重置不变高(可审计)单条特权命令
sudo -i当前用户密码加载root环境切换到/root高需要root shell

环境变量如何被继承?

  1. su
    • 调用非登录Shell,继承当前Shell的环境变量(由/etc/profile、~/.bashrc等初始化)。
  2. su -
    • 调用登录Shell,按顺序加载:
      /etc/profile → /etc/profile.d/* → ~/.bash_profile → ~/.bashrc。
    • 完全重置环境。
  3. sudo
    • 默认行为由/etc/sudoers中的配置决定:
      • env_reset:重置环境为安全的最小集。
      • env_keep:显式保留指定变量(如LANG, DISPLAY)。
    • 示例保留PATH:
      # /etc/sudoers
      Defaults env_keep += "PATH"
      

最佳实践

  1. 优先使用sudo
    • 避免直接使用root账户,降低误操作风险。
    • 通过visudo配置精细权限(如允许特定用户重启服务)。
  2. 需要完整root环境时
    • 用sudo -i替代su -(更安全且无需共享root密码)。
  3. 避免使用裸su
    • 环境变量污染可能导致命令执行异常(如PATH包含用户目录)。

📌 注意:环境变量(如PATH)直接影响命令查找路径。若root的PATH包含非安全路径(如.或用户目录),可能触发恶意程序执行。


15. 防火墙

Ubuntu 默认防火墙:ufw (Uncomplicated Firewall),ufw 是 Ubuntu 默认的防火墙前端工具,基于底层的 iptables/nftables,旨在简化配置。

ufw 常用命令示例

  1. 启用/禁用防火墙

    sudo ufw enable    # 启用防火墙
    sudo ufw disable   # 禁用防火墙
    
  2. 允许/拒绝端口

    sudo ufw allow 22          # 允许 SSH 端口 (TCP)
    sudo ufw allow ssh         # 允许特定服务
    sudo ufw allow 80/tcp      # 允许 HTTP (TCP)
    sudo ufw allow 80:88/tcp   # 允许特定端口范围 HTTP (TCP)
    sudo ufw deny 3306         # 拒绝 MySQL 端口
    sudo ufw allow from 192.168.1.0/24  # 允许特定子网访问
    
  3. 删除规则

    sudo ufw delete allow 22   # 删除允许端口 22 的规则
    # 或者
    sudo ufw status numbered   # 显示带编号的规则
    sudo ufw delete [编号]      # 根据编号删除规则
    
  4. 查看状态

    sudo ufw status verbose    # 查看详细规则列表
    
    # 查看允许的服务列表
    sudo ufw app list
    sudo ufw info PROFILE     # 上方命令输出的`Available applications`就是`PROFILE`
    
  5. 重置防火墙

    sudo ufw reset  # 重置所有规则(需确认)
    

其他常用防火墙工具

  1. iptables

    • Linux 传统防火墙,直接操作内核 Netfilter。

    • 特点:功能强大但配置复杂。

    • 示例:

      sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT  # 允许 SSH
      
  2. nftables

    • iptables 的现代替代品,更高效且语法统一。

    • Ubuntu 默认后端(ufw 实际使用 nftables 作为底层)。

    • 示例:

      sudo nft add rule inet filter input tcp dport 22 accept
      
  3. firewalld

    • 红帽系发行版默认工具(CentOS/RHEL),支持动态更新。

    • Ubuntu 需手动安装:

      sudo apt install firewalld
      

快速查看当前使用的防火墙

方法 1:检查活动服务

sudo systemctl status ufw firewalld --no-pager
  • 若 ufw 显示 active (exited),则正在使用。
  • 若 firewalld 显示 active (running),则使用 firewalld。

方法 2:检查进程和端口

# 检查 ufw 是否运行
ps aux | grep ufw

# 检查 firewalld 是否运行
systemctl is-active firewalld

# 检查底层工具(Ubuntu 22.04+ 默认用 nftables)
sudo nft list ruleset  # 有输出则使用 nftables
sudo iptables -L      # 有规则则可能使用 iptables

方法 3:验证默认工具

sudo ufw status | grep Status  # 若返回 "Status: active" 则使用 ufw

16. shutdown

⚡ 1. 关闭所有程序并正常关机

shutdown -h now
# 重启
shutdown -r now
  • -h 表示停机(Halt),now 表示立即执行。
  • 特点:系统会向所有登录用户发送关机警告,安全结束进程后关机。

⏰ 2. 指定时间后关闭所有程序并关机

shutdown -h +30    # 30分钟后关机
shutdown -h 22:00  # 晚上10点关机
# 重启
shutdown -r +30
  • 时间格式:
    • +m:m 分钟后执行(如 +10)。
    • HH:MM:指定具体时间(24小时制)。
  • 执行前会向所有用户广播通知。

⚠️ 3. 强制立即关机(不结束进程)

sudo poweroff -f
  • -f 参数强制跳过进程结束流程。
  • 风险:未保存的数据将丢失!仅限紧急情况使用。

⚠️ 4. 强制立即重启(不结束进程)

sudo reboot -f
  • 同样通过 -f 跳过安全终止进程步骤。
  • 可能造成数据损坏或文件系统错误。

📌 关键注意事项:

  1. 权限要求:所有命令需 sudo 或 root 权限执行。

  2. 取消定时任务:若设置了定时关机/重启,可通过 shutdown -c 取消。

  3. 强制命令风险:poweroff -f 和 reboot -f 会直接切断电源,仅限系统无响应时使用。

  4. 进程结束机制:

    • 正常关机 (shutdown) 会发送 SIGTERM 信号通知进程退出,超时后再发 SIGKILL 强制终止。
  • 强制命令直接触发硬件级断电。

💡 建议优先使用 shutdown 命令保障数据安全,紧急情况才用 -f 参数。定时任务可结合 cron 实现自动化管理。


97. shell

特性bash (Bourne-Again SHell)sh (Bourne Shell)
定位sh 的增强扩展,Linux 默认 Shell原始的 Unix Shell,POSIX 标准的基础
功能支持命令历史、Tab 补全、数组、算术运算等高级特性仅支持基础功能,语法更严格
脚本兼容性可运行 sh 脚本,但扩展语法可能不兼容其他 Shell严格遵循 POSIX 标准,脚本可移植性高
符号链接关系在多数系统中,/bin/sh → /bin/dash(轻量兼容)实际是 dash 或 bash 的兼容模式
使用场景交互式命令行、复杂脚本开发系统启动脚本(需高兼容性)、嵌入式环境

关键示例:

  • 若脚本以 #!/bin/sh 开头,即使系统默认 Shell 是 bash,也会以 sh 模式运行(禁用 bash 扩展)。

  • 测试命令差异:

    echo {1..3}    # bash 输出:1 2 3(支持花括号扩展)
    echo {1..3}    # sh 中可能报错(无此语法)
    
  1. 查看当前 Shell:

    echo $SHELL    # 显示默认 Shell
    echo $0        # 显示当前会话的 Shell
    
  2. 切换 Shell(临时):

    bash   # 启动 bash 子会话
    zsh    # 切换到 zsh
    
  3. 永久修改默认 Shell:

    chsh -s /bin/zsh   # 将 zsh 设为默认(需重启终端)
    

98. nginx

server {
	listen 5556;
		location / {
		try_files $uri $uri/ @router /index.html;
		root D:\WorkSpace\ZS\zsmh-portal;
	}
    	
	# 后端的api
	location /port {
		proxy_pass http://localhost:20002/port;
		proxy_set_header HOST $host;  # 不改变源请求头的值
		proxy_pass_request_body on;  #开启获取请求体
		proxy_pass_request_headers on;  #开启获取请求头
		proxy_set_header X-Real-IP $remote_addr;   # 记录真实发出请求的客户端IP
		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  #记录代理信息
	}
    
    # 如果最后有斜杠,则静态html页面里 ./img/a.png 就会根据/industrial_map/路径请求
    location /industrial_map/ {
        proxy_pass http://localhost:5557/;
    }
# 如果最后没有斜杠,则静态html页面里 ./img/a.png 就会根据/路径请求,就会导致资源找不到
# 如果浏览器访问的localhost/industrial_map,js 上的src="./a.js"可以解决问题,但css中 background: url(./home/images/screen/bg.png) no-repeat; 这种还是会根据/匹配,
location /industrial_map {
    proxy_pass http://localhost:5557/;
}


# 当您使用 try_files 指令时,其中的路径是相对于 root 指令定义的根目录的。
# 因此,如果您的根目录是 D:\WorkSpace\ZS\zsdp-industrialMap,那么您需要在 try_files 中指定相对于该目录的路径。
server {
	listen 5557;
		location / {
		try_files $uri $uri/ @router /index3.html;
		root D:\WorkSpace\ZS\zsdp-industrialMap;
		index index3.html;
	}

}

99. docker

  • 进入镜像的bash命令内

    docker exec -it my-container /bin/bash
    
  • 动态输出日志

    docker logs -f fanzichan
    
  • 关键字查询日志,关键字(-B)前0行 & (-A)后50行

    docker logs -f fanzichan | grep -B 0 -A 50 NullPointerException
    
  • 直接查看最后100行并动态链接

    docker logs -f -t --tail=100 fanzichan
    
    
  • 导出mysql日志

    docker exec -it 2bbb378619c6 mysqldump -uroot -p123456 fzc_dev > /home/fzc_dev_dump.sql
    
    
  • less

    # less -N带行号 +G跳转到最后一行 -p根据关键字 -j前25行 -z后30行 文件名称
    less -N +G -p 关键字 -j25 -z30 your_file.txt
    
    • 关键字搜索:less内按下/ 输入关键字,如 / talent;也可以直接在命令中设置:

      less -N +G your_file.txt +/talent
      
    • 执行命令 F,可以实现类似 tail -f 的效果(实时刷新,按Ctrl+C退出到less状态)

  • MySQL配置

    • 直接修改容器内的 my.cnf;如果你已经知道 MySQL 容器内 my.cnf 的路径,你可以使用以下命令将其复制到本地进行编辑:
    • 先从容器中复制 my.cnf 文件到本地
      docker cp mysql-container:/etc/mysql/my.cnf /path/to/local/my.cnf
    
  • 在本地编辑 my.cnf 文件

      vim /path/to/local/my.cnf
    
  • 将修改后的 my.cnf 文件复制回容器

      docker cp /path/to/local/my.cnf mysql-container:/etc/mysql/my.cnf
    
  • 修改docker的mysql配置并重启

      # 拷贝原本的配置文件出来,并修改
      # ...
      # 进入容器(容器名root_mysql_1)
      docker exec -it root_mysql_1 /bin/bash
      # 拷贝文件到容器内
      docker cp my_custom.cnf root_mysql_1:/etc/mysql/conf.d/my_custom.cnf
      # 重启容器
      docker resatrt root_mysql_1
    

998. 系统日志

所有系统日志的默认存储位置,包含以下关键文件:

日志文件用途说明
/var/log/messages综合系统日志:记录内核、系统服务(如cron、mail)、启动信息等(常见于RHEL/CentOS)。
/var/log/syslog系统运行日志:功能类似 messages,常见于Debian/Ubuntu。
/var/log/auth.log认证日志:记录用户登录(SSH/Su)、权限验证、sudo操作等(Debian/Ubuntu)。
/var/log/secure安全日志:功能同 auth.log,用于RHEL/CentOS/Fedora。
/var/log/dmesg内核环缓冲日志:记录系统启动时的硬件检测、驱动加载信息(可通过 dmesg 命令查看)。
/var/log/kern.log内核专用日志:记录内核错误、警告及调试信息。
/var/log/cron计划任务日志:记录cron定时任务的执行情况。
/var/log/boot.log系统启动日志:记录启动过程中的服务初始化状态。

可以参考ssh登录日志开查看日志。

其他重要日志

  • 服务专用日志
    • Web服务器:/var/log/nginx/(Nginx)或 /var/log/apache2/(Apache)。
    • 数据库:/var/log/mysql/(MySQL)或 /var/log/postgresql/(PostgreSQL)。
  • 审计日志
    • /var/log/audit/audit.log:记录安全审计事件(需安装 auditd 服务)。
  • 用户登录历史
    • /var/log/wtmp:记录用户登录/登出时间(通过 last 命令查看)。
    • /var/log/lastlog:记录每个用户最后一次登录时间(通过 lastlog 命令查看)。

999. MobaXterm没有颜色

Ubuntu 通过 MobaXterm 连接时命令行无颜色,通常是由于 Shell 环境配置(尤其是 ~/.bashrc)未正确启用颜色支持或终端兼容性问题导致。以下是系统化的解决方案:


🔧 一、检查并启用 ~/.bashrc 中的颜色配置

  1. 编辑配置文件
    在终端中执行以下命令:

    vim ~/.bashrc
    
    • 找到 #force_color_prompt=yes,删除开头的 # 取消注释,改为:
    force_color_prompt=yes
    
    • 检查是否启用 ls 颜色:
    alias ls='ls --color=auto'  # 确保此行存在且未注释
    export CLICOLOR=1           # 可选,增强颜色支持
    
  2. 应用配置变更
    保存文件后执行:

    source ~/.bashrc  # 立即生效
    

⚙️ 二、检查 MobaXterm 终端设置

  1. 确认终端类型

    • 在 MobaXterm 会话窗口中输入:
    echo $TERM
    
    • 正常应返回 xterm-256color 或 xterm。若为 dumb,需修改 MobaXterm 设置:
      Settings → Configuration → Terminal → 将 Terminal type 改为 xterm-256color 。
  2. 启用 ANSI 颜色支持
    在 MobaXterm 的会话设置中勾选:
    Terminal features → Enable ANSI colors 。


🔍 三、验证工具级颜色配置
部分命令需单独启用颜色:

  • grep 命令:
    alias grep='grep --color=auto'  # 添加到 ~/.bashrc
    
  • ls 命令:
    若仍无颜色,手动执行:
    ls --color=auto
    
    若显示颜色,说明 alias 配置未生效,需重新检查 ~/.bashrc 。

⚠️ 四、排查用户环境问题

  • 新创建用户:
    若为新用户,确认其家目录下是否存在 .bashrc 文件。若缺失,从 /etc/skel/ 复制模板:
    cp /etc/skel/.bashrc ~/
    source ~/.bashrc
    
  • 配置文件冲突:
    检查 ~/.bash_profile 或 ~/.profile 是否覆盖了配置,可添加:
    if [ -f ~/.bashrc ]; then . ~/.bashrc; fi
    

💎 快速检查清单

步骤命令/操作验证方式
取消注释颜色配置force_color_prompt=yessource ~/.bashrc 后提示符变绿
设置终端类型MobaXterm → Terminal type: xterm-256colorecho $TERM 输出正确值
启用 ANSI 颜色MobaXterm → Enable ANSI colors执行 ls --color=auto 显示彩色
检查新用户配置复制 /etc/skel/.bashrc 到用户目录新终端会话颜色生效

通过上述步骤,99% 的 MobaXterm 无颜色问题可解决。若需进一步个性化颜色(如提示符文字/背景色),可参考 ~/.bashrc 中的 PS1 变量及 ANSI 颜色代码(例如 \e[32m 代表绿色)。

需要跳转的地方:<a name="divtop"> 我是目标位置 </a>
定义锚记:[跳转指定位置](#divtop)

也可以根据标题跳转:[跳转到三级标题1](###三级标题名称)
cat *.dat | grep'23000030404'
最近更新: 2025/12/25 13:57
Contributors: Enlin
Prev
FFmpeg
Next
Git