在Windows 10 Bash上保持SSH运行

8

我在Windows子系统上运行Linux时遇到了SSH无法持续运行的问题。似乎如果没有打开shell并运行bash,子系统中的所有进程都会被杀死。有没有办法阻止这种情况发生?

我尝试使用nssm创建服务,但无法使其正常工作。现在我正在尝试启动一个shell,然后将其发送到后台,但我还没有完全弄清楚如何做。

3个回答

13

为了使后台任务持续运行,您必须保留至少一个bash控制台:一旦您关闭最后一个打开的bash控制台,WSL会关闭所有正在运行的进程。

是的,我们正在努力改善这种情况;)

更新2018-02-06

在最近的Windows 10 Insider版本中,我们增加了一个功能,即即使关闭所有Linux控制台,仍然可以保持守护程序和服务在后台运行

这种情况下的一个限制是您必须手动启动服务(例如,在Ubuntu中$ sudo service ssh start),虽然我们正在调查如何允许您配置哪些守护程序/服务在登录时自动启动。更新内容将随后发布。


1
嘿,@rich-turner,这种情况有什么改进吗? - AbhiNickz
1
谢谢您的提问...我已经更新了我的回答 :) - Rich Turner
这可能对像cron这样的东西有潜力吗? - Mattwmaster58
有点……虽然我们还没有在登录时自动启动守护进程,所以不太有用。在Windows上更好的选择是运行计划任务。 - Rich Turner

1
为了维护WSL进程,我将此文件放置在C:\Users\USERNAME\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\wsl.vbs位置。
set ws=wscript.createobject("wscript.shell")
ws.run "C:\Windows\System32\bash.exe -c 'sudo /etc/rc.local'",0

在 /etc/rc.local 中,我启动了一些服务,并最终使用 "sleep" 命令来保持整个过程运行:
/usr/sbin/sshd
/usr/sbin/cron
#block on this line to keep WSL running
sleep 365d

在/etc/sudoers.d中,我添加了一个“rc-local”文件,以允许上述命令无需sudo密码提示:
username * = (root) NOPASSWD: /etc/rc.local
username * = (root) NOPASSWD: /usr/sbin/cron
username * = (root) NOPASSWD: /usr/sbin/sshd

这在1607版本上效果很好,但升级到1704后,我无法通过ssh连接到wsl。
一旦您运行cron,您可以使用“sudo crontab -e -u用户名”来定义@reboot的cron作业,在登录时启动。

0
今天早些时候阅读了这个帖子,并使用它在没有打开wsl控制台的情况下运行sshd。 我正在Windows 10版本1803上使用WSL中的Ubuntu 16.04.5 LTS。 我需要进行一些更改才能使其正常工作。非常感谢谷歌搜索和像这样的社区。
我修改了/etc/rc.local如下:
mkdir /var/run/sshd
/usr/sbin/sshd
#/usr/sbin/cron

我需要添加sshd目录,否则会出现错误“缺少特权分离目录/var/run/sshd”。 我注释掉了cron,因为我遇到了类似的错误,而且还没有时间或需要去修复它。

我还稍微更改了sudoers条目以使其正常工作:

username ALL = ....

希望这对某人有用。 约翰·巴特勒

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接