
本地 HTML 一键变网站:Windows 开发 + Linux 部署完整指南(局域网版)
有网友要脚本,现贴出。
deploy.py
#!/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 即可一键部署并自动验证。
@echo off
cd /d "%~dp0"
python deploy.py
pause

目录下文件为:
