mirror of
https://gitee.com/xmz7891/ykxmz.git
synced 2026-10-18 17:10:43 +00:00
Gitea 令牌可以只给读权限。只读令牌能读仓库、能列发行版, 看起来一切正常,但一推代码就 403、一建发行版也 403。 加了 check_ezhub_scope():开头就用一个**无副作用**的探针确认权限 (对不存在的发行版发 DELETE —— 403 说明缺 write:repository, 404 说明权限过了只是资源不存在),缺权限就立刻停下并给出 明确的修复指引,不让它走到一半才炸。 文档里也写清了这个坑。
97 lines
3.1 KiB
Python
97 lines
3.1 KiB
Python
# -*- 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())
|