Windows OpenSSH 基本用法
> ssh domain\nickli@xa-crab > ssh nickli@domain@xa-crab > ssh -l nickli@domain xa-crab
> 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
以前在 Windows 之间传递文件事件很让人抓狂的事情,现在有了 OpenSSH 加持,自然是能够支持以 scp 的方式在主机间拷贝文件,再加公钥认证,完美的支持自动化的文件拷贝操作。下面是一个简单的用 scp 拷贝文件例子:
> scp D:\grafana.tar.gz nick@xa-crab:c:\testdir
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