笔者在前文《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 https://github.com/powershell/Win32-OpenSSH/wiki
- OpenSSH in Windows
来源: https://www.cnblogs.com/sparkdev/p/10178597.html