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

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

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

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

答案1

通过 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
    

    将“$USER”替换为您的 Linux 用户名。保存并退出。如果 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
    
    • 双击该脚本。它应该会启动 sshd;您应该能够通过 ssh 进入您的 Windows 计算机。
    • 打开Windows的任务计划程序。添加一个autostartssh.vbs在系统启动时运行的任务。使用wscript.exe作为运行的命令,VBS脚本位置作为参数。

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

答案2

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

    wsl -u root -e sudo service ssh start
    wsl -u root -e sudo service nginx start
    
  2. wsl_setup.bat文件添加到 Windows 启动文件夹Windows-10-更改启动应用程序

  3. 重启并登录你的windows账户(是的,你需要登录)

答案3

我需要做同样的事情。

以下是如何在 Windows 启动时使用所有 cron 服务启动 Ubuntu Linux 子系统并提供“重新启动”Linux 子系统的方法。

我已成功在我们的服务器上托管 openssh-server、nginx 和 mariadb 数据库。

安装Linux子系统

  • 以管理员身份打开 Powershell
  • 粘贴:

    Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux
    
  • 从 Windows 商店安装 Ubuntu。

删除 sudo 密码提示(必需)

  • 打开 bash(Linux 子系统安装它)
  • 粘贴:

    sudo sed -i "s/%sudo.*/%sudo ALL=(ALL:ALL) NOPASSWD:ALL/g" /etc/sudoers
    

启用 SSH 密码登录(可选)

  • 打开 bash
  • 粘贴:

    sudo sed -i '/StrictModes yes/c\StrictModes no' /etc/ssh/sshd_config
    sudo sed -i '/ChallengeResponseAuthentication/c\ChallengeResponseAuthentication no' /etc/ssh/sshd_config
    sudo sed -i '/PasswordAuthentication/c\PasswordAuthentication yes' /etc/ssh/sshd_config
    

Windows 启动时自动登录(如果您有密码或 RDP 则需要)

  • 打开 netplwiz
  • 取消勾选‘用户必须输入用户名和密码...’
  • 以管理员身份打开 regedit
  • 浏览至

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon
    
  • 创建一个新字符串DefaultPassword并将用户密码作为值写入。

在启动时运行 bash/cron 循环

  • 创建一个linux.bat名为shell:startup
  • 粘贴:

    C:\Windows\System32\bash.exe -c 'while [ true ]; do sudo /usr/sbin/cron -f; done'
    

添加应用/服务以在 cron 上启动

  • 打开 bash
  • sudo crontab -e
  • 选择 nano(或任何你知道如何保存的编辑器)
  • 附加启动应用程序,例如 openssh-server、nginx、mysql、php:

    PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
    @reboot . $HOME/.profile; /usr/sbin/sshd -D
    #@reboot . $HOME/.profile; service php7.1-fpm start # Uncomment for php7.1 fpm
    #@reboot . $HOME/.profile; service mysql start # Uncomment for mysql/mariadb
    #@reboot . $HOME/.profile; service nginx start # Uncomment for nginx
    
  • 保存并退出:ctrlx,然后按yenter

重新启动 Linux 子系统而无需重新启动 Windows

  • sudo service ssh restart
    
  • 这将关闭当前实例并应用 cron 创建一个新实例。

额外 - 安装 PHP 7.1(不太简单)

  • 运行以下命令以获得非常标准的设置:

    mkdir /run/php && chmod -R 777 /run/php
    sudo add-apt-repository ppa:ondrej/php && sudo apt update
    PHPV=7.1 && sudo apt install --allow-unauthenticated -y php${PHPV}-fpm php${PHPV}-gd php${PHPV}-json php${PHPV}-mysqlnd php${PHPV}-curl php${PHPV}-intl php${PHPV}-mcrypt php${PHPV}-imagick php${PHPV}-zip php${PHPV}-xml php${PHPV}-mbstring
    
  • 运行以下命令进行“OwnCloud”设置:

    PHPV=7.1 && apt install --allow-unauthenticated -y php${PHPV}-redis redis-server php${PHPV}-ldap php${PHPV}-smbclient
    

额外 - 安装 nginx 网络服务器

  • 运行以下命令,使用 PHP7.1 进行基本设置:

    sudo add-apt-repository ppa:nginx/stable
    sudo apt update && sudo apt -y install nginx
    sudo sed -i 's:access_log /var/log/nginx/access.log;:access_log off;:g' /etc/nginx/nginx.conf
    sudo sed -i '/index index.html/c\\tindex index.html index.php index.htm index.nginx-debian.html;' /etc/nginx/sites-available/default
    STR='}\n\n\tlocation ~ \.php$ {\n\t\tinclude snippets\/fastcgi-php.conf;\n\t\tfastcgi_pass unix:\/var\/run\/php\/php7.1-fpm.sock;\n\t}'
    sudo sed -i "0,/}/s//$STR\n/" /etc/nginx/sites-available/default
    sudo service nginx restart
    

额外-安装 mariadb 的 mysql 数据库

  • 对 mysql 数据库服务器运行以下命令:

    RELEASE=`lsb_release -a | tail -1 | cut -f2`
    sudo apt install software-properties-common
    sudo apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xF1656F24C74CD1D8
    sudo add-apt-repository "deb [arch=i386,amd64,ppc64el] https://mirrors.evowise.com/mariadb/repo/10.3/ubuntu $RELEASE main"
    sudo apt update && sudo apt --allow-unauthenticated -y install mariadb-server
    
  • 出现提示时,设置根数据库用户密码。

答案4

@poma 的回答非常好,我的回答就是基于此。不过我想对它进行一些改进:

  • 使用service而不是sshd直接调用:'sudo service ssh start'而不是'sudo /usr/sbin/sshd -D'。这样,即使你多次调用该脚本,也只会有一个sshd进程。此外,使用另一个运行 的脚本很容易将其终止'sudo service ssh stop'。在 sudoers 文件中,你只需将其替换/usr/sbin/sshd -D/usr/sbin/service
  • 如果你决定sshd直接打电话,摆脱-D选择,因为这会将进程无限期地置于前台。如果您不相信我,只需这样做,每次调用脚本时top您都会看到一个init和一个进程。不要忘记在 sudoers 文件中sudo删除该选项!-D
  • 使用电源外壳而不是 vbs!创建一个名为的文件autostartsshd.ps1并粘贴以下内容:bash -c 'sudo service ssh start'。要执行脚本,请右键单击它并单击Run with PowerShell

另一个堆栈溢出问题有类似的步骤:https://superuser.com/a/1114162/182590

希望这对某人有帮助:)

相关内容