Windows Server 2016 安装OpenSSH Server,并设置密钥

本文详细记录了在未激活的Windows Server 2016虚拟机上安装OpenSSHServer的困难过程,包括通过Windows设置、PowerShell和手动安装的步骤,并重点介绍了密钥认证的配置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

安装 OpenSSH Server

官方文档
安装 OpenSSH

本人使用了 VirtualBox 虚拟安装的 windows server 2016 ,没有激活
也许是因为没有激活的原因,按照官方文档的 2 个安装方式都失败了!

简单记录失败情况

  1. 使用 Windows 设置来安装 OpenSSH

    打开“设置”,选择“应用”>“应用和功能”,然后选择“可选功能”,在页面顶部选择“添加功能”,我这里根本找不到 OpenSSH 字样的东西

  2. 使用 PowerShell 安装 OpenSSH
    执行 PS 命令:Get-WindowsCapability

     Get-WindowsCapability -Online | Where-Object Name -like 'OpenSSH*'
    

    最初总是返回错误:无法下载源文件!
    然后去 Windows update ,也没有发现多处来什么补丁,后来在执行 PS 命令居然就不报错了!

    可是 Get-WindowsCapability -Online | Where-Object Name -like ‘OpenSSH*’

    没有任何返回!既不说有,也不说没有,什么鬼?

    直接执行安装命令

    Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0

    这个倒是和文档中一样,返回结果如下

     Path          :
     Online        : True
     RestartNeeded : False
    

    但是,执行启动服务的指令 Start-Service sshd ,不认识!
    查询系统组件服务也没有看到 OPENSSH

手动安装 OpenSSH Server

OpenSSH 官方仓库
PowerShell/Win32-OpenSSH

  1. 到仓库下载 OpenSSH-Win64.zip

  2. 然后解压到 C:\Program Files

  3. 使用 PS 查看内容的结果如下
    zip 解压后,会有一层目录嵌套,可以自行解套

    PS C:\Program Files> cd .\OpenSSH-Win64
    PS C:\Program Files\OpenSSH-Win64> ls

         目录: C:\Program Files\OpenSSH-Win64
     
     
     Mode                LastWriteTime         Length Name
     ----                -------------         ------ ----
     -a----  2021/5/27 星期四   上午 0          15279 FixHostFilePermissions.ps1
                                   :09
     -a----  2021/5/27 星期四   上午 0          14305 FixUserFilePermissions.ps1
                                   :09
     -a----  2021/5/27 星期四   上午 0          16853 install-sshd.ps1
                                   :09
     -a----  2021/5/27 星期四   上午 0        1787800 libcrypto.dll
                                   :10
     -a----  2021/5/27 星期四   上午 0          19452 LICENSE.txt
                                   :09
     -a----  2021/5/27 星期四   上午 0         570768 moduli
                                   :09
     -a----  2022/2/24 星期四  下午 14           3123 openssh-events.man
                                   :38
     -a----  2021/5/27 星期四   上午 0          14035 OpenSSHUtils.psd1
                                   :09
     -a----  2021/5/27 星期四   上午 0          41721 OpenSSHUtils.psm1
                                   :09
     -a----  2021/5/27 星期四   上午 0         323456 scp.exe
                                   :10
     -a----  2021/5/27 星期四   上午 0         329616 sftp-server.exe
                                   :10
     -a----  2021/5/27 星期四   上午 0         400784 sftp.exe
                                   :10
     -a----  2021/5/27 星期四   上午 0         509304 ssh-add.exe
                                   :10
     -a----  2021/5/27 星期四   上午 0         396176 ssh-agent.exe
                                   :10
     -a----  2021/5/27 星期四   上午 0         722296 ssh-keygen.exe
                                   :10
     -a----  2021/5/27 星期四   上午 0         571256 ssh-keyscan.exe
                                   :10
     -a----  2021/5/27 星期四   上午 0         157048 ssh-shellhost.exe
                                   :10
     -a----  2021/5/27 星期四   上午 0        1066872 ssh.exe
                                   :10
     -a----  2021/5/27 星期四   上午 0        1127312 sshd.exe
                                   :10
     -a----  2021/5/27 星期四   上午 0           2297 sshd_config_default
                                   :10
     -a----  2021/5/27 星期四   上午 0          13972 uninstall-sshd.ps1
                                   :10
    

    可以看到 ssh 相关的命令都已经在这里了,可以直接运行的!
    其中 install-sshd.ps1 是安装文件

  4. 为了执行方便,加入到系统环境变量中

    增加一个变量名 OPENSSH
    变量值: C:\Program Files\OpenSSH-Win64

在这里插入图片描述

给 Path 增加一项 %OPENSSH%

