Windows的Linux子系统上配置SSH服务器

安装openssh

这个不用啰嗦太多,首先需要安装openssh-serveropenssh-client

修改sshd-config配置

需要关注的就是这三行。

UsePrivilegeSeparation no         #因为wsl没有实现chroot
PasswordAuthentication yes
ListenAddress 0.0.0.0                 #这一项在我的发行版里缺省为注释行。
其他的可以根据需求修改。
ListenAddress 0.0.0.0                  # 要让其他计算机能连接上需要加上这一行,或者把经常需要连接的计算机IP加入
PermitRootLogin yes                   # 允许root用户登录。

关闭Windows自带的ssh

我原本还不知道的,查了资料才知道新版Windows自带了ssh服务,不过怎么使用还没有了解。 可以使用powershell来查看这个服务。

PS C:\Users\user> Get-Service -Name ssh*
Status   Name               DisplayName
------   ----               -----------
Stopped  SshBroker          SSH Server Broker
Stopped  SshProxy           SSH Server Proxy
在服务控制台里找到这两个服务停掉就行了。 注意要先停掉sshproxy才可以关掉sshbroker

以调试方式启动ssh

/usr/sbin/sshd -d
-d表明是以调试方式启动的服务,这种情况下,错误会显示在控制台上。

要注意即使以这种方法启动ssh server,它仍然只是在存在bash窗口时的一个子服务。一旦最后一个bash窗口关闭,这个ssh server也就关闭了,显然这不是我们想要的。接下来看看怎么将ssh server以windows服务或者后台进程来运行。

正常开启ssh

service ssh start

自动启动ssh服务

当前WSL并不支持ssh server作为服务运行。我们需要借助windows计划任务和脚本,使得在windows启动时自动运行这一服务。

set ws=wscript.createobject("wscript.shell")
ws.run "C:\Windows\System32\bash.exe -c '/usr/sbin/sshd -D'",0

将这个文件存为vbs,并在计划任务中添加一个启动任务,触发器设置为系统启动时。 不过使用这个方法的前提是你的WSL默认用户是root,对于默认用户不是root的必须使用sudo方式启动。 但是! 执行sudo时,会提示输入密码,而这时又无法拿到用户的输入。要解决这一问题,需要允许sudo在没有密码的情况下执行命令。

在bash里输入命令:

sudo visudo

#includedir /etc/sudoers.d
username ALL=(ALL) NOPASSWD: /usr/sbin/sshd -D
username改成你自己的用户名即可。

参考资料

hbaaron.github.io

About

了解更多有趣的操作请关注我的微信公众号:DealiAxy 每一篇文章都在我的博客有收录:blog.deali.cn