# -*- coding: utf-8 -*- r'''临时调试:在首页分支里打一行日志,看它到底有没有被执行、extra 传的是什么。 (这个文件只改运行环境里的 relay.py,不改本地仓库。) ''' from __future__ import annotations import sys from pathlib import Path import paramiko HOST = "192.168.10.105" USER = "root" PASSWORD = "1313144" REMOTE = "/root/lanremote-relay/relay.py" def run(client, cmd: str, timeout: int = 60) -> str: _in, out, err = client.exec_command(cmd, timeout=timeout) return (out.read().decode("utf-8", "replace") + err.read().decode("utf-8", "replace")) def main() -> int: client = paramiko.SSHClient() client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) client.connect(HOST, username=USER, password=PASSWORD, timeout=20, look_for_keys=False, allow_agent=False) try: # 1. 看看首页分支前后到底长什么样 print(" 首页分支附近(1400-1415):") print(run(client, "sed -n '1400,1415p' " + REMOTE)) # 2. 检查 _send 是否真的会跳过默认头 print(" _send 的头部逻辑(895-920):") print(run(client, "sed -n '895,920p' " + REMOTE)) # 3. 用 python 直接调这份代码的 _send 看结果 probe = r''' import sys sys.path.insert(0, "/root/lanremote-relay") import relay, io captured = [] class Fake: def send_response(self, code): captured.append(("__status__", code)) def send_header(self, k, v): captured.append((k, v)) def end_headers(self): pass wfile = io.BytesIO() f = Fake() relay.Handler._send(f, 200, b"hi", "text/html; charset=utf-8", {"Cache-Control": "public, max-age=60"}) cc = [v for k, v in captured if k.lower() == "cache-control"] print(" _send 发出的 Cache-Control 值:", cc) print(" 头数量:", len(cc)) ''' Path("/tmp/probe_send.py").write_text(probe, encoding="utf-8") client.exec_command("cat > /tmp/probe_send.py <<'PYEOF'\n" + probe + "\nPYEOF\n")[1].channel.recv_exit_status() print(" _send 实测:") print(run(client, "python3 /tmp/probe_send.py 2>&1")) # 4. 看 do_GET 里 "/" 前面有没有别的 return print(" do_GET 的 return 位置(1174-1412):") print(run(client, "awk 'NR>=1174 && NR<=1412 && " "/return|if path/ {print NR\": \"$0}' " + REMOTE + " | head -40")) finally: client.close() return 0 if __name__ == "__main__": sys.exit(main())