软件推荐:Windows 版的 OpenSSH
Tofloor
poster avatar
duanyao
deepin
2017-06-12 19:11
Author
本帖最后由 duanyao 于 2017-6-12 11:53 编辑

为什么一个 Linux 论坛上要推荐 Windows 软件啊?因为 Windows 和 Linux 的互联互通有现实的需求,而不少同学似乎饱受 Windows 文件共享(也就是SMB、CIFS)的折磨,所以我推荐一个更简单、可靠、强大的解决方案:SSH。它除了可以用来远程执行命令,也可以远程访问文件,后者称为 SFTP 协议,我们可以用它来代替 Windows 文件共享。

在过去,SSH 主要是 UNIX 世界的工具,因为 Windows 上的 SSH 服务器软件要么比较难用 (cygwin的),要么是商业软件,所以用的人不多。但现在不同了,微软最近将 OpenSSH 移植到了 Windows 上,虽然是预发布版,亲测效果还是不错的(不得不说微软的开源战略越来越有诚意了)。

当然因为是预发布版,还是有些小坑需要留意,我的一些经验记录在这里,欢迎讨论:

一、安装

网站:https://github.com/PowerShell/Win32-OpenSSH
下载地址:https://github.com/PowerShell/Win32-OpenSSH/releases

安装 OpenSSH for Windows 需要 powershell 3 以上,但 win7 默认只有 powershell 2,所以需要先安装最新的 powershell(包含在 Windows Management Framework 中:https://www.microsoft.com/zh-CN/download/details.aspx?id=40855 )。

解压 OpenSSH for Windows 的安装包到任意目录(必须是NTFS文件系统),假定是 D:\OpenSSH。
以管理员身份打开控制台,进入 D:\OpenSSH,再运行 powershell:
```
powershell -ExecutionPolicy Bypass
```

然后执行(“#”后面是注释,不要输入):
```
.\install-sshd.ps1 #安装
.\ssh-keygen.exe -A #生成服务器端秘钥
.\FixHostFilePermissions.ps1 #修正文件权限
New-NetFirewallRule -Protocol TCP -LocalPort 22 -Direction Inbound -Action Allow -DisplayName SSH #打开防火墙端口
Set-Service sshd -StartupType Automatic #将 sshd 作为服务自动启动
Set-Service ssh-agent -StartupType Automatic #将 sshd-agent 作为服务自动启动
```

要卸载,则以管理员身份打开控制台,在 D:\OpenSSH 下执行:
```
powershell -ExecutionPolicy Bypass -File uninstall-sshd.ps1
```

二、文件权限的问题

.\FixHostFilePermissions.ps1 的执行可能部分失败,造成安装目录下的 ssh_host_xxx_key 文件的权限没有正确设置。
安装目录下的 ssh_host_xxx_key 文件所有者必须是 system,且有以下权限(其它用户的权限必须删除):

```
NT AUTHORITY\SYSTEMF)
BUILTIN\AdministratorsF)
NT SERVICE\SSHDR)
```
上述权限可以用 `icacls .\ssh_host_xxx_key` 命令来查看。(F)的意思是“全部权限”,(R)的意思是“读取权限”。

可以用以下命令来设置所有者和权限(当然你也可以用GUI):
```
icacls .\ssh_host_xxx_key /setowner system
icacls .\ssh_host_xxx_key /grant "NT SERVICE\SSHD"R)
```

并删除其它用户的权限,如果有:
```
icacls .\ssh_host_xxx_key /remove yyy\username
```

注意必须正确设置全部的 host key 文件(ssh_host_xxx_key),否则仍然会有错误。
可以删除不用的 host key 文件,然后在配置文件 sshd_config 中只保留个别算法的:
```
HostKey /ssh_host_ed25519_key
```

注意在 OpenSSH for Windows 的 sshd_config 中,根目录是指安装目录(D:\OpenSSH)。

如果你使用公钥登录的方法,那么应该把它加入 `C:\Users\<用户名>\.ssh\authorized_keys` 文件中。
客户端公钥文件 authorized_keys 必须对 sshd 和 SYSTEM 用户有读权限,但应该关闭对其它用户的权限,例如:
```
icacls C:\Users\admin\.ssh\authorized_keys
C:\Users\admin\.ssh\authorized_keys NT AUTHORITY\SYSTEMR)
                                    admin-PC\adminF)
                                    NT SERVICE\sshdR)
```

否则公钥登录会失败。                           

三、调试

如果有问题,可以在 sshd_config 中设置 LogLevel DEBUG,然后看 logs 目录下的 sshd.log 和 ssh-agent.log。


四、关于用户和权限

与 *NIX 一样,OpenSSH for Windows 的远程访问权限与本地权限没什么区别。也就是说(1)你需要用 Windows 上存在的账户登录,不能匿名(2)该 Windows 账户从本地能访问什么,通过 ssh 也能访问什么(对很多 windows 机器来说意味着几乎整个硬盘)。

所以,如果要使用 OpenSSH,你需要规划好 Windows 上的账户和权限,并设置较强的登录口令;或者禁止 SSH 口令登录,只使用公钥登录。如果是想让对任意用户分享文件,你可能需要好好规划一下你的 Windows 的目录结构,因为除了 C:\Users\<用户名> 下的文件,Windows 的很多文件是普通账户都可以访问的。

Reply Favorite View the author
All Replies
duanyao
deepin
2017-06-12 19:17
#1
最后附一个用文件管理器连接到 OpenSSH for Windows 的截图:
Reply View the author
159******79
deepin
2017-06-13 03:29
#2
putty就够用了
Reply View the author
MattD
deepin
2017-06-13 03:47
#3

LZ说的是openssh server端







    来自:Mozilla/5.0 (X11; Linux x86_64; rv:53.0) Gecko/20100101 Firefox/53.0  (zh-CN)
    ——2017/6/12 下午7:47:04
    Reply View the author