#!/bin/sh # PhotoSheep one-command checker. Downloads only the fixed official HTTPS bundle. set -u umask 077 if ! command -v python3 >/dev/null 2>&1; then printf '%s\n' '测试失败:需要 Python 3.9 或更高版本,请安装后重新运行。' >&2 exit 2 fi photosheep_tmp=$(mktemp -d "${TMPDIR:-/tmp}/photosheep-check.XXXXXXXX") || { printf '%s\n' '测试失败:无法创建临时目录。' >&2 exit 2 } trap 'rm -rf "$photosheep_tmp"' 0 trap 'exit 2' HUP INT TERM python3 - "$photosheep_tmp/photosheep-check.pyz" '35b467c9100639d17374287fe27058b13237690bc6590c6c088593be674f02a2' <<'PHOTOSHEEP_DOWNLOAD' import hashlib import signal import ssl import sys import urllib.error import urllib.request URL = "https://photosheep.cc/certcheck/downloads/photosheep-check.pyz" LIMIT = 2 * 1024 * 1024 class NoRedirect(urllib.request.HTTPRedirectHandler): def redirect_request(self, request, fp, code, msg, headers, newurl): raise ValueError("下载地址发生跳转,请从官网重新复制命令") def timed_out(signum, frame): raise TimeoutError("下载超过 45 秒") try: if sys.version_info < (3, 9): raise ValueError("需要 Python 3.9 或更高版本,请更换 Python 后重试。") signal.signal(signal.SIGALRM, timed_out) signal.alarm(45) opener = urllib.request.build_opener(NoRedirect(), urllib.request.HTTPSHandler(context=ssl.create_default_context())) request = urllib.request.Request(URL, headers={"User-Agent": "PhotoSheep-Check-Bootstrap/1"}) digest = hashlib.sha256() size = 0 with opener.open(request, timeout=10) as response, open(sys.argv[1], "wb") as output: if response.status != 200: raise ValueError("服务器未返回检测程序") declared = response.headers.get("Content-Length") if declared is not None and (not declared.isdigit() or int(declared) > LIMIT): raise ValueError("下载文件大小异常") while True: data = response.read(min(65536, LIMIT - size + 1)) if not data: break size += len(data) if size > LIMIT: raise ValueError("下载文件超过 2 MiB 限制") output.write(data) digest.update(data) if digest.hexdigest() != sys.argv[2]: raise ValueError("检测程序校验失败,请从官网重新复制命令") except (OSError, ValueError, urllib.error.URLError) as error: print("测试失败:无法安全下载检测程序(%s)。" % error, file=sys.stderr) sys.exit(2) finally: signal.alarm(0) PHOTOSHEEP_DOWNLOAD photosheep_status=$? if [ "$photosheep_status" -ne 0 ]; then exit 2 fi python3 "$photosheep_tmp/photosheep-check.pyz" "$@" photosheep_status=$? case "$photosheep_status" in 0|1|2) exit "$photosheep_status" ;; *) printf '%s\n' '测试失败:检测程序异常退出。' >&2; exit 2 ;; esac