如何在 Windows 上运行 Ubuntu 服务(启动时)?

Pom*_*oma 29 ubuntu windows-10 windows-subsystem-for-linux windows-10-v1607

我想在 Windows 启动时在 Linux 子系统(Windows 上的 Ubuntu 上的 Bash)上启动一个 SSH 服务器。问题是当 Bash 窗口关闭时,所有 Linux 进程都会终止。

有没有办法让 Linux 进程在没有 bash 窗口的情况下在后台永久运行?

Pom*_*oma 30

通过aseering找到了一个教程:

这最初是由 github 用户 imjakey、fpqc、qris、therealkenc、Manouchehri 和 aseering(我自己)在这里讨论和整理的:

https://github.com/Microsoft/BashOnWindows/issues/612

请注意,运行 sshd 具有安全隐患。在 WSL 的安全模型需要更长的时间之前,您应该假设任何可以通过 ssh 进入您的 Windows 机器的人都有权以运行 sshd 的 Windows 用户身份执行任何命令,而不管 Linux 级别的权限如何。(权限可能比实践中的限制更多,但 WSL 的初始安全模型并不是很复杂。)

尝试汇总来自 github 的指令:

  • 通过sudo dpkg-reconfigure openssh-server在 bash shell 中运行来生成 SSH 主机密钥
  • 运行sudo nano /etc/ssh/sshd_config; 编辑UsePrivilegeSeparation yes要读取的行 UsePrivilegeSeparation no。(这是必要的,因为 UsePrivilegeSeparation使用了chroot()WSL 当前不支持的系统调用。)
  • 在仍在编辑时 /etc/ssh/sshd_config,您可以选择更改 PasswordAuthentication noPasswordAuthentication yes。否则,您将不得不设置 SSH 密钥。
  • 保存 /etc/ssh/sshd_config并退出。
  • 运行sudo visudo以编辑 sudoers 文件。添加行

    $USER ALL = (root) NOPASSWD: /usr/sbin/sshd -D
    
    Run Code Online (Sandbox Code Playgroud)

    用您的 Linux 用户名替换“$USER”。保存并退出。如果 visudo 抱怨您的更改无效,请修复它们,直到它报告它们有效;否则你可以在你的系统上破坏 sudo !

  • 在 Windows 端,编辑 Windows 防火墙(以及您可能正在运行的任何第三方防火墙)以允许端口 22 上的传入流量。因为这不是一个超级安全的设置,我建议只允许来自家中的传入流量(私人)和域网络,而不是来自公共互联网。
  • autostartssh.vbs在 Windows 中创建一个包含以下内容的文本文件 :

    set ws=wscript.createobject("wscript.shell")
    ws.run "C:\Windows\System32\bash.exe -c 'sudo /usr/sbin/sshd -D'",0
    
    Run Code Online (Sandbox Code Playgroud)
    • 双击脚本。它应该启动 sshd;您应该能够通过 ssh 连接到您的 Windows 机器。
    • 打开 Windows 的任务计划程序。添加autostartssh.vbs在系统启动时运行的任务。使用wscript.exe作为运行命令和VBS脚本位置作为参数。

就是这样——您的 Windows 计算机应该运行 Linux openssh 服务器!


小智 17

  1. 创建一个名为的文件wsl_setup.bat并添加内容如下

    wsl -u root -e sudo service ssh start
    wsl -u root -e sudo service nginx start
    
    Run Code Online (Sandbox Code Playgroud)
  2. wsl_setup.bat文件添加到 Windows 启动文件夹windows-10-change-startup-apps

  3. 重新启动并登录您的 Windows 帐户(是的,您需要登录)