笔者在前文《Windows 支持 OpenSSH 了!》中介绍了 Windows 对 OpenSSH 支持的基本内容,本文在前文的基础上介绍一些 OpenSSH Server 的配置和常见用法。

以域用户身份登录

之前我们介绍了如何通过 Windows 本地用户的方式登录远程主机,下面看看如何以 Windows  域用户的方式登录:

> ssh domain\nickli@xa-crab
> ssh nickli@domain@xa-crab
> ssh -l nickli@domain xa-crab

上面的三种方式都可以通过域用户的身份登录的远程主机。个人比较喜欢第一种,第三种方式中的 -l 选项用来指定登录者的账号。
配置域用户通过公钥认证登录的方式与本地用户相同,请参考《Windows 支持 OpenSSH 了!》一文。

控制哪些用户和组可以连接到服务器

通过在 OpenSSH 服务的配置文件中添加 AllowGroups、AllowUsers、DenyGroups 和 DenyUsers 指令可以控制哪些用户和组可以连接到服务器。这些指令被处理的顺序为:DenyUsers、AllowUsers、DenyGroups,最后是 AllowGroups。这一点非常重要,如果我们只设置了一条 AllowGroups sshusers 记录,那么不在 sshusers 组中的用户将无法登陆。所以我们可以创建一个用户组用来包含允许通过 ssh 登陆主机的用户,并在配置文件 C:\ProgramData\ssh\sshd_config 中添加对应的 AllowGroups 记录:

AllowGroups sshusers

注意:所有帐户名称必须是小写字母。

除了上面的基本用法,我们还可以通更灵活的配置来允许或拒绝符合某些条件的用户登录主机,下面是些常见的例子:

# 阻止与用户 contoso\nick 从 10.32.1.68 登录主机
DenyUsers contoso\nick@10.32.1.68
# 阻止所有 contoso 域中的用户登录主机
DenyUsers contoso\*
# 只允许 contoso\sshusers 域组中的用户登录主机
AllowGroups contoso\sshusers # 只允许本地用户 nick 从 10.32.1.68 登录主机
AllowUsers nick@10.32.1.68
# 只允许本地用户组 sshusers 中的用户登录主机
AllowGroups sshusers

使用 scp 命令拷贝文件

以前在 Windows 之间传递文件事件很让人抓狂的事情,现在有了 OpenSSH 加持,自然是能够支持以 scp 的方式在主机间拷贝文件,再加公钥认证,完美的支持自动化的文件拷贝操作。下面是一个简单的用 scp 拷贝文件例子:

> scp D:\grafana.tar.gz nick@xa-crab:c:\testdir

sftp 服务器

OpenSSH Server 默认开启 sftp 服务器功能,也就是说我们通过 22 号端口就可以通过 ftp 协议访问远程主机,下面是笔者通过 ftp 客户端工具 FileZilla 浏览远程主机文件系统的截图:

当然,你也可以使用命令行客户端 sftp,效果是一样的。

远程执行命令

笔者在《PowerShell 远程执行任务》一文中介绍过如何在 Windows 平台上远程执行 PowerShell 命令,相比通过 OpenSSH 远程执行命令,PowerShell 的方式实在是让人感觉笨拙!让我们来看看通过 OpenSSH 远程执行命令是何等的简练:

> ssh nick@xa-crab hostname
> ssh nick@xa-crab "hostname; pwd"

第一行命令远程执行 hostname 命令,结果显示远程主机的名称;第二行命令远程执行分号分隔的两条命令,显示远程主机的名称和当前的路径。

远程执行本地的脚本
由于 PowerShell 中不能把文件 attach 到 stdin,所以下面的命令不能工作:

> ssh nick@xa-crab < test.sh

但是我们可以采取管道操作获得类似的结果,在本地用户 nickli 的家目录中创建 mytask.ps1 文件,编辑其内容如下:

echo "Hello World!"
systeminfo > remotetest.txt

在本地运行下面的命令(远程主机的默认 shell 为 PowerShell):

> Get-Content mytask.ps1 | ssh nick@xa-crab

检查远程主机 xa-crab 上用户 nick 的家目录,可以看到 remotetest.txt 文件被创建,内容为 systeminfo 命令的输出。这种方法的优点是脚本中所有命令是在一个 session 中执行的,这点可以通过下面的方法验证。在本地用户 nickli 的家目录中创建 mytask2.ps1 文件,编辑其内容如下:

$p = Get-Process PowerShell
$p.VirtualMemorySize

在本地运行下面的命令(远程主机的默认 shell 为 PowerShell):

> ssh nick@xa-crab '$p = Get-Process PowerShell; $p.VirtualMemorySize'
> Get-Content mytask2.ps1 | ssh nick@xa-crab

上面的输出表明,脚本执行的过程中变量的上下文是整个脚本。

执行远程主机上的脚本
在远程主机 xa-crab 上的用户 nick 的家目录中创建 task.ps1 文件,编辑其内容如下:

echo "Hello Nick!"
systeminfo > test.txt

在本地运行下面的命令(远程主机的默认 shell 为 PowerShell):

> ssh nick@xa-crab powershell.exe -F task.ps1

检查远程主机 xa-crab 上用户 nick 的家目录,可以看到 test.txt 文件被创建,内容为 systeminfo 命令的输出。

