作者:陈计节

个人博客: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. vue 导航守卫,验证是否登录

    路由跳转前,可以用导航守卫判断是否登录,如果登录了就正常跳转,没有登录就把路由指向登录页面. router.beforeEach((to, from, next) => { const next ...

  2. 安装 redis 拓展

    PHP API 20121113 PHP Extension 20121212 Zend Extension 220121212 Zend Extension Build API220121212,T ...

  3. redis_字典_哈希hash

    字典.哈希表基本数据结构 redis字典使用哈希表作为底层实现,基本结构就是数组+散列 typedef struct dictht { // 哈希表数组 dictEntry **table; // 哈 ...

  4. jsp(web作业)

    一:jsp简介 SP即Java Server Pages,它和servlet技术一样,都是sun公司定义的一种用于开发动态web资源的技术.该技术的最大特点在于:写JSP就像写html,但它相比htm ...

  5. cvb源码分析,resful规范,drf,drf序列化组件,95

    1 CBV的源码分析 -Class Base View(基于类的视图) -Function Base View(基于函数的视图) -def as_view 类方法 -def view:类方法内部,闭包 ...

  6. HDU 2147 P/N博弈

    点这里去做题 如图 找必胜点和必败点, 1.终点为必胜点 2.所有能一步走到必胜点的都是必败点 3.每一步都只能走到必败点的是必胜点 #include<bits/stdc++.h> usi ...

  7. 【备忘】ASP.NET MVC 5 升级到 ASP.NET Core MVC 的部分变化

    正在将一个 .net 4.5 的项目(MVC 5)升级到 .net core 2.1,中间遇到了许多的修改,记在下面,帮大家少走弯路. System.Drawing 下面很多类已经不存在(如Bitma ...

  8. HNOI2019退役记

    退役 警告. 今年虽然我没有变强, 但是还是比去年强一点(去年树形dp都不会). Day0 明天就是省选了,晚上22:13还没有睡觉,真的是状态不好. 打了一下LCT的板子,发现终于理解了...(这叫 ...

  9. ADB驱动

    Windows 7 64位下使用ADB驱动 什么是ADB? adb的全称为Android Debug Bridge,就是起到调试桥的作用.通过adb我们可以在Eclipse中方面通过DDMS来调试An ...

  10. 微信小程序开发用户授权登录

    用wx.login获取登录凭证code <!--pages/user/index.wxml--> <view hidden='{{boolean}}'> <view wx ...