作者:陈计节

个人博客:https://blog.jijiechen.com/post/powershell-remoting/

在 Linux/Unix 世界里 SSH 是个好东西,SSH 是 Secure Shell 的缩写,用它可以很容易连接到指定的服务器,并执行特定命令行。除了支持远程终端,作为一种安全的通信协议,还为很多其他工具的提供安全通信功能(比如 Git)。

在本文里,SSH 主要指代的是基于 SSH 通信协议构建的安全终端连接。SSH 远程连接用起来非常简单,下面就是一个 ssh 的示例:



指定服务器地址,即可开启连接——简单到难以置信!然后,接下来的指令就是在目标机器上运行了。工作完成了,要断开连接?照常一个 exit 命令即可终止会话,就像关闭一个终端一样容易!



由于 SSH 本身是基于命令行环境的,所以如果要在一批远程服务器上执行任务也很容易,写一个 for 语句,很轻松就能完成:



于是,很多人发现,批量管理 Linux 服务器很轻松,即使没有那些功能大而全的工具,只要有管理(使用)单台服务器的经验,再加上 ssh 就可以轻松管理一个集群了。如果希望服务器能够通过远程管理,就需要在服务器上安装配置 openssh-server 了。这在 Linux 上基本也只是几个命令也就轻松搞定了。一切都是如此美好!

Windows 世界的远程管理

当类似的工作回到 Windows 上,人们首先想到的远程管理的方式是远程桌面连接,就是这个窗口:



远程桌面连接(RDP)也是一个神器,只要知道网络地址(机器名称),以及用户名和密码,就可以连接到任何一台 Windows 电脑上。连接建立之后,几乎就像在操作本地电脑一样地使用远程电脑。 在实践中我们发现,RDP 的表现相当不错。即使在网络不好的情况下,也能有良好的性能;远程操作的不光是桌面,还有剪贴板和音视频等丰富的资源。另外,RDP 的客户端也是很丰富,不但可以跨平台(包括 macOS、Linux 和手机平板电脑等),还有很多能同时连接多个电脑的工具。下面是在 Mac 上连接 Windows 服务器的效果:

基于 WinRM 的 PowerShell Remoting

既然 Windows 上的图形界面无法提供批量的远程管理能力,那么命令行界面呢? 等一等,Windows 的命令行界面?Windows 有命令行界面吗? 大概不少人会有这样的疑问。答案不言自明,Windows 不光内置有命令行系统,而且很强大。只是大部分人不怎么用它而已。在早期,Windows 有命令提示符(cmd),后来 Windows 又添加了基于 .NET 的 PowerShell,大大强化了脚本化编程能力。

幸运的是,包括 PowerShell 的 Windows 的命令行体系提供了完善的远程连接和批量执行的能力。与 SSH 类似,PowerShell Remoting 也只需要知道服务器地址,就可以轻松连接;而要结束会话,也是一样的 exit 命令:



另外,PowerShell 中不少命令还专门为远程执行提供了优化,比如 Invoke-Command 等。下面的代码查询两台远程计算机的界面语言(代码引自文档):

Invoke-Command -ComputerName Server01, Server02 -ScriptBlock { Get-UICulture }

输出结果为:

LCID    Name     DisplayName               PSComputerName
---- ---- ----------- --------------
1033 en-US English (United States) server01.corp.fabrikam.com
1033 en-US English (United States) server02.corp.fabrikam.com

PowerShell Remoting 是基于 Windows 内置的远程管理技术 WinRM 提供的。如果希望 Windows 服务器能够通过远程管理,需要在服务器启用 WinRM,并配置防火墙规则:

Enable-PSRemoting -SkipNetworkProfileCheck -Force
Set-NetFirewallRule -Name "WINRM-HTTP-In-TCP-PUBLIC" -RemoteAddress Any

完成上述配置之后,客户端使用 PowerShell 就可以使用 Enter-PSSession 等命令连接到服务器上了。

配置无密码 的 PowerShell Remoting 体验

密码是一种简单直观,却不够安全的身份鉴别方法。说它不够安全,主要原因是对于集群中的大量服务器而言,如果要分别使用不同的密码,那么维护密码表就成为一项麻烦事了。但如果都用相同的密码,一旦密码泄漏,整个集群都陷入风险。所以不少人只好选一个折衷,为集群中的计算机使用统一密码的同时,又定时(比如每两个月)集中改一次密码。从而在便利和安全之间取得平衡。但始终,密码登录的方式是不够安全的。 在登录服务器时,SSH 支持使用密码,还支持使用证书公钥(public key)。证书公钥登录的原理是,管理员生成一对密钥,将公钥复制到服务器上,自己持有私钥并保护好私钥的内容。在需要连接服务器时,将在客户端用私钥与服务器进行一系列的登录验证后,开启安全的通信。由于公钥的公开并不会导致私钥(private key)的安全风险,所以这种登录方式并不会有泄漏风险。



PowerShell Remoting 的服务端 WinRM 支持两种无密码登录的方式。一种是使用客户端证书登录,身份验证过程与 SSH 很类似。另外它还支持借助 Active Directory 环境进行集中式登录。 要为 WinRM 开启客户端证书登录(Client Certificate),主要步骤有: 在服务端为 WinRM 启用 Client Certificate 登录功能 在服务端为 WinRM 启用 HTTPS 支持,设置防火墙规则 在客户端生成证书,并将证书的公钥(public key)导入到服务器上,并映射到指定的服务器上的用户 在客户端将证书导入本地计算机 使用证书连接到服务器 这些步骤并不复杂,却也没有像配置 SSH 服务端那么简单。所以我把这些脚本都写好了,请转到 GitHub 查看和下载。这里有一篇文章详细介绍了各步骤中要使用的命令。



