news 2026/10/13 3:34:37

OpenSSH-Win64.zip 实战:Windows 搭建 SSH 服务与免密配置全攻略

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
OpenSSH-Win64.zip 实战:Windows 搭建 SSH 服务与免密配置全攻略

简介:OpenSSH-Win64.zip是针对Windows 64位系统的OpenSSH工具集,为需要在Windows上使用SSH协议完成远程登录、命令执行与文件传输的开发者和系统管理员,提供稳定可靠的免第三方依赖解决方案。压缩包共29个文件,约4.86MB,以13个可执行程序(如ssh、sshd、sftp、scp等)为核心,辅以PowerShell配置脚本、密钥维护工具及默认配置文件,覆盖客户端与服务端完整使用场景。内置的sshd服务可搭建安全Shell服务端,ssh等命令支持加密远程管理;PowerShell脚本用于权限修复、服务安装与卸载,显著降低Windows环境下的部署门槛。相比系统自带版本,该资源便于独立部署和版本控制,还能结合SFTP/SCP保障传输安全,特别适合需要统一维护多台Windows服务器的运维人员。已有801人学习或下载,适用于希望在Windows上快速上手SSH并熟悉服务配置的中高级用户。

1. OpenSSH-Win64.zip 是什么:Windows 上被忽略的远程连接基础件

如果你经常要从 Windows 登录 Linux 服务器做运维或开发,你大概率已经接触过 ssh 命令,但真正让你头疼的往往不是命令本身,而是环境里缺少一套完整可用的 SSH 工具链。OpenSSH-Win64.zip 就是这样一个压缩包:它把 OpenSSH 的客户端和服务端完整打包成了 Windows 64 位可执行文件,解压就能用,不装任何图形界面,也不依赖系统里乱七八糟的组件。它能解决三类很实际的问题:第一,Windows 上缺少 scp、sftp 这类命令行传输工具;第二,你想让这台 Windows 成为一台 SSH 服务器,让其他人安全连进来;第三,你想把 SSH 工具放进自动化脚本里,而不是每次手动打开图形软件。

这个包的价值在你进入内网机器、操作大量服务器、或者需要把工具复制到多台机器时体现得最明显。它没有安装流程,解压后目录就是工具本身,搬走整个目录即可换机器继续用。但这也意味着你需要自己处理 PATH、服务注册、权限、防火墙这些细节。这篇实战笔记会把我自己在 Windows 上用这个包的习惯做法完整写出来,新手可以照着跑通,老手可以对照检查自己的配置。

2. 先看包里有什么:OpenSSH-Win64.zip 的组件与选型理由

2.1 解压后的文件结构与启动入口

解开 OpenSSH-Win64.zip 后,你会发现里面主要是一个 Bin 文件夹,还有少量说明文件。Bin 这个命名非常直白,所有可执行程序都在这里。我自己的习惯是把整个解压后的目录放到一个不带空格的路径,比如C:\OpenSSH-Win64,而不是放进Program Files。原因是 OpenSSH 的很多配置文件里要用到路径,空格和反斜杠容易在解析时出乱子,尤其是你在修改 sshd_config 时,路径里一旦有空格,引号处理不到位就会启动失败。

Bin 目录里必须要认识这几个文件:

  • ssh.exe:客户端登录工具。运行ssh user@host时实际执行的就是它。
  • sshd.exe:服务端守护进程。把它运行起来后,这台 Windows 就可以被别人用 SSH 安全连接。
  • ssh-keygen.exe:生成密钥对的工具。免密登录、主机密钥生成都靠它。
  • scp.exe、sftp.exe:基于 SSH 协议的文件传输命令,对应 Linux 上的 scp 和 sftp。
  • ssh-add.exe:配合 ssh-agent 管理密钥缓存的工具。

把文件结构看清楚之后,你会发现包内没有复杂的依赖,主要文件就是这几个 exe。它本质上把 Linux 下的 OpenSSH 编译成了 Windows 原生程序,所以你能在命令行里获得和 Linux 几乎一致的体验。启动入口也简单:想要连接别的机器,用 ssh.exe;想让别人连你,用 sshd.exe。后续所有配置其实都是围绕这两个主程序展开的。

2.2 为什么不用系统自带 OpenSSH 而要这个独立包

