# -*- coding: utf-8 -*- r"""把 EzHub 的令牌存到仓库外,并支持用 HTTPS + 令牌推代码。 为什么需要这个: 用户加 SSH 公钥时可能加错了(服务端拒绝了本机的 SHA256:Acmu49YQcjw3m5WefOXSBzYNY2WPHLL2vvhnlYRAttA), 但令牌有 push 权限,走 HTTPS 就能推。 为什么不把令牌写进 remote URL: `git remote -v` 会直接打印出来,任何时候截图/录屏都会泄。 所以令牌存在仓库外的 %USERPROFILE%\.ykxmz\ezhub_token, 推送时临时拼 URL,推完不留痕。 用法: python _build/ezhub_push.py # 用存好的令牌推 python _build/ezhub_push.py <令牌> # 先存再用这个令牌推 python _build/ezhub_push.py --show # 只看存了什么(打码) """ from __future__ import annotations import subprocess import sys from pathlib import Path ROOT = Path(r"C:\Users\shu\Desktop\deepseekagent\LanRemote") GIT = r"C:\Program Files\Git\bin\git.exe" TOKEN_FILE = Path.home() / ".ykxmz" / "ezhub_token" OWNER = "xmz" REPO = "ykxmz" HOST = "git.261826.xyz" def save_token(token: str) -> None: TOKEN_FILE.parent.mkdir(parents=True, exist_ok=True) TOKEN_FILE.write_text(token.strip(), encoding="utf-8") # 尽量收紧权限(Windows 上效果有限,但聊胜于无) try: import os os.chmod(TOKEN_FILE, 0o600) except OSError: pass print(" 令牌已存到 %s(仓库外,不会进版本库)" % TOKEN_FILE) def load_token() -> str: if TOKEN_FILE.is_file(): return TOKEN_FILE.read_text(encoding="utf-8").strip() return "" def main() -> int: args = [a for a in sys.argv[1:] if a] if args and args[0] == "--show": token = load_token() if not token: print(" 还没存令牌") else: print(" 令牌: %s…%s(长度 %d)" % (token[:8], token[-4:], len(token))) return 0 if args and not args[0].startswith("--"): save_token(args[0]) token = load_token() if not token: print(" 用法: python _build/ezhub_push.py <令牌>") return 1 # 带令牌的 HTTPS 地址(只在这次进程里用,不写进 .git/config) url = "https://%s:%s@%s/%s/%s.git" % (OWNER, token, HOST, OWNER, REPO) print(" 推到 EzHub(HTTPS + 令牌)…") result = subprocess.run([GIT, "push", url, "main"], cwd=str(ROOT), capture_output=True, text=True, encoding="utf-8", errors="replace") err = (result.stderr or result.stdout or "").strip() # 输出里可能带令牌,打码后再打印 safe = err.replace(token, "***") for line in safe.splitlines()[-6:]: # 远程 URL 里的令牌也打掉 line = line.replace(url, "https://%s:***@%s/%s/%s.git" % (OWNER, HOST, OWNER, REPO)) print(" " + line) if result.returncode != 0: print(" [失败] exit=%s" % result.returncode) return result.returncode print(" ✓ 推完了") return 0 if __name__ == "__main__": sys.exit(main())