除了基于 WinRM 的客户端证书登录,新版本的跨平台 PowerShell 6 还支持基于 OpenSSH 直接提供与 Linux 服务器上的 SSH 完全一致的体验。请转到官方文档了解具体配置方法,更多关于 PowerShell Remoting 的资料,还可以参考这本电子书

在服务器上启用了 WinRM 之后,不光可以支持 PowerShell Remoting 功能,还能为 Windows 服务器提供其他众多远程管理功能。比如,著名的自动化配置软件 Ansible 就可以使用 PowerShell Remoting 一样的方式来为 Windows 服务器提供自动化配置能力,同时也很好地支持了上面介绍的客户端证书登录。 事实证明,经过上述简单的配置,也可以很轻松地对 Windows 服务器进行批量的自动化管理了。

Windows 上的 SSH?使用 PowerShell Remoting 远程管理 Windows 服务器的更多相关文章

  1. 在windows上通过ssh远程链接linux服务器[转]

    本文分别转自 [http://jingyan.baidu.com/article/6d704a130de40e28db51cab5.html] [http://www.cnblogs.com/mliu ...

  2. 第三章 用 PowerShell 进行远程管理(remoting)

    第三章 用 PowerShell 进行远程管理(remoting) PowerShell V2 引进了一项强大的新技术,远程(remoting),PowerShell V3 进行了完善和扩展.主要基于 ...

  3. [Linux] 在 Ubuntu 19.10 上开启 SSH 服务并允许远程登录

    在 Ubuntu 19.10 上安装 SSH,并开启服务 0.检查并确认系统当前是否已安装SSH: sudo ps -e | grep ssh 如果只有 ssh-agent 说明 ssh-server ...

  4. [转帖]Ansible批量远程管理Windows主机(部署与配置)

    2018-09-12 12:04:42 https://blog.51cto.com/7424593/2174156 一.测试环境介绍 Ansible管理主机: 系统:   CentOS6.8 IP ...

  5. Ansible批量远程管理Windows主机(部署与配置)

    一.测试环境介绍 Ansible管理主机: 系统:   CentOS6.8 IP Addr: 172.16.10.22 Linux管理服务器需安装pip.pywinrm插件 Windows客户端主机: ...

  6. 2019/01/17 基于windows使用fabric将gitlab的文件远程同步到服务器(git)

    觉得django项目把本地更新push到gitlab,再执行fabric脚本从gitlab更新服务器项目挺方便的,当然从本地直接到服务器就比较灵活. 2019/01/17 基于windows使用fab ...

  7. 使用OpenSSH远程管理Linux服务器

    一.使用OpenSSH远程管理Linux服务器 sshd是OpenSSH的服务器端守护进程,与之对应的Windows下客户端软件有SecureCRT/Xshell/PuTTY等. OpenSSH一般为 ...

  8. Windows上安装配置SSH教程(6)——综合应用:在Windows上实现SSH远程登陆与文件传输

    ----------------- 声明:本教程现已经弃用.由于客户端同时安装Cygwin和OpenSSH for Windows会出现问题(Cygwin的shell下无法使用ssh命令),建议直接在 ...

  9. 在windows上搭建SSH服务踩过的坑

    前两天安装了windows操作系统,想在windows上做内网穿透,所以就想在windows下启用ssh服务,今天就来讲一下我在搭建ssh服务中遇到的坑. 我显示在Mac下搭建了ssh服务,并且测试通 ...

随机推荐

  1. Unity自动切割动画

    最近在开发项目时,需要处理大量的动画,于是就网上查找资料,然后写了这么编辑器工具: 就是在模型导入时,根据配置文件自动切割动画. 首先我们需要封装两个类:一个模型类和一个动画类 public clas ...

  2. ABAP接口之Http发送json报文

    abap 调用http 发送 json 测试函数 SE11创建结构:zsmlscpnotice SE37创建函数:zqb_test_http_fuc1 FUNCTION zqb_test_http_f ...

  3. 查询树节点、oracle、select...start with...connect by prior...

    通过子节点向根节点追朔. select * from persons.dept start with deptid=76 connect by prior paredeptid=deptid 通过根节 ...

  4. 闵可夫斯基和(Mincowsky sum)

    一.概述 官方定义:两个图形A,B的闵可夫斯基和C={a+b|a∈A,b∈B}通俗一点:从原点向图形A内部的每一个点做向量,将图形B沿每个向量移动,所有的最终位置的并便是闵可夫斯基和(具有交换律) 例 ...

  5. web专业课学习及往后方向发展

    日常10点起床!!!! web主要是网页设计,目前自我方向是学习web前端开发,熟悉掌握相关的编辑应用已达到能设计出满意的网页,日后继续学习后端等 ,成为全栈工程师.

  6. Koa 学习笔记

    开始 就像官网上说的,一切框架都从一个"Hello World"开始,首先我们新建一个 package.json,内容尽量简单: { "name": " ...

  7. shell 命令 grep -R 查询包含指定内容的文件

    grep -R 举个栗子,在有上百个sql文件的目录下,查找使用 spark引擎 执行的文件. 代码是: grep -R spark ./* 返回的就是包含  spark 的sql文件名.

  8. Windows的奇巧淫技(为什么GIF显示不出来??)

    谁的电脑里没点小秘密?东藏西藏到最后自己都找不到了有木有?今天教大家个隐藏文件的高招: 将任意文件隐藏到图片中!怎么样?再也不用建什么「马列主义哲学」的文件夹啦!

  9. centos 7 默认图形界面(或者字符界面)启动

    1.切换到管理员用户 2.systemctl get-default命令获取当前模式(可以省去) 3.systemctl set-default graphical.target 修改启动模式(修改为 ...

  10. Entity Framework 自动生成代码 如何用继承

    分部类 用接口