首页
Search
1
Armbian ARM64 搭建 MATE + TigerVNC + noVNC + XRDP + 中文输入法 + Cloudflare Tunnel 完整教程
14 阅读
2
RHEL/CentOS 7.9 Chrony 时间同步服务
7 阅读
3
Linux 常用命令速查手册
5 阅读
4
使用私有 CA 为内网 IP 签发 TLS 服务器证书
3 阅读
5
CentOS 7.9 + 宝塔 + FRP 自建内网穿透:公网访问 Armbian noVNC 与 1Panel
3 阅读
默认分类
服务器
VMware
vSphere
Linux
Windows
数据库
登录
Search
agblr
累计撰写
7
篇文章
累计收到
0
条评论
首页
栏目
默认分类
服务器
VMware
vSphere
Linux
Windows
数据库
页面
搜索到
7
篇与
的结果
2026-09-19
CentOS 7.9 + 宝塔 + FRP 自建内网穿透:公网访问 Armbian noVNC 与 1Panel
一、需求背景目前有两台服务器:公网服务器系统环境:CentOS 7.9.2009 x86_64 宝塔面板 Nginx 公网 IP用途:部署 FRP 服务端 frps作为公网入口使用宝塔 Nginx 配置域名使用 HTTPS 访问内网服务内网设备系统环境:Armbian 23.02.2 Jammy Ubuntu 22.04目前运行:noVNC: 127.0.0.1:6081 1Panel: 127.0.0.1:2333目标:https://vnc.agblr.xyz ↓ 访问 Armbian noVNC https://a.agblr.xyz ↓ 访问 Armbian 1Panel并且内网的 6081、2333 不直接暴露到公网。二、最终架构整体架构如下: Internet │ ▼ Cloudflare / DNS │ ▼ CentOS 公网服务器 宝塔 + Nginx :80 / :443 │ ┌─────────────┴─────────────┐ │ │ ▼ ▼ 127.0.0.1:16081 127.0.0.1:2333 noVNC代理 1Panel代理 │ │ └────────── FRPS ───────────┘ │ :7000 │ Internet │ FRPC │ ┌────────┴────────┐ │ │ ▼ ▼ 127.0.0.1:6081 127.0.0.1:2333 noVNC 1Panel │ └──── Armbian ────公网只需要开放:80/TCP 443/TCP 7000/TCPFRP 映射出来的:16081 2333只监听:127.0.0.1因此无法直接从公网通过:公网IP:16081 公网IP:2333访问。三、为什么不用宝塔 FRP 插件最开始尝试使用宝塔的 FRP 管理器,但报错:AttributeError: module 'public' has no attribute 'get_server_ip'完整关键位置:self.config['serveraddr'] = public.get_server_ip()原因是:宝塔版本:7.9.2 CentOS:7.9.2009 Python:3.7.9FRP 插件调用了旧版宝塔 API:public.get_server_ip()而当前宝塔代码中已经不存在该接口。因此最终放弃宝塔 FRP 插件,改为:FRP 手动安装 + systemd 管理 + 宝塔只负责 Nginx / 域名 / HTTPS这种方式也更加稳定。四、CentOS 安装 FRP 服务端创建目录:mkdir -p /www/server/frp cd /www/server/frp下载 FRP:wget gh-proxy.com/https://github.com/fatedier/frp/releases/download/v0.70.1/frp_0.70.1_linux_amd64.tar.gz解压:tar -zxf frp_0.70.1_linux_amd64.tar.gz复制 frps:cp frp_0.70.1_linux_amd64/frps /www/server/frp/frps chmod 755 /www/server/frp/frps验证:/www/server/frp/frps --version输出:0.70.1说明安装成功。五、一个实际踩过的坑:下载文件损坏第一次下载时,由于目录里已经有同名文件,wget 实际把新的完整文件保存为了:frp_0.70.1_linux_amd64.tar.gz.1但后续却执行:tar -zxf frp_0.70.1_linux_amd64.tar.gz导致解压的是旧的残缺文件。报错:gzip: stdin: unexpected end of file tar: Unexpected EOF in archive tar: Error is not recoverable随后复制出来的 frps 也不完整:/www/server/frp/frps --version直接出现:Segmentation fault解决方法是删除旧文件重新下载:rm -rf /www/server/frp/*重新下载、解压后:/www/server/frp/frps --version正常返回:0.70.1以后遇到类似问题可以先检查:ls -lh以及:gzip -t frp_0.70.1_linux_amd64.tar.gz如果 gzip -t 没有输出,一般说明 gzip 文件完整。六、配置 FRP 服务端生成一个随机 Token:openssl rand -hex 32例如:52ba40b2e66447009793152b1fe5aa03ba175bed401bfde15922e8969925d831实际使用时请使用自己生成的 Token。创建:vi /www/server/frp/frps.toml配置:bindAddr = "0.0.0.0" bindPort = 7000 proxyBindAddr = "127.0.0.1" auth.method = "token" auth.token = "替换成自己的TOKEN" allowPorts = [ { single = 16081 }, { single = 2333 } ]这里有两个比较重要的地方。proxyBindAddrproxyBindAddr = "127.0.0.1"意味着 FRP 客户端映射出来的端口只监听:127.0.0.1不会变成:0.0.0.0这样可以避免 16081 和 2333 直接暴露公网。allowPortsallowPorts = [ { single = 16081 }, { single = 2333 } ]限制客户端只允许申请:16081 2333避免 FRP 客户端随意创建其他公网映射。七、验证 FRP 服务端配置执行:/www/server/frp/frps verify -c /www/server/frp/frps.toml如果没有配置错误即可继续。八、配置 systemd创建:vi /etc/systemd/system/frps.service内容:[Unit] Description=FRP Server After=network-online.target Wants=network-online.target [Service] Type=simple ExecStart=/www/server/frp/frps -c /www/server/frp/frps.toml Restart=always RestartSec=5 [Install] WantedBy=multi-user.target加载:systemctl daemon-reload设置开机启动:systemctl enable --now frps检查:systemctl status frps --no-pager -l检查监听:ss -lntp | grep 7000正常应该看到:0.0.0.0:7000九、开放 FRP 服务端端口CentOS firewalld:firewall-cmd --permanent --add-port=7000/tcp firewall-cmd --reload宝塔安全页面也允许:TCP 7000如果使用腾讯云、阿里云等,还需要在云服务器安全组开放:TCP 7000注意:16081 2333不需要开放。十、Armbian 安装 FRP 客户端先查看 CPU 架构:uname -m如果:aarch64则使用 ARM64 版本。创建目录:mkdir -p /opt/frp cd /opt/frp下载:wget gh-proxy.com/https://github.com/fatedier/frp/releases/download/v0.70.1/frp_0.70.1_linux_arm64.tar.gz解压:tar -zxf frp_0.70.1_linux_arm64.tar.gz复制:cp frp_0.70.1_linux_arm64/frpc /opt/frp/frpc chmod 755 /opt/frp/frpc验证:/opt/frp/frpc --version应该显示:0.70.1十一、确认内网服务noVNC:ss -lntp | grep 6081确认:127.0.0.1:6081测试:curl -I http://127.0.0.1:60811Panel:ss -lntp | grep 2333确认:127.0.0.1:2333十二、配置 FRP 客户端创建:nano /opt/frp/frpc.toml内容:serverAddr = "CentOS公网IP" serverPort = 7000 auth.method = "token" auth.token = "和CentOS完全相同的TOKEN" [[proxies]] name = "novnc" type = "tcp" localIP = "127.0.0.1" localPort = 6081 remotePort = 16081 [[proxies]] name = "1panel" type = "tcp" localIP = "127.0.0.1" localPort = 2333 remotePort = 2333最终映射关系:Armbian 127.0.0.1:6081 → CentOS 127.0.0.1:16081以及:Armbian 127.0.0.1:2333 → CentOS 127.0.0.1:2333十三、启动 FRP 客户端测试先检查:/opt/frp/frpc verify -c /opt/frp/frpc.toml前台运行:/opt/frp/frpc -c /opt/frp/frpc.toml成功后,在 CentOS 上执行:ss -lntp | grep -E '16081|2333'应该看到:127.0.0.1:16081 127.0.0.1:2333测试 noVNC:curl -I http://127.0.0.1:16081测试 1Panel:curl -I http://127.0.0.1:2333只要有正常 HTTP 响应,FRP 就已经打通。十四、Armbian 设置 frpc 开机启动创建:vi /etc/systemd/system/frpc.service内容:[Unit] Description=FRP Client After=network-online.target Wants=network-online.target [Service] Type=simple ExecStart=/opt/frp/frpc -c /opt/frp/frpc.toml Restart=always RestartSec=5 [Install] WantedBy=multi-user.target执行:systemctl daemon-reload systemctl enable --now frpc检查:systemctl status frpc --no-pager -l查看实时日志:journalctl -u frpc -f服务端日志:journalctl -u frps -f十五、宝塔配置 noVNC 域名例如使用:vnc.agblr.xyz vnc.23332048.xyz将域名解析到:CentOS公网IP然后创建宝塔站点。noVNC 的 Nginx 配置可以使用:server { listen 80; server_name vnc.agblr.xyz vnc.23332048.xyz; root /www/wwwroot/vnc.agblr.xyz; location ^~ /.well-known/acme-challenge/ { root /www/wwwroot/vnc.agblr.xyz; allow all; } location / { proxy_pass http://127.0.0.1:16081; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_connect_timeout 30s; proxy_read_timeout 3600s; proxy_send_timeout 3600s; proxy_buffering off; proxy_cache off; } access_log /www/wwwlogs/vnc.agblr.xyz.log; error_log /www/wwwlogs/vnc.agblr.xyz.error.log; }其中最重要的是:proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade";因为 noVNC 使用 WebSocket。如果没有这几行,很可能出现:网页可以打开 但是 VNC 无法连接 WebSocket connection failed十六、宝塔配置 1Panel 域名例如:a.agblr.xyz a.23332048.xyz对应:127.0.0.1:2333配置:server { listen 80; server_name a.agblr.xyz a.23332048.xyz; index index.php index.html index.htm default.php default.htm default.html; root /www/wwwroot/a.agblr.xyz; #SSL-START #error_page 404/404.html; #SSL-END #ERROR-PAGE-START #error_page 404 /404.html; #error_page 502 /502.html; #ERROR-PAGE-END location ^~ /.well-known/acme-challenge/ { root /www/wwwroot/a.agblr.xyz; allow all; } location / { proxy_pass http://127.0.0.1:2333; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-Host $host; proxy_connect_timeout 30s; proxy_send_timeout 3600s; proxy_read_timeout 3600s; proxy_buffering off; proxy_cache off; proxy_request_buffering off; client_max_body_size 1024m; } location ~ ^/(\.user.ini|\.htaccess|\.git|\.svn|\.project|LICENSE|README.md) { return 404; } access_log /www/wwwlogs/a.agblr.xyz.log; error_log /www/wwwlogs/a.agblr.xyz.error.log; }之所以同样保留 WebSocket,是因为 1Panel 的:SSH终端 容器终端 实时日志等功能都可能依赖 WebSocket。十七、检查 Nginx 配置每次修改完都先执行:/www/server/nginx/sbin/nginx -t如果显示:syntax is ok test is successful再重新加载:/www/server/nginx/sbin/nginx -s reload不要直接重启 Nginx。这样即使配置写错,也不会直接把现有网站全部打断。十八、曾遇到的 Nginx 报错遇到过:nginx: [emerg] "location" directive is not allowed here原因是把:location / { }写到了:server { }外面。Nginx 正确结构必须是:server { listen 80; server_name example.com; location / { ... } }不能:location / { } server { }十九、Cloudflare 域名如何访问 noVNC如果另有一个域名:xxx.com托管在 Cloudflare,可以让它访问相同的 noVNC。Cloudflare DNS:类型:A 名称:@ 内容:CentOS公网IP 代理状态:已代理(橙色云)访问:https://xxx.com时,浏览器实际上还是访问:Cloudflare :443 → CentOS Nginx :443然后由 Nginx 再反代到:127.0.0.1:16081这是正常行为。DNS 本身只负责:域名 → IPDNS 不负责:域名 → IP:端口所以不能配置:xxx.com → CentOSIP:16081二十、CNAME 能不能用可以。例如:xxx.com CNAME vnc.agblr.xyz但是要注意:CNAME 只是 DNS 别名。访问:https://xxx.com时 HTTP Host 仍然是:xxx.com不会自动变成:vnc.agblr.xyz因此 Nginx 仍然需要:server_name vnc.agblr.xyz xxx.com;否则 Nginx 可能匹配到其他站点。同时 CNAME 不能写:vnc.agblr.xyz:16081也不能写:https://vnc.agblr.xyz/vnc.html因为 DNS 不理解端口和 URL 路径。二十一、URL 跳转与反向代理的区别如果只要求:访问 xxx.com然后浏览器地址变成:vnc.agblr.xyz可以使用 Cloudflare Redirect Rules。这种属于:301/302 跳转最终地址栏会发生变化。例如:https://xxx.com ↓ 302 ↓ https://vnc.agblr.xyz但是如果要求:访问 https://xxx.com 地址栏始终保持: https://xxx.com 实际访问: noVNC则应该使用:Nginx reverse_proxy而不是 URL 跳转。二十二、Cloudflare + noVNC 最终链路最终推荐:浏览器 │ │ HTTPS / WSS ▼ Cloudflare │ │ HTTPS ▼ CentOS 宝塔 Nginx │ │ HTTP + WebSocket ▼ 127.0.0.1:16081 │ ▼ FRPS │ ▼ FRPC │ ▼ Armbian 127.0.0.1:6081 │ ▼ noVNC如果使用 Cloudflare 橙色云,建议:SSL/TLS: Full (strict)同时源站也申请正常 HTTPS 证书。二十三、常用排错命令查看 FRPSsystemctl status frps日志:journalctl -u frps -f监听:ss -lntp | grep 7000查看 FRPCsystemctl status frpc日志:journalctl -u frpc -f查看映射端口CentOS:ss -lntp | grep -E '16081|2333'正常:127.0.0.1:16081 127.0.0.1:2333noVNC 测试CentOS:curl -I http://127.0.0.1:160811Panel 测试curl -I http://127.0.0.1:2333Nginx 检查/www/server/nginx/sbin/nginx -t重新加载:/www/server/nginx/sbin/nginx -s reload二十四、安全建议当前架构中最重要的安全设计是:proxyBindAddr = "127.0.0.1"因此:16081 2333没有直接暴露公网。公网真正开放的是:80 443 7000推荐继续保持这种模式:公网 ↓ Nginx ↓ 本机 FRP 映射端口而不要直接:公网IP:16081 公网IP:2333尤其是 1Panel 这种管理后台,更不建议直接暴露原始端口。另外建议:FRP 使用长随机 Token1Panel 开启安全入口1Panel 开启强密码或二次认证noVNC 本身设置 VNC 密码对管理后台增加访问限制宝塔开启 HTTPSCloudflare 使用 Full (strict)不对公网开放 16081 / 2333二十五、最终效果最终可以实现:https://vnc.agblr.xyz ↓ Armbian noVNChttps://a.agblr.xyz ↓ Armbian 1Panel如果 Cloudflare 还有:xxx.com也可以通过:A / CNAME + Nginx server_name让:https://xxx.com访问同一个 noVNC 服务。整个方案不依赖第三方免费内网穿透节点,核心链路全部自己控制:Armbian ↓ FRPC ↓ 自己的公网 CentOS ↓ FRPS ↓ 宝塔 Nginx ↓ 自己的域名相比共享式内网穿透,优势主要是:节点自己控制 带宽自己控制 延迟更加可控 不限隧道数量 不限自定义域名 不限第三方免费流量配额 支持 HTTPS 支持 WebSocket 容易排错对于 noVNC、1Panel、SSH Web Terminal 等需要长期稳定访问的服务,这种架构更加合适。
2026年09月19日
3 阅读
0 评论
0 点赞
2026-09-19
Armbian ARM64 搭建 MATE + TigerVNC + noVNC + XRDP + 中文输入法 + Cloudflare Tunnel 完整教程
一、环境与最终架构本文适用于:系统:Armbian 23.02.2 Jammy 基础系统:Ubuntu 22.04 LTS 架构:aarch64 / arm64 内存:4GB 存储:约 15GB eMMC 桌面:MATE 使用用户:root最终架构: Internet │ Cloudflare Tunnel │ ▼ 自己的域名 │ ▼ noVNC :6081 │ ▼ TigerVNC :5901 │ ▼ DISPLAY=:1 │ MATE Desktop │ ┌───────────────────┼─────────────────┐ │ │ │ XRDP Firefox Clash Verge :3389 Fcitx5拼音整个系统只维护:DISPLAY=:1一个真实桌面。RDP 和浏览器 noVNC 全部看同一个桌面。二、更换 Ubuntu / Armbian 下载源1. 确认架构uname -m dpkg --print-architecture正常:aarch64 arm642. 备份源cp -a /etc/apt/sources.list \ /etc/apt/sources.list.bak.$(date +%Y%m%d-%H%M%S)cp -a /etc/apt/sources.list.d/armbian.list \ /etc/apt/sources.list.d/armbian.list.bak.$(date +%Y%m%d-%H%M%S) \ 2>/dev/null || true3. Ubuntu ARM64 使用 USTCcat > /etc/apt/sources.list <<'EOF' deb https://mirrors.ustc.edu.cn/ubuntu-ports/ jammy main restricted universe multiverse deb https://mirrors.ustc.edu.cn/ubuntu-ports/ jammy-security main restricted universe multiverse deb https://mirrors.ustc.edu.cn/ubuntu-ports/ jammy-updates main restricted universe multiverse deb https://mirrors.ustc.edu.cn/ubuntu-ports/ jammy-backports main restricted universe multiverse EOF4. Armbian 使用台湾镜像cat > /etc/apt/sources.list.d/armbian.list <<'EOF' deb [signed-by=/usr/share/keyrings/armbian.gpg] http://mirror.twds.com.tw/armbian-apt jammy main jammy-utils jammy-desktop EOF注意:该源虽然比之前自动分配的 Netcup 节点好一些,但我们实测 Firefox 大文件仍可能只有几十 KB/s。所以 Firefox 后面不要从这个 Armbian 源下载安装。5. 更新apt clean rm -rf /var/lib/apt/lists/* apt updateUSTC 正常情况下应该能达到数 MB/s。三、安装 MATE / TigerVNC / XRDP / noVNC 基础组件apt install -y \ git wget curl gpg dbus-x11 \ xrdp \ tigervnc-standalone-server \ tigervnc-tools \ websockify \ mate-desktop-environment-core \ mate-terminal \ mate-system-monitor \ mate-utils \ mate-panel \ mate-applets \ caja \ caja-open-terminal \ mate-polkit \ mate-notification-daemon \ network-manager-gnome \ gnome-keyring \ at-spi2-core \ arc-theme \ papirus-icon-theme \ mate-applet-brisk-menu四、中文环境apt install -y \ language-pack-zh-hans \ language-pack-gnome-zh-hans \ fonts-noto-cjk \ fonts-wqy-microheilocale-gen zh_CN.UTF-8系统全局保持:cat > /etc/default/locale <<'EOF' LANG=en_US.UTF-8 LANGUAGE=en_US:en EOF不要设置全局:LC_ALL=zh_CN.UTF-8中文只在 MATE 桌面会话中启用。五、配置 MATEdbus-run-session -- gsettings set \ org.mate.session required-components-list \ "['windowmanager']"打开桌面:dbus-run-session -- gsettings set \ org.mate.background show-desktop-icons true主题:dbus-run-session -- gsettings set \ org.mate.interface gtk-theme 'Arc' dbus-run-session -- gsettings set \ org.mate.interface icon-theme 'Papirus' dbus-run-session -- gsettings set \ org.mate.Marco.general theme 'Arc'六、安装 Fcitx5 中文拼音apt install -y \ fcitx5 \ fcitx5-chinese-addons \ fcitx5-config-qt \ fcitx5-frontend-gtk3 \ fcitx5-frontend-qt5 \ im-config设置:im-config -n fcitx5创建目录:mkdir -p /root/.config/fcitx5 mkdir -p /root/.local/share/fcitx5/pinyin配置:cat > /root/.config/fcitx5/profile <<'EOF' [Groups/0] Name=默认 Default Layout=us DefaultIM=pinyin [Groups/0/Items/0] Name=pinyin Layout= [Groups/0/Items/1] Name=keyboard-us Layout= [GroupOrder] 0=默认 EOFShift 切中英文:cat > /root/.config/fcitx5/config <<'EOF' [Hotkey] EnumerateWithTriggerKeys=False EnumerateSkipFirst=False [Hotkey/TriggerKeys] 0=Control+space [Hotkey/AltTriggerKeys] 0=Shift_L 1=Shift_R [Behavior] ActiveByDefault=True EOF七、TigerVNC 常驻桌面设置密码mkdir -p /root/.vnc tigervncpasswd /root/.vnc/passwd chmod 600 /root/.vnc/passwd配置:cat > /root/.vnc/config <<'EOF' geometry=2160x1350 depth=24 localhost alwaysshared securitytypes=vncauth EOF绑定 root:grep -q '^:1=root$' /etc/tigervnc/vncserver.users \ || echo ':1=root' >> /etc/tigervnc/vncserver.users八、创建 MATE 桌面启动脚本cat > /usr/local/bin/mate-vnc-session.sh <<'EOF' #!/bin/bash export LANG=zh_CN.UTF-8 export LANGUAGE=zh_CN:zh:en_US:en export LC_MESSAGES=zh_CN.UTF-8 export XDG_SESSION_TYPE=x11 export XDG_CURRENT_DESKTOP=MATE export DESKTOP_SESSION=mate export GTK_IM_MODULE=fcitx export QT_IM_MODULE=fcitx export XMODIFIERS=@im=fcitx if ! pgrep -x fcitx5 >/dev/null 2>&1; then fcitx5 -d >/tmp/fcitx5.log 2>&1 & fi sleep 1 mate-session & MATE_PID=$! sleep 2 if ! pgrep -x mate-panel >/dev/null 2>&1; then mate-panel >/tmp/mate-panel-vnc.log 2>&1 & fi sleep 1 pkill -TERM -x caja 2>/dev/null || true sleep 1 caja \ --no-default-window \ --force-desktop \ >/tmp/caja-vnc.log 2>&1 & wait "$MATE_PID" EOFchmod +x /usr/local/bin/mate-vnc-session.sh bash -n /usr/local/bin/mate-vnc-session.sh无输出即正常。九、TigerVNC Sessioncat > /root/.vnc/Xtigervnc-session <<'EOF' #!/bin/bash export LANG=zh_CN.UTF-8 export LANGUAGE=zh_CN:zh:en_US:en export LC_MESSAGES=zh_CN.UTF-8 export XDG_SESSION_TYPE=x11 export XDG_CURRENT_DESKTOP=MATE export DESKTOP_SESSION=mate export XDG_RUNTIME_DIR=/run/user/0 mkdir -p "$XDG_RUNTIME_DIR" chmod 700 "$XDG_RUNTIME_DIR" unset SESSION_MANAGER unset DBUS_SESSION_BUS_ADDRESS exec dbus-run-session -- /usr/local/bin/mate-vnc-session.sh EOFchmod +x /root/.vnc/Xtigervnc-session十、安装 noVNCrm -rf /opt/novncgit clone \ --branch v1.3.0 \ --depth 1 \ https://github.com/novnc/noVNC.git \ /opt/novnc删除 Git 元数据:rm -rf /opt/novnc/.git创建首页:cat > /opt/novnc/index.html <<'EOF' <!doctype html> <html> <head> <meta charset="utf-8"> <meta http-equiv="refresh" content="0;url=/vnc.html?path=websockify&resize=scale&autoconnect=true"> <title>Remote Desktop</title> <script> location.replace('/vnc.html?path=websockify&resize=scale&autoconnect=true'); </script> </head> <body></body> </html> EOF服务:cat > /etc/systemd/system/novnc.service <<'EOF' [Unit] Description=noVNC Web Remote Desktop After=network-online.target tigervncserver@:1.service Wants=network-online.target tigervncserver@:1.service [Service] Type=simple ExecStart=/usr/bin/websockify --web=/opt/novnc 0.0.0.0:6081 127.0.0.1:5901 Restart=always RestartSec=2 [Install] WantedBy=multi-user.target EOF配置novnc自动复制粘贴:cat > /opt/novnc/clipboard-sync.js <<'EOF' import UI from "./app/ui.js"; let lastRemoteText = ""; let lastLocalText = ""; /* * 获取当前 RFB 实例 */ function getRFB() { if (!UI || !UI.rfb) { return null; } return UI.rfb; } /* * 本机浏览器剪贴板 -> 远程 TigerVNC */ async function syncLocalToRemote() { const rfb = getRFB(); if (!rfb) { return; } if (!navigator.clipboard || !navigator.clipboard.readText) { return; } try { const text = await navigator.clipboard.readText(); if (!text) { return; } /* * 避免远端刚同步回来的内容又循环发送 */ if (text === lastRemoteText || text === lastLocalText) { return; } lastLocalText = text; rfb.clipboardPasteFrom(text); console.debug("[noVNC Clipboard] Local -> Remote"); } catch (err) { /* * Firefox / Safari 或未授权时可能进入这里。 * Ctrl+V 的 paste 事件仍然可以工作。 */ console.debug( "[noVNC Clipboard] Cannot read browser clipboard:", err ); } } /* * 用户直接 Ctrl+V 时: * 浏览器剪贴板 -> 远程 * * 这是兼容性最好的一种方式, * 不依赖 navigator.clipboard.readText 权限。 */ window.addEventListener("paste", function (event) { const rfb = getRFB(); if (!rfb) { return; } let text = ""; if (event.clipboardData) { text = event.clipboardData.getData("text/plain"); } if (!text) { return; } lastLocalText = text; rfb.clipboardPasteFrom(text); /* * 防止 Ctrl+V 同时被远程系统再次当作键盘事件, * 避免重复粘贴。 */ event.preventDefault(); event.stopPropagation(); console.debug("[noVNC Clipboard] Paste -> Remote"); }, true); /* * 远程 TigerVNC -> 本机系统剪贴板 */ function hookRemoteClipboard() { const rfb = getRFB(); if (!rfb) { return; } /* * 防止重复绑定 */ if (rfb.__autoClipboardHooked) { return; } rfb.__autoClipboardHooked = true; rfb.addEventListener("clipboard", async function (event) { if (!event.detail) { return; } const text = event.detail.text; if (typeof text !== "string") { return; } lastRemoteText = text; if (!navigator.clipboard || !navigator.clipboard.writeText) { return; } try { await navigator.clipboard.writeText(text); console.debug( "[noVNC Clipboard] Remote -> Local" ); } catch (err) { /* * 浏览器拒绝后台写剪贴板时, * noVNC 原本的 Clipboard 面板仍然可以使用。 */ console.debug( "[noVNC Clipboard] Cannot write browser clipboard:", err ); } }); console.info( "[noVNC Clipboard] Automatic clipboard synchronization enabled" ); } /* * UI.rfb 是连接时才创建, * 所以定期检测并挂载事件。 */ setInterval(hookRemoteClipboard, 500); /* * 切回 noVNC 窗口时, * 尝试自动把电脑剪贴板同步给远程。 */ window.addEventListener("focus", function () { setTimeout(syncLocalToRemote, 100); }); /* * 鼠标重新点击 VNC 区域时也尝试同步 */ document.addEventListener("pointerdown", function () { syncLocalToRemote(); }, { passive: true }); EOFsed -i '/<\/head>/i \ <script type="module" src="./clipboard-sync.js"></script>' /opt/novnc/vnc.html十一、配置 XRDP 共用 TigerVNC备份:cp -a /etc/xrdp/xrdp.ini \ /etc/xrdp/xrdp.ini.bak确认:find /usr/lib -name libvnc.so然后:python3 - <<'PY' from pathlib import Path import re p = Path("/etc/xrdp/xrdp.ini") text = p.read_text() for section in ("Xorg", "GEA-Desktop"): pattern = rf'(?ms)^\[{re.escape(section)}\]\s*\n.*?(?=^\[|\Z)' text = re.sub(pattern, '', text) text = re.sub(r'(?m)^autorun=.*$', 'autorun=', text) vnc = """[Xorg] name=GEA-Desktop lib=libvnc.so ip=127.0.0.1 port=5901 username=na password=ask code=0 delay_ms=2000 """ pos = text.find("[Channels]") if pos >= 0: text = text[:pos] + vnc + text[pos:] else: text += "\n" + vnc p.write_text(text) PY检查:grep -A10 '^\[Xorg\]' /etc/xrdp/xrdp.ini十二、开启远程桌面服务systemctl daemon-reload systemctl enable tigervncserver@:1.service systemctl enable novnc.service systemctl enable xrdp.service systemctl enable xrdp-sesman.servicesystemctl restart tigervncserver@:1.service sleep 4 systemctl restart novnc.service systemctl restart xrdp.service检查:ss -lntp | grep -E '3389|5901|6081'应该:*:3389 127.0.0.1:5901 0.0.0.0:6081十三、安装 Clash Verge Rev —— 完整版为什么要先装 Clash当前实际网络测试说明:USTC Ubuntu 源 几 MB/s Armbian 大文件 十几~几百 KB/s GitHub Release 直连 几十 KB/s GitHub 经 gh-proxy 约 5~6 MB/s因此后面的 Firefox 官方下载需要 Clash 帮忙。Clash Verge Rev 官方当前 v2.5.2 提供 Linux ARM64 .deb。1. 下载 Clash Verge Rev ARM64进入桌面目录:cd /root/Desktop使用 GitHub 加速:wget --no-proxy \ -O clash-verge-arm64.deb \ "https://gh-proxy.com/https://github.com/clash-verge-rev/clash-verge-rev/releases/download/v2.5.2/Clash.Verge_2.5.2_arm64.deb"检查:ls -lh clash-verge-arm64.deb确认架构:dpkg-deb -f clash-verge-arm64.deb Architecture必须:arm64确认软件:dpkg-deb -f clash-verge-arm64.deb Package dpkg-deb -f clash-verge-arm64.deb Version2. 安装 Clashapt install -y ./clash-verge-arm64.debAPT 可能额外安装:libjavascriptcoregtk libsoup libwebkit2gtk这是正常依赖。3. 查启动命令command -v clash-verge如果返回:/usr/bin/clash-verge直接启动:DISPLAY=:1 clash-verge >/tmp/clash-verge.log 2>&1 &如果找不到:dpkg -L clash-verge | grep -E '/bin/|\.desktop$'4. Clash Verge 中进行配置在图形界面:导入订阅 → 更新订阅 → 选择可用节点 → 启动系统代理建议开始阶段:先不用 TUN只使用系统代理。5. 检查 Mihomo 代理端口ss -lntp | grep -E '7890|7891|7897'之前这台设备实际端口为:127.0.0.1:7897如果输出:127.0.0.1:7897后文就全部使用 7897。6. 测试 Clashcurl -x http://127.0.0.1:7897 \ -I https://packages.mozilla.org/能够快速返回 HTTP 响应说明代理正常。十四、安装 Firefox —— 使用 Mozilla 官方 ARM64 DEB + Clash重要不要再执行:apt install firefox直接从 Armbian 源下载。因为现在会得到:http://mirror.twds.com.tw/armbian-apt Firefox 149而且下载可能只有:17 KB/s我们改为 Mozilla 官方 DEB 仓库。Mozilla 官方推荐 Debian/Ubuntu 使用 packages.mozilla.org APT 仓库安装 Firefox。1. 创建密钥目录install -d -m 0755 /etc/apt/keyrings2. 下载 Mozilla 官方密钥文件很小:wget -q \ https://packages.mozilla.org/apt/repo-signing-key.gpg \ -O /etc/apt/keyrings/packages.mozilla.org.asc检查:ls -lh /etc/apt/keyrings/packages.mozilla.org.asc可验证官方指纹:gpg -n -q \ --import \ --import-options import-show \ /etc/apt/keyrings/packages.mozilla.org.ascMozilla 官方给出的指纹为:35BAA0B33E9EB396F59CA838C0BA5CE6DC6315A33. 添加 Mozilla 仓库cat > /etc/apt/sources.list.d/mozilla.list <<'EOF' deb [signed-by=/etc/apt/keyrings/packages.mozilla.org.asc] https://packages.mozilla.org/apt mozilla main EOF4. 提高 Mozilla 优先级cat > /etc/apt/preferences.d/mozilla <<'EOF' Package: * Pin: origin packages.mozilla.org Pin-Priority: 1000 EOF5. 关键:明确让 APT 走 Clash仅在 Clash Verge 里开启“系统代理”:并不能保证 apt 使用代理所以必须明确指定:apt \ -o Acquire::http::Proxy="http://127.0.0.1:7897" \ -o Acquire::https::Proxy="http://127.0.0.1:7897" \ update然后:apt-cache policy firefox应该看到类似:Candidate: 156.x并且来源:https://packages.mozilla.org/apt优先级:10006. 通过 Clash 下载 Firefoxapt \ -o Acquire::http::Proxy="http://127.0.0.1:7897" \ -o Acquire::https::Proxy="http://127.0.0.1:7897" \ install -y firefox这一步 Firefox 的 70~80MB 文件会明确走:127.0.0.1:7897而不是依赖 Clash 的桌面系统代理设置。7. 安装中文语言包apt \ -o Acquire::http::Proxy="http://127.0.0.1:7897" \ -o Acquire::https::Proxy="http://127.0.0.1:7897" \ install -y firefox-l10n-zh-cn如果提示不存在:apt-cache search firefox-l10n | grep -i zh根据实际名称安装。Mozilla 官方 DEB 仓库提供 Firefox 的语言包。8. 验证 Firefoxwhich firefox firefox --version查看来源:apt-cache policy firefox必须优先来自:packages.mozilla.org9. 启动 Firefox从 MATE 菜单直接打开。或者:DISPLAY=:1 firefox >/tmp/firefox.log 2>&1 &十五、APT 临时与永久使用 Clash推荐平时使用临时代理。例如:apt \ -o Acquire::http::Proxy="http://127.0.0.1:7897" \ -o Acquire::https::Proxy="http://127.0.0.1:7897" \ install 包名如果确定 Clash 会长期运行,也可以:cat > /etc/apt/apt.conf.d/99clash-proxy <<'EOF' Acquire::http::Proxy "http://127.0.0.1:7897"; Acquire::https::Proxy "http://127.0.0.1:7897"; EOF以后:apt update默认走 Clash。但如果 Clash 关闭:APT 会连接失败。恢复:rm -f /etc/apt/apt.conf.d/99clash-proxy所以本文更推荐:APT 临时指定代理十六、安装 cloudflared —— 使用 GitHub 加速当前 cloudflared GitHub Release 提供 Linux ARM64 DEB。你已经实际测试:GitHub直连: 约 69 KB/s gh-proxy: 约 5.96 MB/s因此直接采用 GitHub 加速。1. 下载 cloudflaredcd /root/Desktop推荐固定当前版本 2026.9.1:wget --no-proxy \ -O cloudflared-arm64.deb \ "https://gh-proxy.com/https://github.com/cloudflare/cloudflared/releases/download/2026.9.1/cloudflared-linux-arm64.deb"2. 校验 SHA256因为 gh-proxy.com 是第三方代理,不是 Cloudflare/GitHub 官方域名,所以下载后必须校验。Cloudflare 官方 2026.9.1 ARM64 DEB 的 SHA256 为:ee3fe95ac038c70dc0bbe4823667a2794422fa30c6068520537dc2fe3d7ce282执行:echo \ "ee3fe95ac038c70dc0bbe4823667a2794422fa30c6068520537dc2fe3d7ce282 cloudflared-arm64.deb" \ | sha256sum -c -必须:cloudflared-arm64.deb: OK如果不是:OK不要安装,直接删除:rm -f cloudflared-arm64.deb3. 检查架构dpkg-deb -f cloudflared-arm64.deb Architecture应该:arm644. 安装apt install -y ./cloudflared-arm64.deb验证:cloudflared --version十七、配置 Cloudflare Tunnel进入 Cloudflare One:Networks → Connectors → Cloudflare Tunnel → Create Tunnel名字:agblr-desktopCloudflare 后台会生成类似:cloudflared service install eyJxxxxxxxxxxxxxxxx直接复制到设备执行。注意:不要把 Tunnel Token 发到聊天、论坛或 GitHub。检查服务systemctl status cloudflared --no-pagersystemctl is-enabled cloudflared应为:active (running) enabled十八、Cloudflare 映射 noVNCTunnel 中创建 Published Application:Hostname: agblr.funService:HTTPURL:http://127.0.0.1:6081最终:https://agblr.fun │ ▼ Cloudflare │ ▼ Cloudflare Tunnel │ ▼ 127.0.0.1:6081 │ ▼ noVNC │ ▼ TigerVNC :1十九、检查所有服务systemctl is-enabled tigervncserver@:1.service systemctl is-enabled novnc.service systemctl is-enabled xrdp.service systemctl is-enabled cloudflared 2>/dev/null检查端口ss -lntp | grep -E '3389|5901|6081|7897'正常:3389 xrdp 127.0.0.1:5901 Xtigervnc 0.0.0.0:6081 websockify 127.0.0.1:7897 verge-mihomo二十、检查唯一 MATE 桌面for PID in $(pgrep mate-session); do DISP=$(tr '\0' '\n' < /proc/$PID/environ 2>/dev/null | sed -n 's/^DISPLAY=//p' | head -1) echo "PID=$PID DISPLAY=$DISP" done只应存在:DISPLAY=:1二十一、重启最终验证reboot启动后:pgrep -a mate-session pgrep -a mate-panel pgrep -a caja pgrep -a fcitx5检查:ss -lntp | grep -E '3389|5901|6081'然后分别测试:局域网浏览器: http://设备IP:6081/ Windows RDP: 设备IP:3389 公网: https://agblr.fun/三个入口都必须进入:DISPLAY=:1同一个 MATE 桌面。二十二、重要下载原则这台机器当前网络建议:Ubuntu普通依赖 ↓ USTC GitHub大文件 ↓ gh-proxy.com ↓ 下载后尽量校验哈希 Firefox ↓ Mozilla官方APT ↓ 明确指定 Clash 127.0.0.1:7897 Armbian普通小包 ↓ mirror.twds.com.tw不要再让大 Firefox 包直接从:mirror.twds.com.tw/armbian-apt下载,因为实际已经测到只有:17.5 KB/s二十三、配置备份全部正常以后:mkdir -p /root/GEA-backupcp -a /root/.vnc /root/GEA-backup/ cp -a /root/.config/fcitx5 /root/GEA-backup/ cp -a /usr/local/bin/mate-vnc-session.sh /root/GEA-backup/ cp -a /etc/xrdp/xrdp.ini /root/GEA-backup/ cp -a /etc/systemd/system/novnc.service /root/GEA-backup/ cp -a /etc/apt/sources.list /root/GEA-backup/ cp -a /etc/apt/sources.list.d/armbian.list /root/GEA-backup/如果 Mozilla 已配置:cp -a /etc/apt/sources.list.d/mozilla.list \ /root/GEA-backup/ 2>/dev/null || true cp -a /etc/apt/preferences.d/mozilla \ /root/GEA-backup/ 2>/dev/null || true打包:tar czf /root/GEA-FULL-CONFIG-BACKUP.tar.gz \ -C /root GEA-backup务必再复制到其他电脑/NAS保存。
2026年09月19日
14 阅读
0 评论
1 点赞
2026-08-26
使用私有 CA 为内网 IP 签发 TLS 服务器证书
文档版本:v1.0 适用场景:内网服务(如 Kubernetes、Web 服务、中间件)使用 IP 地址访问,需启用 HTTPS 证书有效期:约 73 年(26645 天,仅适合内网/测试,生产建议 1–3 年)一、前置条件项目要求操作系统Linux / macOS工具OpenSSL 1.1.1 及以上权限可创建目录、生成文件的普通用户即可网络无外网要求二、证书体系说明根 CA(自签) ├── ca.key # CA 私钥(必须严格保密) ├── ca.crt # CA 证书(分发到所有客户端信任库) │ └── 服务器证书(由 CA 签发) ├── server.key # 服务器私钥 ├── public.crt # 服务器证书(含 IP SAN) └── chain.crt # 证书链(单级 CA = ca.crt)关键点:客户端(浏览器/程序)只需信任 ca.crt,即可信任该 CA 签发的所有服务器证书。三、操作步骤步骤 1:创建根 CA(只需执行一次)# 1. 生成 CA 私钥 openssl genrsa -out ca.key 4096 # 2. 自签 CA 证书 openssl req -x509 -new -nodes -key ca.key -sha256 -days 26645 \ -subj "/C=CN/ST=Fujian/L=Xiamen/O=G8.6/OU=CIM/CN=G8.6-CIM-IS" \ -out ca.crt产出文件:文件说明保密级别ca.keyCA 私钥⚠️ 绝密,离线存储ca.crtCA 证书公开分发步骤 2:为服务器 IP 签发证书以下以 10.113.120.12 为例,多台服务器重复此步骤即可。IP=10.113.120.12 mkdir -p certs/$IP # 2.1 生成服务器私钥 openssl genrsa -out certs/$IP/server.key 2048 # 2.2 生成 CSR(CN 填 IP,实际校验以 SAN 为准) openssl req -new -key certs/$IP/server.key \ -subj "/C=CN/ST=Fujian/L=Xiamen/O=G8.6/OU=CIM/CN=$IP" \ -out certs/$IP/server.csr # 2.3 CA 签发证书(强制写入 IP SAN) openssl x509 -req -in certs/$IP/server.csr \ -CA ca.crt -CAkey ca.key -CAcreateserial \ -days 26645 -sha256 -out certs/$IP/public.crt \ -extfile <(printf "basicConstraints=CA:FALSE\nkeyUsage=digitalSignature,keyEncipherment\nextendedKeyUsage=serverAuth\nsubjectAltName=IP:%s" $IP) # 2.4 生成证书链(单级 CA,chain.crt = ca.crt) cp ca.crt certs/$IP/chain.crt产出文件(每台服务器独立目录):文件说明部署位置server.key服务器私钥服务端,权限 600public.crt服务器证书服务端chain.crt证书链服务端(部分程序需要)步骤 3:为更多服务器重复签发(示例)# 第二台服务器 IP=10.113.120.13 mkdir -p certs/$IP openssl genrsa -out certs/$IP/server.key 2048 openssl req -new -key certs/$IP/server.key \ -subj "/C=CN/ST=Fujian/L=Xiamen/O=G8.6/OU=CIM/CN=$IP" \ -out certs/$IP/server.csr openssl x509 -req -in certs/$IP/server.csr \ -CA ca.crt -CAkey ca.key -CAcreateserial \ -days 26645 -sha256 -out certs/$IP/public.crt \ -extfile <(printf "basicConstraints=CA:FALSE\nkeyUsage=digitalSignature,keyEncipherment\nextendedKeyUsage=serverAuth\nsubjectAltName=IP:%s" $IP) cp ca.crt certs/$IP/chain.crt📌 提示:可将步骤 2 封装为脚本 issue-cert.sh <IP>,避免重复劳动。四、最终目录结构. ├── ca.key # CA 私钥(绝密) ├── ca.crt # CA 证书(分发给客户端) ├── ca.srl # CA 序列号(自动生成,保留) └── certs/ ├── 10.113.120.12/ │ ├── server.key # 服务器私钥 │ ├── server.csr # CSR(可归档或删除) │ ├── public.crt # 服务器证书 │ └── chain.crt # 证书链 └── 10.113.120.13/ ├── server.key ├── server.csr ├── public.crt └── chain.crt五、验证5.1 检查证书内容(确认 IP SAN 已写入)openssl x509 -in certs/10.113.120.12/public.crt -noout -text | grep -A1 "Subject Alternative Name"预期输出:X509v3 Subject Alternative Name: IP Address:10.113.120.125.2 用 OpenSSL 验证证书链openssl verify -CAfile ca.crt certs/10.113.120.12/public.crt预期输出:public.crt: OK5.3 客户端信任配置客户端操作Linux(信任系统 CA)将 ca.crt 复制到 /usr/local/share/ca-certificates/,执行 update-ca-certificatesWindows双击 ca.crt → 安装到「受信任的根证书颁发机构」Java 应用keytool -import -trustcacerts -file ca.crt -keystore cacerts浏览器导入 ca.crt 到「受信任的根证书」curlcurl --cacert ca.crt https://10.113.120.12六、注意事项#事项说明1CA 私钥安全ca.key 一旦泄露,攻击者可为任意域名/IP 签发可信证书;建议加密存储或离线保存2有效期26645 天 ≈ 73 年,仅适合内网/测试;生产环境建议 365–825 天3证书轮换到期前需重新签发,客户端无需重新信任 CA(CA 未变)4CN vs SAN现代客户端(Chrome、Go、Java 等)只认 SAN,CN 仅作兜底;本方案 SAN 已正确配置5多 IP / DNS如需支持多个 IP 或域名,修改 subjectAltName 行,例如:IP:10.113.120.12,DNS:server.example.com6权限服务器私钥文件权限建议 600,属主为运行服务的用户七、附录:快速签发脚本(可选)如需频繁签发,可保存为 issue-cert.sh:#!/bin/bash set -e IP=$1 if [ -z "$IP" ]; then echo "用法: $0 <IP地址>" exit 1 fi mkdir -p certs/$IP openssl genrsa -out certs/$IP/server.key 2048 openssl req -new -key certs/$IP/server.key \ -subj "/C=CN/ST=Fujian/L=Xiamen/O=G8.6/OU=CIM/CN=$IP" \ -out certs/$IP/server.csr openssl x509 -req -in certs/$IP/server.csr \ -CA ca.crt -CAkey ca.key -CAcreateserial \ -days 26645 -sha256 -out certs/$IP/public.crt \ -extfile <(printf "basicConstraints=CA:FALSE\nkeyUsage=digitalSignature,keyEncipherment\nextendedKeyUsage=serverAuth\nsubjectAltName=IP:%s" $IP) cp ca.crt certs/$IP/chain.crt echo "✅ 证书已生成: certs/$IP/"赋执行权限:chmod +x issue-cert.sh使用:./issue-cert.sh 10.113.120.14
2026年08月26日
3 阅读
0 评论
0 点赞
2026-07-15
Linux 常用命令速查手册
适用范围:RHEL / CentOS / Rocky / Alma / Ubuntu / Debian{lamp/}🔍 文件和目录操作基本操作ls # 列出目录内容 ls -l # 详细列表(权限、大小、时间) ls -a # 显示隐藏文件 ls -la # 详细列表 + 隐藏文件 cd /path # 切换目录 cd .. # 上级目录 cd ~ # 家目录 cd - # 返回上一个目录 pwd # 显示当前目录绝对路径 mkdir dirname # 创建目录 mkdir -p a/b/c # 创建多级目录 rmdir dirname # 删除空目录文件操作cp file1 file2 # 复制文件 cp -r dir1 dir2 # 递归复制目录 mv file1 file2 # 移动 / 重命名文件 mv file1 /path/ # 移动到指定目录 rm file # 删除文件 rm -r dir # 递归删除目录 rm -f file # 强制删除(慎用) touch file # 创建空文件 / 更新时间戳 cat file # 查看文件内容 less file # 分页查看(支持上下滚动) head -n 10 file # 查看前 10 行 tail -n 10 file # 查看后 10 行 tail -f file # 实时跟踪文件变化(日志排查神器)📊 系统监控和进程管理系统状态ps aux # 查看所有进程(最常用) top # 动态查看系统状态 htop # 增强版 top(需安装) free -h # 查看内存使用(人类可读) df -h # 查看磁盘空间 du -sh dir # 查看目录大小进程管理kill PID # 终止进程 kill -9 PID # 强制终止(最后手段) pkill process_name # 按名称终止进程 killall process_name # 终止所有同名进程 bg # 后台运行暂停的作业 fg # 前台运行后台作业 jobs # 查看后台作业🔎 查找和搜索# 文件查找 find /path -name "*.txt" # 按名称查找 find /path -type f -mtime -7 # 7 天内修改的文件 find /path -size +10M # 大于 10M 的文件 # 内容搜索 grep "pattern" file # 在文件中搜索 grep -r "pattern" /path # 递归搜索目录 grep -i "pattern" file # 忽略大小写 # 命令查找 which command # 查找命令位置 whereis command # 查找命令及相关文件 locate filename # 快速查找(依赖 updatedb)📦 软件包管理Ubuntu / Debian(apt)sudo apt update # 更新软件包索引 sudo apt upgrade # 升级所有可升级包 sudo apt install package # 安装软件包 sudo apt remove package # 卸载软件包 sudo apt search keyword # 搜索软件包CentOS / RHEL(yum / dnf)sudo yum update # 更新系统(CentOS 7) sudo dnf update # 更新系统(CentOS 8+) sudo yum install package # 安装软件包 sudo dnf install package sudo yum remove package # 卸载软件包 sudo dnf remove package🔄 压缩和解压# tar(最常用) tar -czvf archive.tar.gz /path # 创建 gzip 压缩包 tar -xzvf archive.tar.gz # 解压 gzip 压缩包 tar -cjvf archive.tar.bz2 /path # 创建 bzip2 压缩包 tar -xjvf archive.tar.bz2 # 解压 bzip2 压缩包 # zip / unzip zip -r archive.zip /path # 创建 zip 压缩包 unzip archive.zip # 解压 zip 文件 # gzip gzip file # 压缩文件 gunzip file.gz # 解压文件🌐 网络相关ping hostname # 测试网络连通性 ip addr # 查看 IP 地址(推荐) ifconfig # 查看网络接口(旧版) ss -tuln # 查看监听端口(推荐) netstat -tuln # 查看监听端口(旧版) wget URL # 下载文件 curl URL # 传输数据 / API 调试 ssh user@host # SSH 远程登录 scp file user@host:/path # 安全复制文件👥 用户和权限whoami # 显示当前用户 id # 显示 UID / GID sudo command # 以 root 权限执行 chmod 755 file # 修改文件权限 chown user:group file # 修改文件所有者 chgrp group file # 修改文件所属组 passwd user # 修改用户密码 useradd username # 添加用户 userdel username # 删除用户📝 文本处理cat file1 file2 > file3 # 合并文件 sort file # 排序内容 uniq file # 去重(需先排序) wc file # 统计行数、单词数、字节数 cut -d',' -f1 file # 按分隔符截取字段 awk '{print $1}' file # 打印第一列 sed 's/old/new/g' file # 全局替换文本⚙️ 系统信息uname -a # 内核信息 cat /etc/os-release # 系统版本(推荐) lsb_release -a # 发行版信息(部分系统) date # 当前日期时间 cal # 日历 uptime # 系统运行时间及负载🛠️ 实用技巧组合性能排查# 最耗内存的进程 ps aux --sort=-%mem | head -10 # 最耗 CPU 的进程 ps aux --sort=-%cpu | head -10 # 实时监控日志 tail -f /var/log/messages tail -f /var/log/syslog文件与日志# 查找错误日志 grep -r "ERROR" /var/log/ # 查找大文件 find / -type f -size +100M 2>/dev/null批量操作# 批量重命名 for f in *.txt; do mv "$f" "bak_$f"; done # 后台运行并记录日志 nohup command > output.log 2>&1 &定时任务# 每 5 分钟执行一次 */5 * * * * /path/to/command💡 高频命令速记(每日必用)每天必用(90% 场景)ls / cd / pwd / cat / less ps aux / top / df -h / free -h grep / find / sudo经常使用cp / mv / rm / mkdir / chmod ssh / scp / wget / curl tar / gzip / unzip✅ 运维建议✅ 危险命令三思:rm -rf、kill -9、chmod 777✅ 操作前备份:尤其是 /etc、数据库、配置文件✅ 生产环境慎用通配符:rm *、chmod -R✅ 多用 -h 参数:人类可读格式,减少误判✅ 管道组合命令:grep | awk | sort | uniq{lamp/}
2026年07月15日
5 阅读
0 评论
0 点赞
2026-07-15
Everything 搜索语法速查
适用场景:Windows 本地文件秒搜、日志清理、磁盘整理、项目归档、重复文件排查 工具版本:Everything(推荐 1.4+ / 1.5 启用正则增强)一、基础通配符语法说明示例匹配结果*任意数量字符*.txt所有 .txt 文件?单个任意字符image?.jpgimage1.jpg、imageA.jpg[...]括号内任一字符test[123].doctest1.doc、test2.doc、test3.doc[!...]排除括号内字符report[!a].pdf除 reporta.pdf 外的 report?.pdf二、逻辑运算符语法说明示例匹配结果(空格) 或 AND与invoice pdf同时包含 invoice 和 pdfOR或report OR summary包含 report 或 summary! 或 NOT非重要 !draft包含“重要”但不含“draft”✅ 技巧:复杂条件建议加括号(report OR summary) AND 2024三、文件类型与路径语法说明示例匹配结果ext:指定扩展名ext:pdf;docxPDF 和 Word 文档*.ext特定扩展名*.mp4所有 MP4 文件\路径分隔符\windows\*.dllWindows 目录下的 DLLpath:指定路径path:C:\Users\*.jpg指定路径图片!path:排除路径!path:temp排除 temp 目录四、文件属性筛选1️⃣ 大小筛选语法示例说明size:size:>100MB大于 100MB范围size:1KB..1MB1KB–1MB空文件empty:空文件夹零字节size:00 字节文件2️⃣ 日期筛选语法含义示例dc:创建日期dc:2024-01-01..2024-12-31dm:修改日期dm:today、dm:lastweekda:访问日期da:yesterdaydr:运行日期dr:<7days📌 常用日期关键词: today、yesterday、thisweek、lastweek、thismonth、lastmonth、thisyear3️⃣ 属性筛选(attrib:)语法含义attrib:h隐藏文件attrib:r只读文件attrib:d文件夹attrib:!d非文件夹(即文件)attrib:!r非只读文件五、高级功能语法说明示例regex:正则表达式regex:^\d{3}-\d{2}-\d{4}$(SSN)len:路径长度len:>100upper:全大写upper:READMElower:全小写lower:readmecontent:文件内容content:"TODO"case:区分大小写case:READMEdupe:重复文件dupe: / dupe:size,sha256六、搜索修饰符语法说明示例parent:父文件夹parent:projects\*.cschild:包含某文件的文件夹child:*.exesort:排序*.jpg sort:size*.doc sort:dm-descopenwith:关联程序*.cs openwith:七、实战搜索案例(运维/开发高频)🧹 系统清理*.tmp OR *.temp OR size:0 node_modules\ size:>1GB *.dmp size:>100MB📂 下载整理dm:today download *.pdf dm:lastweek download🗂 项目检索ext:c;cpp;h;hpp !attrib:h path:myproject\*.cs🔁 重复文件排查dupe:size,sha256📦 备份 & 归档*.bak OR *.backup OR *_old.* *.zip OR *.rar OR *.7z size:>50MB🖼 图片管理ext:jpg;png;gif size:>2MB dm:>2023📄 配置文件*.ini OR *.config OR *.json八、组合搜索示例需求搜索语法本周修改的 PDF*.pdf dm:thisweek隐藏的大文件attrib:h size:>100MB非隐藏图片ext:jpg;png;gif !attrib:h指定项目源码path:myproject\*.cs旧备份清理*.bak dm:<2024-01-01指定大小视频ext:mp4;avi;mkv size:500MB..2GB九、文件属性代码速查代码含义代码含义a存档h隐藏i不索引n普通o离线r只读s系统t临时d目录c压缩e加密v虚拟十、效率技巧(强烈推荐)✅ 组合条件:ext:jpg;png dm:lastweek size:>1MB✅ 分组搜索:(report OR summary) AND ext:pdf✅ 保存常用搜索:Ctrl + D 收藏为书签 ✅ 查看历史:F3 切换搜索历史 ✅ 结果排序:右键 → 按大小 / 日期 / 路径 ✅ 快速过滤:搜索框实时输入,结果毫秒级刷新
2026年07月15日
1 阅读
0 评论
0 点赞
1
2