首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >本地 HTML 一键变网站:Windows 开发 + Linux 部署完整指南(一键部署脚本)

本地 HTML 一键变网站:Windows 开发 + Linux 部署完整指南(一键部署脚本)

作者头像
科控物联
发布2026-07-21 16:27:59
发布2026-07-21 16:27:59
290
举报

本地 HTML 一键变网站:Windows 开发 + Linux 部署完整指南(局域网版)

有网友要脚本,现贴出。

deploy.py

代码语言:javascript
复制
#!/usr/bin/env python3
"""一键部署 index.html 到服务器 10.2.3.27:8899,部署后自动验证"""

import os
import sys
import subprocess
import shutil

SERVER_HOST = "10.2.3.27"
SERVER_USER = "tc"
SERVER_PASS = "QQ2492123056"
REMOTE_DIR = "/home/tc/www"
LOCAL_FILE = os.path.join(os.path.dirname(os.path.abspath(__file__)), "index.html")
REMOTE_FILE = f"{REMOTE_DIR}/index.html"
PORT = 8899
HOST_KEY = "ssh-ed25519 255 SHA256:owIwTue93wEYI0WANDcmKzAMrC5ANdEhwE752MmxGNQ"

SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))


def find_tool(name):
    for d in [SCRIPT_DIR, os.path.join(os.environ.get("ProgramFiles", ""), "PuTTY"),
              os.path.join(os.environ.get("ProgramFiles(x86)", ""), "PuTTY")]:
        p = os.path.join(d, name)
        if os.path.exists(p):
            return p
    q = shutil.which(name)
    return q if q else None


def verify_deploy():
    """部署后验证网站是否可访问"""
    print("\n[验证] 检查网站是否可访问...")
    try:
        import urllib.request
        req = urllib.request.Request(f"http://{SERVER_HOST}:{PORT}", method="HEAD")
        resp = urllib.request.urlopen(req, timeout=10)
        if resp.status == 200:
            print(f"  HTTP {resp.status} OK - 网站访问正常")
            return True
        else:
            print(f"  HTTP {resp.status} - 异常")
            return False
    except Exception as e:
        print(f"  [警告] 验证失败: {e}")
        return False


def try_pscp_plink():
    """pscp + plink,自动接受 host key"""
    pscp = find_tool("pscp.exe")
    plink = find_tool("plink.exe")
    if not (pscp and plink):
        return False

    print("[方式] pscp + plink (PuTTY)")

    # 通过 plink 写入 host key 缓存
    subprocess.run([
        plink, "-batch", "-pw", SERVER_PASS, "-hostkey", HOST_KEY,
        f"{SERVER_USER}@{SERVER_HOST}", "exit"
    ], capture_output=True, timeout=10)

    # 上传
    r = subprocess.run([
        pscp, "-pw", SERVER_PASS, "-hostkey", HOST_KEY,
        LOCAL_FILE, f"{SERVER_USER}@{SERVER_HOST}:{REMOTE_DIR}/"
    ], capture_output=True, text=True, timeout=30)

    if r.returncode != 0:
        print(f"  [错误] 上传失败: {r.stderr.strip()}")
        return False
    print(f"  上传成功 -> {REMOTE_FILE}")

    # reload nginx
    r = subprocess.run([
        plink, "-batch", "-pw", SERVER_PASS, "-hostkey", HOST_KEY,
        f"{SERVER_USER}@{SERVER_HOST}",
        f"echo {SERVER_PASS} | sudo -S nginx -s reload 2>&1"
    ], capture_output=True, text=True, timeout=15)

    out = (r.stdout + r.stderr).lower()
    if "error" in out:
        print(f"  [错误] Nginx reload 失败: {r.stdout}{r.stderr}")
        return False
    print("  Nginx reload 完成")
    return True


def try_paramiko():
    """paramiko 兜底"""
    try:
        import paramiko
    except ImportError:
        print("[信息] 安装 paramiko...")
        for cmd in [
            [sys.executable, "-m", "pip", "install", "paramiko", "-q", "--break-system-packages"],
            [sys.executable, "-m", "pip", "install", "paramiko", "-q"],
            [sys.executable, "-m", "pip", "install", "--user", "paramiko", "-q"],
        ]:
            r = subprocess.run(cmd, capture_output=True)
            if r.returncode == 0:
                break
        try:
            import paramiko
        except ImportError:
            print("  [错误] paramiko 安装失败")
            return False

    print("[方式] paramiko")
    c = paramiko.SSHClient()
    c.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    try:
        c.connect(SERVER_HOST, username=SERVER_USER, password=SERVER_PASS, timeout=15)

        sftp = c.open_sftp()
        sftp.put(LOCAL_FILE, REMOTE_FILE)
        sftp.close()
        print(f"  上传成功 -> {REMOTE_FILE}")

        _, stdout, _ = c.exec_command(f"ls -lh {REMOTE_FILE}")
        print(f"  {stdout.read().decode().strip()}")

        _, stdout, stderr = c.exec_command(
            f"echo {SERVER_PASS} | sudo -S nginx -s reload 2>&1", get_pty=True
        )
        out = stdout.read().decode()
        err = stderr.read().decode()
        if "error" in (out + err).lower():
            print(f"  [错误] Nginx reload 失败: {out}{err}")
            return False
        print("  Nginx reload 完成")
        return True
    except Exception as e:
        print(f"  [错误] {e}")
        return False
    finally:
        c.close()


def main():
    print("=" * 60)
    print("  网站部署脚本")
    print(f"  来源: {LOCAL_FILE}")
    print(f"  目标: {SERVER_USER}@{SERVER_HOST}:{REMOTE_DIR}")
    print("=" * 60)

    if not os.path.exists(LOCAL_FILE):
        print(f"\n[错误] 文件不存在: {LOCAL_FILE}")
        sys.exit(1)

    success = False
    for method in [try_pscp_plink, try_paramiko]:
        if method():
            success = True
            break

    if not success:
        print("\n[错误] 部署失败,请检查网络连接")
        sys.exit(1)

    verify_deploy()

    print()
    print("=" * 60)
    print(f"  部署完成!  http://{SERVER_HOST}:{PORT}")
    print("=" * 60)


if __name__ == "__main__":
    main()

双击 deploy.bat 即可一键部署并自动验证。

代码语言:javascript
复制
@echo off
cd /d "%~dp0"
python deploy.py
pause

目录下文件为:

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2026-07-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 科控物联 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档