DEBUG.WIKI
V.PS:让项目靠近用户,亚太、欧洲、北美 KVM VPS
IPPeak:从目标地区访问网页,住宅代理、SEO 监测、广告验证
ZgoCloud:多地区部署,按需选节点;日本、美国、香港、德国

Windows 交叉编译 Deno 拒绝 unix socket 权限,按 POSIX 解析目标路径

Windows 上 Deno 交叉编译曾按宿主规则拒绝 Linux Unix socket 绝对路径。2.9.7 使用 POSIX 描述符解析,仍需验收目标端路径和权限范围。

在 Windows 上为 Linux 交叉编译 Deno 程序,--allow-net=unix:/var/run/docker.sock 可能被拒绝为不是绝对路径。目标路径确实以 / 开头,但编译器曾按宿主 Windows 的路径规则检查它。

deno compile --no-config --no-lock `
  --target x86_64-unknown-linux-gnu `
  --allow-net="unix:/var/run/docker.sock" `
  --output socket-client `
  client.ts

这里的权限值指向 Linux Unix socket。Windows 的普通绝对路径通常需要盘符或相应前缀;直接对 /var/run/docker.sock 调用宿主平台的 Path::is_absolute(),不能得到目标平台需要的判断。这是权限描述符解析阶段的失败,还没有进入 Linux 上的实际 socket 连接。

Deno 2.9.7 包含对应修补:以 / 开头的 unix: 路径使用 POSIX 规则进行词法归一化,不随宿主切换成 Windows 文件路径。其他形式保留宿主绝对路径判断,使 Windows 命名管道等用途仍可表达;空值和相对路径并没有因此获得许可。

先更新 Windows 构建机真正调用的 Deno,确认版本,再重跑原命令。不要把权限改成无范围的 --allow-net 来掩盖解析错误;程序只需要一个 socket 时,应保留这个范围。

下面的代码可用于准备目标端连接检查:

const connection = await Deno.connect({
  transport: 'unix',
  path: '/var/run/docker.sock',
});
try {
  // 按目标服务的协议进行后续通信。
} finally {
  connection.close();
}

编译完成只证明权限参数通过构建机解析,不证明目标机器上已经存在 socket,也不证明运行账号有操作系统权限。把产物放到目标 Linux 环境后,核对路径、挂载位置、服务状态与账号权限,再进行协议层验收。

还应准备一个未获许可的其他 socket 路径作为对照,确认权限没有被意外扩大。测试真实 Docker socket 时要知道它授予的控制能力,不要为了检查连通性额外执行修改容器或宿主的操作。

此修补没有把 Linux socket 变成 Windows 能直接连接的资源,也不处理 UNC 路径含空格导致的命令拆分。编译通过后如果报路径不存在或权限不足,应转向目标环境排查,不能反复修改已经正确的 POSIX 绝对路径。