在 Windows 10 Bash 上保持 SSH 运行
Keep SSH running on Windows 10 Bash
我在 Linux 的 Windows 子系统上保留 SSH 运行 时遇到问题。好像如果一个shell不开,运行bash,子系统中的所有进程都杀掉了。有办法阻止这种情况吗?
我曾尝试使用 nssm 创建服务,但无法使其正常工作。现在我正在尝试启动一个 shell 然后将它发送到后台,但我还没有完全弄清楚如何。
您必须保持至少一个 bash 控制台打开才能让后台任务保持 运行:一旦您关闭最后一个打开的 bash 控制台,WSL 就会泪流满面-关闭所有 运行 个进程。
而且,是的,我们正在努力在未来改进这种情况;)
更新2018-02-06
在最近的 Windows 10 Insider 版本中,我们添加了 keep daemons and services running in the background 的功能,即使您关闭所有 Linux 控制台!
此方案的一个剩余限制是您必须手动启动服务(例如 Ubuntu 中的 $ sudo service ssh start
),但我们正在研究如何让您能够配置daemons/services 当您登录到您的计算机时自动启动。后续更新。
为了维护 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 username' 定义带有 @reboot 的 cron 作业以在登录时启动。
今天早些时候通读了这个线程,并用它来获取 sshd 运行,而无需打开 wsl 控制台。
我正在使用 Windows 10 版本 1803 并在 WSL 中使用 Ubuntu 16.04.5 LTS。
我需要进行一些更改才能使其正常工作。非常感谢 google 搜索和这样的社区。
我修改了/etc/rc.local:
mkdir /var/run/sshd
/usr/sbin/sshd
#/usr/sbin/cron
我需要为 sshd 添加目录,否则我会收到错误消息“缺少权限分离目录 /var/run/sshd
我注释掉了 cron,因为我遇到了类似的错误并且没有时间或需要修复它。
我还稍微更改了 sudoers 条目以使它们正常工作:
username ALL = ....
希望这对某人有用。
约翰·巴特勒
我在 Linux 的 Windows 子系统上保留 SSH 运行 时遇到问题。好像如果一个shell不开,运行bash,子系统中的所有进程都杀掉了。有办法阻止这种情况吗?
我曾尝试使用 nssm 创建服务,但无法使其正常工作。现在我正在尝试启动一个 shell 然后将它发送到后台,但我还没有完全弄清楚如何。
您必须保持至少一个 bash 控制台打开才能让后台任务保持 运行:一旦您关闭最后一个打开的 bash 控制台,WSL 就会泪流满面-关闭所有 运行 个进程。
而且,是的,我们正在努力在未来改进这种情况;)
更新2018-02-06
在最近的 Windows 10 Insider 版本中,我们添加了 keep daemons and services running in the background 的功能,即使您关闭所有 Linux 控制台!
此方案的一个剩余限制是您必须手动启动服务(例如 Ubuntu 中的 $ sudo service ssh start
),但我们正在研究如何让您能够配置daemons/services 当您登录到您的计算机时自动启动。后续更新。
为了维护 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 username' 定义带有 @reboot 的 cron 作业以在登录时启动。
今天早些时候通读了这个线程,并用它来获取 sshd 运行,而无需打开 wsl 控制台。 我正在使用 Windows 10 版本 1803 并在 WSL 中使用 Ubuntu 16.04.5 LTS。 我需要进行一些更改才能使其正常工作。非常感谢 google 搜索和这样的社区。
我修改了/etc/rc.local:
mkdir /var/run/sshd
/usr/sbin/sshd
#/usr/sbin/cron
我需要为 sshd 添加目录,否则我会收到错误消息“缺少权限分离目录 /var/run/sshd 我注释掉了 cron,因为我遇到了类似的错误并且没有时间或需要修复它。
我还稍微更改了 sudoers 条目以使它们正常工作:
username ALL = ....
希望这对某人有用。 约翰·巴特勒