总结

当 Windows 支持 OpenSSH 后,我们就能够用相同的工具在 Windows 平台和 Linux 平台上工作了,更进一步还可以用 ssh 客户端跨平台地连接 ssh 服务器,想想就是一件开心的事情(虽然目前 bug 还很多:))!

参考:
PowerShell/Win32-OpenSSH
OpenSSH in Windows

Windows OpenSSH 基本用法的更多相关文章

  1. windows openssh 设置root 目录

    默认windows openssh 服务的root 目录是用户账户所在的目录(一般是administrator),但是我们可以通过修改sshd_config 重新修改路径 可选的修改方式 直接修改ss ...

  2. Windows rundll32的用法-批处理管理打印机

    用法: rundll32 printui.dll,PrintUIEntry [options] [@commandfile] /a[file] 二进制文件名 /b[name] 基本打印机名 /c[na ...

  3. Windows批处理命令用法

    阅读下面文字需要一定的dos基础概念,象:盘符.文件.目录(文件夹).子目录.根目录.当前目录 每个命令的完整说明请加 /? 参数参考微软的帮助文档可以看到,在 /? 帮助里,"命令扩展名& ...

  4. windows openssh server 安装试用

    使用Windows的可能会知道win10 的已经包好了openssh 服务,但是对于其他机器win 7 windows 2008 ,就需要其他的方法了 还好powershell 团队开发了支持wind ...

  5. Windows系统防火墙用法

    1.按下“Win+X”组合键呼出系统快捷菜单,点击打开“控制面板”: 2.将“查看方式”修改为[大图标],然后点击“Windows 防火墙”: 3.在防火墙窗口左侧点击“高级设置”:(若防火墙未开启, ...

  6. windows“画图”工具用法

    图片编辑工具不少,photoshop功能强大,但是并不是那么容易掌握.而且,倘若一个简单的图片处理问题就使用这么强大的工具,有点“杀鸡焉用牛刀”的意思,要知道只打开photoshop就需要一段等待时间 ...

  7. windows openssh安装

    下载地址:https://github.com/PowerShell/Win32-OpenSSH/releases 解压好后打开目录,执行以下命令: powershell.exe -Execution ...

  8. Installing OpenSSH from the Settings UI on Windows Server 2019 or Windows 10 1809

    Installing OpenSSH from the Settings UI on Windows Server 2019 or Windows 10 1809 OpenSSH client and ...

  9. Windows 10系统运维之OpenSSH

    随着PowerShell和OpenSSH的日渐成熟,在客户终端Windows居多的运维之中,使用Win32-OpenSSH和Powershell来管理一些客户机变成了相当实用的一种解决方案. Open ...

随机推荐

  1. 「Android」 基于Binder通信的C/S架构体系认知

    C/S架构(Client/Server,即客户机/服务器模式)分为客户机和服务器两层:第一层是在客户机系统上结合了表示与业务逻辑,第二层是通过网络结合了数据库服务器.简单的说就是第一层是用户表示层,第 ...

  2. Linux 源码阅读 进程管理

    Linux 源码阅读 进程管理 版本:2.6.24 1.准备知识 1.1 Linux系统中,进程是最小的调度单位: 1.2 PCB数据结构:task_struct (Location:linux-2. ...

  3. Python笔记(十六):迭代器

    (一)iterable对象和Iterator对象的区别 iterable对象(可迭代的对象):可以使用for循环,例如:字符串.列表 .字典 .集合等 Iterator对象(迭代器):除了可以用for ...

  4. 智能POS删除文件和数据库操作步骤

    1. 2. 3. 4.winbox:日志:winboxcash:数据库:winboxcyb:其他文件: 5.删除以上三个文件夹

  5. windows10 专业版的远程服务器管理工具下载

    一.安装远程服务器管理工具: 下载地址: https://www.microsoft.com/zh-cn/download/details.aspx?id=45520 二.关闭远程服务器管理工具: 1 ...

  6. C#面向对象 1

    using System; using System.Collections.Generic; using System.Collections; using System.Linq; using S ...

  7. web前端(14)—— JavaScript的数据类型,语法规范1

    编辑器选择 对js的编辑器选用,有很多,能对html编辑的,也能对js编辑,比如notepad++,visual studio code,webstom,atom,pycharm,sublime te ...

  8. c/c++求解图的关键路径 critical path

    c/c++求解图的关键路径 critical path 上图表示一个工程,工程以V1为起始子工程,V9为终止子工程. 由图可以看出,要开工V5工程,必须在完成工程V2和V3后才可以. 完成V2需要a1 ...

  9. Linux学习历程——Centos 7 ps命令基础

    一.ps命令介绍 ps命令是Process Status的缩写,用于查看系统进程状态,ps命令输出值非常多,通常结合管道符使用. 二.实例 1.我们直接输入ps命令,不加任何参数. 可以看到默认输出4 ...

  10. ugui SetParent在安卓上一个诡异bug

    问题描述 我的环境:Unity3D 5.3.7 出问题机型:安卓模拟器.部分低配安卓机型(比如:红米2A) 以下代码是设置某个节点的父节点,在PC.Editor.大部分手机上都是正常的,但问题机型上, ...