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

22

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

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

Poma
источник

Ответы:

26

Нашел учебник для этого, посмотрев:

Это было первоначально обсуждено и разобрано пользователями 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. Поскольку это не сверхзащищенная установка, я рекомендую разрешать входящий трафик только из дома ( частные) и доменные сети, а не из публичного интернета.
  • Создайте текстовый файл 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!

Poma
источник
Скрипт VBS ничего не сделал для меня. sshd не отображается на мониторе ресурсов на вкладке «Сеть».
megamaiku
Я написал диспетчер процессов github.com/131/dispatcher, который позволит вам создавать bash без окон.
131
@megamaiku: у меня была такая же проблема. Оказывается, что немного запущенный sshd застрял в (невидимой) подсказке пароля, потому что я не правильно выполнил часть «visudo». Сначала я добавил строку NOPASSWD где-то посередине файла sudoers. Это сработало, как только я переместил его на дно!
ltjax
1
В настоящее время он работает UsePrivilegeSeparation = yes, за исключением того, что необходимо также запустить sudo /bin/mkdir -p /var/run/sshd(для создания каталогов разделения привилегий) перед запуском sshd. Поддерживает ли WLS теперь chroot (), есть ли обходной путь в исходном коде openssh, или эта = Noнастройка является большей рекомендацией по безопасности? Кроме того, задача Windows, кажется, работает только для меня, если мой пользователь вошел в систему.
init_js
Это сработало превосходно. Я бы посоветовал, чтобы было проще, перенести порт, который прослушивает SSH, например, 3322, что-то случайное. Закомментируйте строку, /etc/ssh/sshd_configкоторая читает, Port 22и переключитесь на Port 8822. Одной из причин этого является то, что Windows запускает какой-то SSH-процесс 22-го числа. Я видел предположения о том, что нет проблем с отключением этого, но я нашел, что проще всего просто переключить WSL-порт SSH.
knickum
4

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

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

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

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

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

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

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

  • Open bash (подсистема Linux устанавливает это)
  • Вставить:

    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 loop при запуске

  • Создайте файл с именем 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.

Extra - Установить 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
    

Extra - Установите веб-сервер 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
    

Extra - Установить базу данных 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
    
  • При появлении запроса установите пароль пользователя корневой базы данных.

Nom
источник
Это очень умно! и точные инструкции, спасибо. Есть ли способ избежать полного пропуска пароля «sudo»?
Грег
Я больше не рекомендую использовать подсистему Linux. Совместимость приложений - отстой, она нестабильна, и инструменты работают не так хорошо, как могли бы - интеграция с bash и т. Д. Вместо этого используйте msys2, она предоставляет вам отличную оболочку bash и позволит вам устанавливать множество приложений через ее Менеджер пакетов pacman - лучше всего, все приложения .exe. Все, что вам нужно сделать, это добавить каталоги bin в ваши переменные окружения в Windows. Я использую команды Linux в Windows и наоборот. Все мои скрипты для Windows сделаны на bash.
Ном.
1

Ответ @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.

Другой вопрос переполнения стека имеет аналогичные шаги: /superuser//a/1114162/182590

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

Hintron
источник
Вы уверены, что это сработает? Запуск sshd на переднем плане был намеренным, чтобы держать сеанс bash открытым (не будет проблем с несколькими экземплярами, потому что дубликаты не запустятся). Если вы просто запустите sudo service ssh startи закроете bash, это убьет демона ssh. По крайней мере, так было в момент написания моего руководства.
Пома
@Poma С последним обновлением до Windows 10 приложения Linux теперь могут работать в фоновом режиме, поэтому я думаю, что это должно работать нормально.
JacobTheDev
1

вставьте bash -c "echo [password] | service ssh start"скрипт запуска Windows и используйте собственный пароль sudo вместо [password]

Вэй
источник
Вы не можете просто передать пароль в приглашение sudo (не то, что ваша команда даже включает необходимое sudoключевое слово, которое подразумевает ваше предложение). Это просто не работает. Не то, чтобы вы когда-либо хранили свой пароль в незашифрованном виде в любом случае!
adam_0
1

Ответы @Poma и @Hintron отличные.

Я хотел бы расширить описание последнего пункта, как добавить задачу ssh в Windows Task Scheduler, так как для этого требуется переключение некоторых параметров:

  • Запустите «Планировщик заданий». В левом списке выберите «Планировщик заданий (локальный)», затем перейдите в меню «Действие» и «Создать задачу».
  • Вкладка "Общие":
    • Название: "SSH"
    • Выберите «Запустить, пользователь вошел в систему или нет»
  • Вкладка триггеров:
    • новый
      • Начните задание: «При запуске»
  • Вкладка Действия:
    • новый
      • Программа / скрипт: C: \ Windows \ System32 \ bash.exe
      • Добавьте аргументы (необязательно): -c "sudo / usr / sbin / service ssh start"
  • условия:
    • Снимите флажок «Запускать задачу, только если компьютер подключен к сети переменного тока
  • настройки
    • Снимите флажок «Остановить задачу, если она выполняется дольше, чем

Используется прямой вызов bash. Нет необходимости заключать его в сценарии VBS или PowerShell.

Я использую сервисную команду по причинам, которые объяснил @Hintron. Кроме того, прямой sshd-вызов дает ошибку

Отсутствует каталог разделения привилегий: / var / run / sshd

В таком случае следует добавить эту запись по sudo visudoкоманде

ALL ALL = (root) NOPASSWD: /usr/sbin/service ssh *

Также обратите внимание, что здесь все пользователи (первый столбец) могут запускать или останавливать sshd. Если вы только один пользователь этого компьютера с Windows, то все должно быть в порядке.

kwojtas
источник
1
  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-change-startup-apps

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

gaozhidf
источник