很多 Windows 10/11 系统其实已经内置了 ssh.exe,打开终端输入ssh -V能看到版本信息。那为什么还要使用 OpenSSH-Win64.zip?第一个经常被忽略的差异在服务端:系统自带版本默认只启用客户端,要启动 sshd 必须去“可选功能”里手动添加,而且这个服务端和系统更新绑定,你很难锁定版本,也难以修改默认 shell 和认证方式。第二个差异是可移植性:独立包解压后可以随意放到 U 盘、移动硬盘或项目目录里,不需要管理员权限就能安装(配置服务除外),而系统自带组件是和操作系统绑在一起的,没法替代复制。

更关键的是版本控制:独立包允许你保留多个版本,把不同环境的工具目录分开。比如一个项目需要较旧的 SSH 算法来兼容老服务器,另一个项目必须用新版,这两个需求可以在两台目录里分别放不同版本的 OpenSSH-Win64.zip,互不干扰。系统自带版本做不到这一点,因为版本跟着系统走,你没法单独降级或升级。

不过独立包也有明确痛点:你必须自己注册服务、自己配防火墙、自己维护配置文件。如果你对 Windows 服务机制不熟,前几次会踩很多坑。这篇文章后半部分就是在给这些坑填路。

2.3 配置文件路径与读取逻辑

包内的配置分两种:客户端配置ssh_config和服务端配置sshd_config。客户端配置文件在用户级别有更高优先级,也就是你用户主目录下的C:\Users\用户名\.ssh\config。每次运行 ssh.exe 时,它会先读这个用户级配置,再读包内的全局配置。这种覆盖关系很重要,因为你不应该直接去改包内的全局配置,否则升级工具包时自定义内容会丢失。

服务端配置sshd_config在包内的路径一般是C:\OpenSSH-Win64\ssh_config?不对,服务端是sshd_config,通常在解压后的根目录或etc子目录。如果你找不到,可以用sshd.exe -f参数指定绝对路径。一个常见做法是复制一份配置到固定位置,比如C:\OpenSSH-Win64\sshd_config,然后修改它。注意 Windows 上配置路径里的分隔符最好统一用正斜杠/,用反斜杠\在某些版本里会被当成转义字符,导致路径解析错误。遇到过这种问题的人往往半天找不到原因,最后发现只是路径分隔符少写了一个转义。

2.4 安全注意事项:端口暴露与账号权限

把 OpenSSH 服务端跑起来之前,一定要想清楚一件事:你把这台机器的 22 端口暴露给谁?如果直接暴露在公网,等于给全网发了一张访问卡。即使在内网,也要考虑账号权限。我一般会在 sshd_config 里设置只允许指定用户登录,比如用AllowUsers devops限定登录账号。另外,Windows 上的管理员权限和 Linux 的 root 机制不同,默认的 Administrator 账号如果暴露,被爆破的风险很高。

还要注意密钥文件权限。在 Windows 上,authorized_keys文件如果继承了父目录的宽泛权限,OpenSSH 会直接拒绝使用密钥认证,这个问题在后面的避坑章节会详细展开。安全不是靠防火墙一条规则就能搞定的,主机密钥、用户认证、权限控制这三层都要检查一遍。

3. 从解压到跑起 sshd:最小化安装与服务注册

3.1 解压、配置 PATH 和生成 host key

现在开始动手。假设你已经把 OpenSSH-Win64.zip 解压到了C:\OpenSSH-Win64。打开一个管理员权限的 PowerShell,依次做三件事。

第一件事,生成 host key。sshd 启动时必须有主机密钥,否则会立刻退出并报错。执行:

cd C:\OpenSSH-Win64 .\Bin\ssh-keygen.exe -A

这里的-A表示生成所有默认类型的主机密钥,包括 RSA、ECDSA、ED25519。执行之后,Bin 目录下会出现一组ssh_host_*_key和对应的.pub文件。这些文件是服务端的身份凭证,非常重要,不要删除,也不要让普通用户可写。

第二件事,把 Bin 目录加进系统 PATH,这样以后在任何终端都可以直接使用 ssh、scp 命令,而不用每次输全路径:

[Environment]::SetEnvironmentVariable("Path", $env:Path + ";C:\OpenSSH-Win64\Bin", "Machine")

这个命令是把当前 PATH 变量追加一条新的路径,作用域是Machine,对所有用户生效。改完后必须重新打开终端,新路径才会加载。如果你不确定是否成功,可以打开一个新的 PowerShell 输入where.exe ssh查看路径列表里是否包含这个目录。