在这里插入图片描述

  1. 安装 sshd 服务

    打开 PS ,执行以下命令

    powershell.exe -ExecutionPolicy Bypass -File install-sshd.ps1

       [*] C:\Program Files\OpenSSH-Win64\moduli
           looks good
     
     [SC] SetServiceObjectSecurity 成功
     [SC] ChangeServiceConfig2 成功
     [SC] ChangeServiceConfig2 成功
     sshd and ssh-agent services successfully installed
    

    安装之前最好推出 360或防火墙之类,安装图示如下:
    在这里插入图片描述

  2. 启动 sshd 服务

    启动 sshd 服务
    net start sshd
    或者
    Start-Service sshd

    停止 sshd 服务
    net stop sshd
    或者
    Stop-Service sshd

    设置成自动
    Set-Service -Name sshd -StartupType ‘Automatic’

    开启防火墙

     netsh advfirewall firewall add rule name=sshd dir=in action=allow protocol=TCP localport=22
    

    以上操作和官方文档介绍的命令实际是一样的

    虽然安装官方文档没法安装,但是,后续的命令还是有效的

     # Start the sshd service
     Start-Service sshd
     
     # OPTIONAL but recommended:
     Set-Service -Name sshd -StartupType 'Automatic'
     
     # Confirm the Firewall rule is configured. It should be created automatically by setup. Run the following to verify
     if (!(Get-NetFirewallRule -Name "OpenSSH-Server-In-TCP" -ErrorAction SilentlyContinue | Select-Object Name, Enabled)) {
         Write-Output "Firewall Rule 'OpenSSH-Server-In-TCP' does not exist, creating it..."
         New-NetFirewallRule -Name 'OpenSSH-Server-In-TCP' -DisplayName 'OpenSSH Server (sshd)' -Enabled True -Direction Inbound -Protocol TCP -Action Allow -LocalPort 22
     } else {
         Write-Output "Firewall rule 'OpenSSH-Server-In-TCP' has been created and exists."
     }
    
  3. 确认 openssh 服务
    在这里插入图片描述

  4. 测试 ssh 连接

    $ ssh Administrator@192.168.1.101 -p 2222
    提示输入密码,就代表 ok !

设置密钥登录

官方文档
OpenSSH 密钥管理

  1. 首先修改 sshd_config 配置文件

    因为 ProgramData 是一个隐藏文件,还是使用 PS 命令来的简单!

    PS C:\Users\Administrator> cd /
    PS C:> ls -ah
    PS C:\ProgramData> cd .\ssh
    PS C:\ProgramData\ssh> ls

         目录: C:\ProgramData\ssh
     
     
     Mode                LastWriteTime         Length Name
     ----                -------------         ------ ----
     d-----  2022/2/24 星期四  下午 14                logs
                                   :40
     -a----  2022/2/24 星期四  下午 16            452 administrators_authorized_ke
                                   :08
     -a----  2022/2/24 星期四  下午 17              5 sshd.pid
                                   :05
     -a----  2022/2/24 星期四  下午 14           2312 sshd_config
                                   :56
     -a----  2022/2/24 星期四  下午 14           1393 ssh_host_dsa_key
                                   :40
     -a----  2022/2/24 星期四  下午 14            612 ssh_host_dsa_key.pub
                                   :40
     -a----  2022/2/24 星期四  下午 14            513 ssh_host_ecdsa_key
                                   :40
     -a----  2022/2/24 星期四  下午 14            184 ssh_host_ecdsa_key.pub
                                   :40
     -a----  2022/2/24 星期四  下午 14            411 ssh_host_ed25519_key
                                   :40
     -a----  2022/2/24 星期四  下午 14            104 ssh_host_ed25519_key.pub
                                   :40
     -a----  2022/2/24 星期四  下午 14           2610 ssh_host_rsa_key
                                   :40
     -a----  2022/2/24 星期四  下午 14            576 ssh_host_rsa_key.pub
    

    PS C:\ProgramData\ssh> notepad .\sshd_config
    找到 #PubkeyAuthentication yes ,去掉注释即可

  2. 重启 sshd 服务
    Stop-Service sshd
    Start-Service sshd

  3. 配置公钥

    按照惯性思维,开始直接将公钥放在了 C:\Users\Administrator.ssh ,结果死活不对!

    阅读文档发现有这句话:

    AuthorizedKeysFile
    默认值为“.ssh/authorized_keys .ssh/authorized_keys2”。 如果路径不是绝对路径,则它相对于用户的主目录(或配置文件图像路径)。 示例: c:\users\user。 请注意,如果用户属于管理员组,则改为使用 %programdata%/ssh/administrators_authorized_keys。

    原来是要放在这里:

    %programdata%/ssh/administrators_authorized_keys
    而且文件名也必须是: administrators_authorized_keys

    还在刚才修改 sshd_config 的同样目录

    PS C:\ProgramData\ssh> notepad.exe .\administrators_authorized_keys

    cp 粘贴自己的公钥即可
    使用 scp (ssh-copy-id)会复制到 C:\Users\username.ssh\authorized_keys

