Як запустити службу Ubuntu на Windows (при запуску)?


18

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

Чи є спосіб зробити процес Linux постійно працювати у фоновому режимі без вікна bash?

Відповіді:


22

Знайшов підручник для цього за допомогою aseering:

Спочатку це обговорювалося і вирішувалося користувачами github imjakey, fpqc, qris, therealkenc, Manouchehri, а також тут:

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() syscall, який 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!


Сценарій VBS нічого не зробив для мене. sshd не відображається на вкладці Мережа ресурсів.
megamaiku

Я написав диспетчер процесу github.com/131/dispatcher що дозволить вам спалити баш без вікон.
131

@megamaiku: У мене була така ж проблема. Вимикає маленький snipped побігти sshd застряг на (невидимий) запит пароля, тому що я не зробив "visudo" частина права. Спочатку я додав рядок NOPASSWD десь посередині файлу sudoers. Це спрацювало, як тільки я перемістив його на дно!
ltjax

Зараз він працює UsePrivilegeSeparation = yes , крім того, що потрібно також запустити sudo /bin/mkdir -p /var/run/sshd (для створення каталогів поділу привілеїв) перед запуском sshd. Чи підтримує WLS тепер chroot (), чи існує обхідний шлях у джерелі openssh або це = No встановлювати більше рекомендацій з безпеки? Крім того, вікно завдання, здається, працює тільки для мене, якщо мій користувач увійшов.
init_js

Це спрацювало чудово. Я хотів би запропонувати, щоб зробити речі простіше, перенести порт SSH на слухання, наприклад, 3322, щось випадкове. Прокоментуйте рядок у /etc/ssh/sshd_config що читається Port 22 і переключитися на Port 8822. Однією з причин цього є Windows, який запускає якийсь SSH-процес на 22. Я бачив пропозиції, які говорять, що немає ніяких проблем з відключенням, але мені було легше просто перемикати порт WSL SSH.
knickum

3

Мені потрібно було зробити те ж саме.

Ось як завантажитися підсистема Ubuntu Linux з усіма службами cron під час завантаження Windows; забезпечують засоби для перезавантаження підсистеми Linux.

Я успішно розміщую сервер openssh, nginx & amp; База даних mariadb на нашому сервері.

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

  • Відкрийте PowerShell як адміністратор
  • Вставити:

    Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux
    
  • Встановіть Ubuntu з Магазину Windows.

Вилучити запрошення пароля 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-сервер, 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
    
  • Зберегти та вийти: ctrl x , потім натисніть y і введіть .

Перезавантажте підсистему 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
    
  • Коли з'явиться запит, встановіть пароль користувача кореневої бази даних.


Це дуже розумно! і точні інструкції, спасибі. Чи є спосіб уникнути пропуску пароля "sudo" повністю?
greg

Я більше не рекомендую використовувати підсистему Linux. Сумісність програм - це нестабільно, а інструменти не всі працюють так само, як могли - bash інтеграції і т.д. Замість цього використовуйте msys2, він надає вам велику оболонку bash і дозволить вам встановити багато додатків через його Менеджер пакетів pacman - Краще за все, всі програми є .exe. Все, що вам потрібно зробити, це додати директорії bin до змінних середовища в Windows. Я використовую команди linux у вікнах і навпаки. Всі мої сценарії Windows виконуються в bash.
Nom

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.

Інший запит на переповнення стеків має подібні кроки: https://superuser.com/a/1114162/182590

Сподіваюся, що хтось допомагає :)


Ви впевнені, що це спрацює? Запуск sshd на передньому плані був навмисний для того, щоб тримати bash сеанс відкритим (не буде ніяких проблем з кількома екземплярами, оскільки дублікати не вдадуться до запуску). Якщо ви просто запустите sudo service ssh start а потім закрийте bash, він уб'є демон ssh. Принаймні, це те, що він зробив на момент написання мого керівництва.
Poma

@Poma За допомогою останнього оновлення до Windows 10, програми Linux можуть працювати у фоновому режимі, тому я думаю, що це має спрацювати.
JacobTheDev

0

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.