第三件事,确认运行依赖。绝大多数情况下 exe 能直接跑,但某些精简版 Windows 可能会缺少 Visual C++ 运行库,导致双击或执行时报“找不到 VCRUNTIME140.dll”之类的错误。遇到这种情况,去基础运行库补装一下就好,这和 OpenSSH 本身没什么关系。

3.2 用 sc 把 sshd 注册成系统服务

如果你只是在终端里运行sshd.exe,服务不会自动挂到系统服务管理器中,终端一关就全断了。正式环境应该把 sshd 注册成 Windows 服务,这样开机自启、崩溃自拉起都能由服务管理器接管。在管理员 PowerShell 中执行:

sc create sshd start= auto binPath= "C:\OpenSSH-Win64\Bin\sshd.exe -i" DisplayName= "OpenSSH Server"

这里有三处容易翻车。第一,sc create的参数在等号后面必须有一个空格,比如start= auto,写成start=auto会直接报语法错误。第二,binPath必须完整路径,并且要带-i参数。-i是让 sshd 以服务模式运行,通过标准输入输出和服务控制管理器通信,不加这个参数,服务虽然能创建,但启动后会立刻失败。第三,DisplayName可以自定义,它只是显示名称,和服务的内部名sshd无关。

执行成功后,系统会显示一条创建成功的提示。接着启动服务:

sc start sshd

也可以使用Start-Service sshd。如果要做开机自启,start= auto已经满足。想改成手动启动,把auto换成demand重新创建即可。查看服务当前状态执行sc query sshd,能看到 STATE 字段是否在 RUNNING。

3.3 防火墙与端口检查

服务启动后,先确认 22 端口真的在监听。有时候服务状态显示运行,但端口监听失败,原因可能是配置里端口被改过,或者 socket 绑定失败。在 PowerShell 中执行:

Get-NetTCPConnection -LocalPort 22 -State Listen

如果输出有内容,说明监听成功。如果没有任何输出,先去 Windows 事件日志里查看 sshd 相关的错误记录。确认监听后,放行防火墙规则,否则远程机器连不进来:

New-NetFirewallRule -Name "OpenSSH-Server" -DisplayName "OpenSSH Server (sshd)" -Enabled True -Protocol TCP -Action Allow -LocalPort 22

这条命令会新建一条入站允许规则,名字叫 OpenSSH-Server。如果你的 Windows 有多个网络配置文件(域、专用、公用),默认规则只对当前生效的配置文件生效,想全覆盖可以加参数-Profile Any。注意防火墙规则不需要重启服务,它会立刻生效。

3.4 查看日志与验证服务

如果服务启动失败,别慌,先看日志。Windows 上 OpenSSH 的日志通常写入系统事件日志,事件源是 OpenSSH。在 PowerShell 中执行:

Get-WinEvent -LogName Application -MaxEvents 50 | Where-Object { $_.ProviderName -like '*OpenSSH*' } | Format-List TimeCreated, Message

这样能快速定位启动阶段最直接的错误信息。另一个更粗暴的方法是前台调试模式:停止服务后,直接在终端运行C:\OpenSSH-Win64\Bin\sshd.exe -d,-d会把所有调试输出打印到当前终端,包括读取了哪个配置文件、密钥文件生成是否成功、socket 绑定是否成功等。这个办法几乎百试百灵,比在事件日志里猜原因快得多。调试完按 Ctrl+C 关掉,再重新启动服务即可。

4. 客户端连接与密钥免密:日常操作效率翻倍

4.1 ssh-keygen 生成密钥并部署公钥

服务端跑起来后,客户端才能发挥价值。先在自己的机器上生成一对密钥:

ssh-keygen.exe -t ed25519 -C "dev-laptop"

-t指定算法,ed25519 是我现在首选的类型,安全性高、密钥短、生成速度快。如果你要连接的服务器老到不支持 ed25519,那就改用-t rsa -b 4096。-C是注释,一般填个人标识,方便你区分多个机器的公钥。执行后它会让你确认保存路径,默认是C:\Users\你的用户名\.ssh\id_ed25519,可以直接回车。接着会要求设置 passphrase,也就是私钥的口令,建议一定要设置,这样偷走私钥的人也无法立刻使用。

生成后,公钥文件是id_ed25519.pub。部署到 Linux 服务器时,标准操作是用 ssh-copy-id,但 Windows 没有这个命令,可以用一条管道命令代替:

type $env:USERPROFILE\.ssh\id_ed25519.pub | ssh user@remote "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"