注意: notepad 保存文件的时候,总会带上.txt 后缀,必须去掉!

  1. 再来测试 ssh 连接

$ ssh Administrator@192.168.1.101 -p 2222
不再需要密码了!

  1. 测试一下 SFTP

$ sftp -P 2222 Administrator@192.168.1.101

或者
直接打开一个 Fz 程序,建立一个站点
在这里插入图片描述

<think>好的,我现在需要解决用户的问题:前端如何接收以PK\u0003\u0004开头的xlsx文件实现自动下载。首先,我需要理解用户提到的PK\u0003\u0004是什么。其实,PK是ZIP文件的魔术头,而XLSX文件本质上是一个ZIP压缩包,所以文件开头会有PK\x03\x04这样的标识。这可能意味着后端返回的是二进制文件流,前端需要正确处理这种数据流触发下载。 接下来,用户提到的引用内容中有几个关键点。引用[2]和[3]提到使用js-file-download库和fetch处理文档流。这提示我需要在前端将接收到的二进制数据转换为Blob对象,然后创建URL对象,模拟点击下载。同时,需要设置正确的Content-Type,比如application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,这样浏览器才能正确识别文件类型。 然后,考虑如何检测文件是否以PK开头。通常,前端的Blob对象可以通过读取前几个字节来验证,但由于用户可能希望直接下载而不做复杂处理,或许这一步可以省略,直接信任后端返回的数据。但如果有必要,可以通过读取ArrayBuffer来检查文件头。 另外,引用[1]提到直接使用a标签链接到后端接口,但这种方法可能不适用于需要处理文件流或添加认证头的情况。因此,更常见的是使用fetch或Axios发送请求,携带必要的headers,如Authorization,在响应中处理二进制数据。 可能遇到的问题包括:跨域配置是否正确、响应头是否包含Content-Disposition(建议后端设置filename),以及正确处理Blob类型。此外,确保在请求时设置responseType为'blob',避免将二进制数据解析为JSON或其他格式,这可能导致损坏文件。 总结步骤:使用fetch或Axios获取文件流,处理响应为Blob,创建临时URL,触发下载。代码中需要引入js-file-download或类似库,或者在原生JS中创建a标签模拟点击。同时,处理可能的错误情况,比如网络错误或后端返回错误信息。</think>### 前端接收以 `PK\u0003\u0004` 开头的 XLSX 文件自动下载的方法 1. **理解文件类型与数据格式** XLSX 文件本质上是 ZIP 格式的压缩包,其文件头为 `PK\x03\x04`(即 ZIP 魔术头)。若后端返回的数据以 `PK\u0003\u0004` 开头,说明是二进制文件流。前端需正确处理二进制数据触发下载。 2. **使用 `fetch` 或 `axios` 接收文件流** 通过 `fetch` 或 `axios` 发送请求时,需设置 `responseType: 'blob'`,确保正确接收二进制数据: ```javascript fetch('后端接口地址', { method: 'GET', headers: { 'Authorization': 'Bearer token' // 若需认证 }, responseType: 'blob' // 关键参数 }) .then(response => response.blob()) .then(blob => { // 处理下载逻辑 }); ``` 3. **创建 Blob 对象触发下载** 将接收的二进制数据转换为 Blob 对象,生成临时 URL 模拟点击下载: ```javascript const url = window.URL.createObjectURL(new Blob([blob], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' })); const link = document.createElement('a'); link.href = url; link.setAttribute('download', 'filename.xlsx'); document.body.appendChild(link); link.click(); document.body.removeChild(link); window.URL.revokeObjectURL(url); ``` 4. **使用 `js-file-download` 简化流程(推荐)** 安装库 `npm install js-file-download`,直接调用其方法: ```javascript import fileDownload from 'js-file-download'; fetch('后端接口地址') .then(response => response.blob()) .then(blob => { fileDownload(blob, 'filename.xlsx'); }); ``` 5. **验证文件头(可选)** 若需确保文件有效性,可通过读取二进制数据前 4 字节验证是否为 `PK\x03\x04`: ```javascript blob.arrayBuffer().then(buffer => { const header = new Uint8Array(buffer.slice(0, 4)); if (header[0] === 0x50 && header[1] === 0x4B && header[2] === 0x03 && header[3] === 0x04) { console.log('Valid XLSX file'); } }); ``` **注意事项**: - 确保后端响应头包含 `Content-Disposition: attachment; filename="file.xlsx"`,以便浏览器自动识别文件名[^2]。 - 跨域请求需后端配置 `Access-Control-Expose-Headers: Content-Disposition`[^3]。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

哈哈虎123

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值