瞎折腾系列:windows服务器远程部署探索,windows服务器安装Openssh

最近在折腾windows服务器远程部署,尝试自动部署的时候踩了一些坑,因此记录一下

远程停止和启动windows服务

稍微了解windows机器的人都知道使用SC命令可以启动和停止服务,但是对于一台远程的机器来说如何停止和启动远程机器的服务呢?我们需要使用WinRm。

WinRm————Windows 远程管理 (WinRM) 是 WS-Management 协议的 Microsoft 实现,该协议是标准简单对象访问协议 (基于 SOAP) 的防火墙友好协议,允许不同供应商的硬件和操作系统之间进行互操作。

官方文档

WS-Management协议规范为系统提供了一种跨 IT 基础结构访问和交换管理信息的常用方法。 WinRM 和 智能平台管理接口 (IPMI) 标准,以及 事件收集器服务 是称为 硬件管理的功能集的组件。
WinRM的默认端口是5985-http,5986-https, 使用的时候可能需要开通防火墙。

WinRm踩坑一:https 和http问题

WinRM是基于SOAP的远程控制协议,但是实际使用的时候,只用http的时候出现下面的错误:

1
2
Connecting to remote server xxx.xxx.xxx.xxx failed with the following error message : The WinRM client cannot process the request. If the authentication scheme is different from Kerberos, or if the client computer is not joined to a domain, then HTTPS transport must be used or the destination machine must be added to the TrustedHosts configuration setting. Use winrm.cmd to configure TrustedHosts. Note that computers in the TrustedHosts list might not be authenticated. You can get more information about that by running the following command: winrm help config. For more information, see the about_Remote_Troubleshooting Help topic.


从报错信息可以知道,如果不在同一个windows AD域下的两台机器,如果执行WinRM的远程调用必须使用HTTPS端口,
而不巧的是我的两台机器就是不同域的,所以必须使用HTTPS。

WinRm踩坑二:HTTPS证书问题

当尝试使用WinRM开启https服务的时候,发现windows机器没有安装自己的证书,那么就需要安装证书:
直接安装证书的powershell命令是New-SelfSignedCertificate,微软的文档地址是:

https://learn.microsoft.com/en-us/powershell/module/pki/new-selfsignedcertificate?view=winserver2012-ps

1
New-SelfSignedCertificate -DnsName x.x.x.x -CertStoreLocation cert:\LocalMachine\My

x.x.x.x表示证书的common name,用于做host认证的。

装完证书之后就是启动winRm的https服务了,powershell命令是:

1
winrm create winrm/config/Listener?Address=*+Transport=HTTPS '@{Hostname="x.x.x.x"; CertificateThumbprint="AAAAA14A4EEB259CC87C37942D82D8FF173807C4"}'

这里的AAAAA14A4EEB259CC87C37942D82D8FF173807C4是证书的指纹,在上面的创建证书命令执行之后会得到

windows服务器传输文件问题

当使用windows服务器的时候,肯定会需要传输文件到windows服务器的指定目录去,理所当然的以为只要有账号和密码就能传输文件到指定目录去,但是使用的时候有以下错误:

1
windows file copy System.ComponentModel.Win32Exception (0x80004005): The network name cannot be found

原因还是两台windows机器不在同一个AD域,不能直接copy文件过去,通过设置文件共享也不行,共享文件必须指定AD域的。所以直接使用windows Rdp端口使用命令传输文件是不太可行了。
传输文件用ssh是很方便的,所以:

windows 服务器安装OpenSSH服务

安装方法如下:

  1. 下载微软开源的openssh

  2. 下载最新的二进制版本: Releases · PowerShell/Win32-OpenSSH

  3. 解压到C:\Program Files并重命名为OpenSSH

  4. 启动Window PowerShell 并进入C:\Program Files\OpenSSH目录

  5. 输入命令安装sshd和ssh-agent服务

    1
    powershell -ExecutionPolicy Bypass -File install-sshd.ps1
  6. 打开防火墙,开启22端口 (也可使用控制面板中防火墙 高级 进行设置)
    1
    netsh advfirewall firewall add rule name=sshd dir=in action=allow protocol=TCP localport=22
  7. 设置开机启动
    1
    2
    3
    Set-Service sshd -StartupType Automatic

    Set-Service ssh-agent -StartupType Automatic
  8. 启动服务
    1
    2
    3
    Start-Service sshd

    Start-Service ssh-agent

安装完成之后,使用putty测试,传输文件果然可行了!
putty