这条命令把公钥通过 SSH 发送到远程服务器,并在远程执行创建目录、追加公钥、设置权限三个动作。如果远程服务器是 Windows 的 OpenSSH 服务端,那么路径就不是~/.ssh了,而是对应用户家目录下的.ssh\authorized_keys,权限要求也略有不同,这一点后面避坑章节会专门讲。

4.2 用 config 文件管理多个服务器

当你管理的服务器多起来,每次连接都敲完整地址很浪费生命。在用户目录的.ssh文件夹下建一个文件,命名为config,没有扩展名。这个文件的内容是这样的:

Host mylab HostName 192.168.1.102 User dev Port 22 IdentityFile ~/.ssh/id_ed25519 ServerAliveInterval 60

保存后,直接执行ssh mylab就能连上对应服务器。config 文件里还可以写更多参数,比如Compression yes开启压缩,TCPKeepAlive yes保持连接,ProxyJump设置跳板机等。有一个细节值得注意:IdentityFile路径里的~会被替换成当前用户的目录,这在 Windows 上同样有效,但如果你在配置文件里写 Windows 风格的绝对路径,务必使用正斜杠或者转义反斜杠。

config 文件的另一个作用是区分不同跳板策略。比如公司内部服务器要通过堡垒机访问,你可以单独设置一个ProxyJump参数,这样一个ssh命令就能直接穿过堡垒机落到目标机器,省去先登录堡垒机再手动敲目标的步骤。这个文件配置好之后,建议把权限设置成仅当前用户可读写,避免其他用户看到你的连接信息。

4.3 本地端口转发与远程端口转发

端口转发是 SSH 里最实用的功能,尤其在调试数据库或内网 Web 服务时。本地转发的含义是:把本地某个端口的数据,通过 SSH 隧道转发到远端服务器视角下的某个目标地址。命令格式:

ssh -L 3306:10.0.0.5:3306 user@jump-server

执行后,本地的 3306 端口会监听,所有连到127.0.0.1:3306的流量都会被隧道传到jump-server,然后由 jump-server 去连接它内网的10.0.0.5:3306。这里的“目标主机”是从 jump-server 的角度解析的,这一点很关键。如果写错了,就会连到错误的内网机器。

更安静的后台方式是加两个参数:

ssh -N -L 3306:10.0.0.5:3306 user@jump-server -f

-N表示不执行远程命令,只建隧道;-f让 ssh 放到后台运行。注意 Windows 上-f配合-N有时候不会真正后台化,终端还可能挂在那里,所以我个人的习惯是配合 Windows Terminal 开启新会话,或者用 PowerShell 的后台任务来处理,而不用-f。

远程转发-R的方向相反,是把本机的端口暴露给远程服务器,让远程服务器上的程序能访问你本机的某个服务。这在做外部回调调试、内网穿透时非常有用。远程转发能否成功,取决于远程 sshd_config 是否开启AllowTcpForwarding,默认是开启的,但不少安全加固配置会把它关闭。如果发现转发不生效,优先去检查服务端的这个参数。

4.4 scp/sftp 文件传输技巧

日常传文件,scp 和 sftp 是最直接的命令。scp 的语法和 Linux 完全一致:

scp localfile.txt user@remote:/home/user/

反方向传回来:

scp user@remote:/home/user/remotefile.txt C:\Users\me\Download\

但 Windows 下的 scp 有一个小坑:当本地路径里有空格时,需要加上引号包住整个路径,并且要对反斜杠做转义。比如C:\My Backups\data.zip在 PowerShell 中直接传给 scp,最好改成'C:\My Backups\data.zip'。如果你要传输整个目录,加-r参数:

scp -r C:\project\dist user@remote:/opt/app/

sftp 则是交互式操作,适合进了远程目录里做多步文件操作。可以这样启动:

sftp user@remote

进入后你会看到 sftp 提示符,用put上传、get下载、ls查看远程目录、lcd切换本地目录。如果你不想配置文件传输脚本,sftp 交互模式反而是最直观的。不过要注意 Windows 的路径盘符和远程路径的写法完全不同,在 sftp 里使用!前缀可以执行本地命令,比如!dir查看本地目录,这样就不用开第二个窗口了。

5. OpenSSH-Win64.zip 实战避坑:5 个常见问题与解决方案

5.1 现象:sshd 启动后立即退出,服务没起来

