Как запустить службу Ubuntu в Windows (при запуске)?

Как запустить службу Ubuntu в Windows (при запуске)?

Я хочу запустить SSH-сервер на подсистеме Linux (Bash на Ubuntu на Windows) при запуске Windows. Проблема в том, что все процессы Linux завершаются при закрытии окна Bash.

Есть ли способ заставить процесс Linux постоянно работать в фоновом режиме без окна bash?

решение1

Нашел руководство по этому вопросу от пользователя aseering:

Первоначально это обсуждалось и решалось пользователями github imjakey, fpqc, qris, therealkenc, Manouchehri и aseering (мною) здесь:

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

Обратите внимание, что запуск sshd имеет последствия для безопасности. Пока модель безопасности WSL не будет готова, вам следует предположить, что любой, кто может подключиться по ssh к вашей машине Windows, имеет разрешение на выполнение любой команды как пользователь Windows, запустивший sshd, независимо от разрешений уровня Linux. (Разрешения, вероятно, более ограничительны на практике, но изначальная модель безопасности WSL не должна быть очень сложной.)

Попытка собрать воедино инструкции с github:

  • Сгенерируйте ключи хоста SSH, запустив sudo dpkg-reconfigure openssh-serverоболочку bash
  • Запустить sudo nano /etc/ssh/sshd_config; отредактировать UsePrivilegeSeparation yesстроку так, чтобы она читалась UsePrivilegeSeparation no. (Это необходимо, поскольку UsePrivilegeSeparationиспользуется chroot()системный вызов, который WSL в настоящее время не поддерживает.)
  • Во время редактирования /etc/ssh/sshd_configвы можете изменить PasswordAuthentication noна PasswordAuthentication yes. В противном случае вам придется настроить ключи SSH.
  • Сохранить /etc/ssh/sshd_configи выйти.
  • Запускаем sudo visudoредактирование файла sudoers. Добавляем строку

    $USER ALL = (root) NOPASSWD: /usr/sbin/sshd -D
    

    замените "$USER" на свое имя пользователя Linux. Сохраните и выйдите. Если visudo жалуется, что ваши изменения недействительны, исправьте их, пока не сообщит, что они действительны; в противном случае вы можете сломать sudo в своей системе!

  • На стороне Windows отредактируйте брандмауэр Windows (и любые сторонние брандмауэры, которые у вас могут быть запущены), чтобы разрешить входящий трафик через порт 22. Поскольку это не очень безопасная настройка, я рекомендую разрешать входящий трафик только из домашних (частных) и доменных сетей, а не из публичного Интернета.
  • Создайте в Windows текстовый файл, autostartssh.vbsсодержащий следующее:

    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файл в папку автозагрузки Windowswindows-10-изменение-автозагрузки-приложений

  3. Перезагрузите компьютер и войдите в свою учетную запись Windows (да, вам необходимо войти в систему)

решение3

Мне нужно было сделать то же самое.

Вот как загрузить подсистему Ubuntu Linux со всеми службами cron при загрузке Windows и предоставить средство для «перезагрузки» подсистемы Linux.

Я успешно размещаю на нашем сервере базы данных openssh-server, nginx и mariadb.

Установить подсистему Linux

  • Откройте Powershell как администратор.
  • Вставить:

    Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux
    
  • Установите Ubuntu из Магазина Windows.

Удалить запрос пароля sudo (обязательно)

  • Откройте bash (Linux Subsystem устанавливает его)
  • Вставить:

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

Включить вход по паролю SSH (необязательно)

  • Открыть Баш
  • Вставить:

    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

  • Открыть Баш
  • 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, затем нажмите yи enter.

Перезагрузите подсистему Linux без перезагрузки Windows.

  • Откройте bash или SSH в

    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
    

Дополнительно - Установка базы данных mysql от mariadb

  • Выполните следующие команды для сервера базы данных 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
    
  • При появлении соответствующего запроса установите пароль пользователя root базы данных.

решение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и sudoпроцесс для каждого вызова скрипта. Не забудьте -Dтакже удалить опцию в файле sudoers!
  • ИспользоватьPowerShellвместо vbs! Создайте файл с именем autostartsshd.ps1и вставьте в него следующее: bash -c 'sudo service ssh start'. Чтобы выполнить скрипт, щелкните его правой кнопкой мыши и выберите Run with PowerShell.

Еще один вопрос на Stack Overflow имеет похожие шаги:https://superuser.com/a/1114162/182590

Надеюсь, это кому-то поможет :)

Связанный контент