你注册了服务,点了启动,几秒后服务状态变成已停止,什么提示都没有。这是我遇到最多的情况,一般来说原因是 host key 没生成。在解压后,如果你直接运行 sshd,它会到期望的目录里找主机密钥,找不到就报错退出。解决方法是先运行ssh-keygen.exe -A生成密钥,然后重启服务。如果生成后还是启动失败,就用前台调试模式跑一次:

C:\OpenSSH-Win64\Bin\sshd.exe -d

-d会输出所有日志,往往能看到类似“Could not load host key”或“bad permissions”的明确提示,照着提示去修即可。

5.2 现象:连接时提示 "Bad owner or permissions" 或拒绝密钥认证

公钥明明已经追加到远程的authorized_keys,但连接时还是提示密码登录,或者服务端日志报权限错误。这个问题的根源几乎都是 Windows 上的文件权限太宽。Windows NTFS 默认会给父目录继承权限,导致authorized_keys文件可能被其他用户或账号有读取权限,OpenSSH 的安全检查直接就拒绝使用这个文件。解决办法是只保留当前用户完全控制,去掉继承权限:

icacls C:\Users\Administrator\.ssh\authorized_keys /inheritance:r /grant:r "Administrator:F"

把命令里的Administrator换成你实际登录的用户名。执行完再重启 sshd,连接时就能用密钥了。在 Windows 上,几乎所有的密钥认证问题都可以先用这一招排查。

5.3 现象:scp 传输文件时,中文文件名变成乱码或直接失败

Windows 命令行默认的代码页是 GBK,而 Linux 服务器通常使用 UTF-8。当你用scp传输含中文的文件名时,两端的编码不一致,导致文件名传输后变成一串乱码,严重的时候直接报错。这其实不是 OpenSSH 的问题,而是 Windows 终端编码的问题。解决思路是让终端切换成 UTF-8 代码页,在 PowerShell 中先执行chcp 65001,然后再运行scp。但这个方法并不总是生效,因为 PowerShell 对 chcp 支持并不完美,更深层的做法是把 Windows 系统区域设置里的 Beta 版 UTF-8 支持打开,双重保险。最省心的方案还是把文件名保持为英文,中文名先压缩成 zip 再传,等到了远程再用 unzip 解压。

5.4 现象:启动 sshd 时提示端口 22 已被占用

当你使用独立包时,很可能机器上已经存在系统自带的 OpenSSH 服务,两个 sshd 抢同一个端口。错误日志通常显示bind: Address already in use。此时先检查占用进程:

Get-NetTCPConnection -LocalPort 22 -State Listen | Select-Object OwningProcess

拿到 PID 后,查看进程名:

Get-Process -Id <PID>

如果发现是 sshd,而且路径指向系统安装目录,说明系统自带服务在运行。解决方法是先停止系统服务,再启动独立包的服务,或者把独立包的监听端口改成一个非标准端口,比如 2222,然后在 ssh 连接时使用-p 2222。我建议在正式用途里尽量统一端口,避免混乱,因此先停掉系统自带服务是更干净的做法。

5.5 现象:登录回显的是 cmd.exe 而不是 PowerShell

通过 SSH 登录到 Windows 服务端后,得到的 shell 是cmd.exe,很多命令行为和你预想的不同,比如ls不识别。原因在于 OpenSSH 在 Windows 上默认使用系统注册的默认 shell,而 Windows 没有像 Linux 那样天然以 bash 作为标准 shell。解决办法是修改sshd_config,指定默认 shell:

DefaultShell C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe

修改后重启 sshd 服务,再次连接,shell 就会变成 PowerShell。如果你安装了 Git Bash,想把默认 shell 设为 bash,可以写成:

DefaultShell C:\Program Files\Git\bin\bash.exe

注意路径中如果有空格,必须用引号包住,但 sshd_config 的语法对引号比较严格,实在不行就选一个不带空格的路径。这个配置改完之后,你就能在 Windows 服务端上获得和 Linux 终端接近的体验。

5.6 排查流程:三步定位启动失败原因

如果你遇到前面没有覆盖的问题,建议按这个顺序排查。第一步,先确认 host key 存在,ssh-keygen -A跑一遍没有坏处。第二步,用前台调试模式运行 sshd,看-d输出的报错,这是最快最直接的信息来源。第三步,如果调试输出看不出问题,回去检查sshd_config里的路径和权限,以及authorized_keys文件权限。我把这三步总结为一个习惯:只要是 sshd 起不来,先从 host key 和文件权限开始查,别去瞎改防火墙。按照这个顺序,90% 的问题都能自愈。

6. 验证和进阶:一键自检脚本与 ssh-agent 使用技巧

6.1 一行脚本检查整个链路

环境配置好后,我习惯把自检过程写成一个小脚本,存成check.ps1,每次移动目录或备份后先跑一遍,确认没有缺东西。这个脚本会检查几个最关键的点:

$bin = "C:\OpenSSH-Win64\Bin" $exes = @("ssh.exe","sshd.exe","ssh-keygen.exe","scp.exe") foreach ($e in $exes) { if (Test-Path "$bin\$e") { Write-Host "$e OK" } else { Write-Host "$e MISSING" } } $svc = Get-Service sshd -ErrorAction SilentlyContinue if ($svc) { Write-Host "sshd service state: $($svc.Status)" } $listener = Get-NetTCPConnection -LocalPort 22 -State Listen -ErrorAction SilentlyContinue if ($listener) { Write-Host "Port 22 is listening" } else { Write-Host "Port 22 NOT listening" }

这个脚本不涉及具体用户,只是检查二进制文件、服务状态、监听端口。如果你把 OpenSSH 目录放在别处,把$bin改成对应的Bin路径即可。每次新环境拿到这个包时,我会先跑一遍这个脚本,确认一个干净的基线,再开始修改配置。

6.2 用 ssh-agent 缓存密钥,告别频繁输口令

如果私钥设置了 passphrase,每次 SSH 连接都要输一次口令,尤其在跑循环脚本时非常烦人。ssh-agent 可以帮你把密钥缓存在内存中,当前会话内不再重复输口令。Windows 上如果系统有 ssh-agent 服务,先启动它并设为自动:

Start-Service ssh-agent Set-Service ssh-agent -StartupType Automatic

然后加入私钥:

ssh-add $env:USERPROFILE\.ssh\id_ed25519

输入一次 passphrase,后续的所有 ssh 连接在这个登录会话中都不再询问。但注意,ssh-agent 缓存不跨重启,重新登录后需要再 add 一次。如果你不想每次手动输,可以把ssh-add写进 PowerShell 的启动脚本,但这样做有个前提:机器是个人专用,且你信任当前会话环境。

6.3 进阶玩法:把 OpenSSH 目录做成绿色工具箱

把整个 OpenSSH-Win64 目录放在一个固定位置,然后把路径写进项目配置,这样就得到一个“绿色工具箱”。比如你在做自动化部署,需要从 Windows 调用 scp 上传文件,那么直接在脚本里引用C:\OpenSSH-Win64\Bin\scp.exe,不必依赖系统 PATH,也不会因为用户切换而找不到命令。我把这种方式用在多个项目中,每次迁移环境只需要拷贝目录,重新注册一次 sshd,其他配置基本不动。这也侧面说明了独立包在 Windows 上真正的价值:它让你能把一个完整工具链放进自己的项目结构里,随走随带。

最后说下我的习惯:每次拿到新的 OpenSSH-Win64.zip,我都会先解压到固定目录,跑一遍自检脚本确认二进制完整,再生成 host key,然后注册服务。之后修改任何配置前,先复制一份原始sshd_config备份,防止改出问题时找不到回退。这套流程跑顺后,你会发现在 Windows 上维护 SSH 并没有想象中那么玄学,很多问题都是权限和路径的细节。希望这篇能帮到你。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/13 3:33:48

解决Java groupingBy分组乱序:LinkedHashMap与TreeMap用法详解

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/13 3:33:41

信息学奥赛一本通题目数据获取与本地评测实战指南

简介&#xff1a;面向信息学奥赛&#xff08;NOI/NOIP&#xff09;备赛者与C算法学习者&#xff0c;资料围绕《信息学奥赛一本通》的题目数据整理而成&#xff0c;可用于日常自测、刷题巩固和查漏补缺。除配套书本的练习数据外&#xff0c;包内还收录了一些不在教材中的补充题目…

作者头像 李华
网站建设 2026/10/13 3:30:11

C++面试必问:memcpy、strlen、sort、vector扩容底层实现与优化逻辑

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/13 3:29:06

中望CAD二次开发:C++与Qt组合的插件开发实践指南

简介&#xff1a;这是一份面向CAD二次开发入门者的中望CAD&#xff08;ZWCAD&#xff09;扩展开发示例工程&#xff0c;基于C与QT 5.12构建&#xff0c;在Visual Studio 2015环境中编译运行&#xff0c;并附带了完整的VS与QT配置工具链说明。示例通过一个简单的QT对话框集成到C…

作者头像 李华