Jak uruchomić usługę Ubuntu w systemie Windows (podczas uruchamiania)?

22

Chcę uruchomić serwer SSH w podsystemie Linux (Bash na Ubuntu w systemie Windows) podczas uruchamiania systemu Windows. Problem polega na tym, że wszystkie procesy Linuksa zostają zakończone, gdy okno Bash jest zamknięte.

Czy istnieje sposób, aby proces Linux działał na stałe w tle bez okna bash?

Poma
źródło

Odpowiedzi:

26

Znalazłem samouczek na ten temat:

Zostało to pierwotnie omówione i uporządkowane przez użytkowników github imjakey, fpqc, qris, therealkenc, Manouchehri i aseering (ja) tutaj:

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

Zauważ, że uruchomienie sshd ma wpływ na bezpieczeństwo. Dopóki model zabezpieczeń WSL nie będzie musiał dłużej piec, powinieneś założyć, że każdy, kto może ssh do twojego Windowsa, ma uprawnienia do wykonania dowolnej komendy jako użytkownik systemu Windows uruchamiający sshd, niezależnie od uprawnień na poziomie Linux. (Uprawnienia są prawdopodobnie bardziej restrykcyjne niż w praktyce, ale początkowy model bezpieczeństwa WSL nie ma być zbyt wyrafinowany).

Próba agregacji instrukcji z github:

  • Wygeneruj klucze hosta SSH, uruchamiając je sudo dpkg-reconfigure openssh-serverw powłoce bash
  • Uruchom sudo nano /etc/ssh/sshd_config; edytuj UsePrivilegeSeparation yeswiersz do przeczytania UsePrivilegeSeparation no. (Jest to konieczne, ponieważ UsePrivilegeSeparationużywa chroot()syscall, którego WSL obecnie nie obsługuje).
  • Podczas edytowania /etc/ssh/sshd_configmożesz zmienić PasswordAuthentication nona PasswordAuthentication yes. W przeciwnym razie będziesz musiał skonfigurować klucze SSH.
  • Zapisz /etc/ssh/sshd_configi wyjdź.
  • Uruchom, sudo visudoaby edytować plik sudoers. Dodaj linię

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

    zamieniając „$ USER” na swoją nazwę użytkownika dla systemu Linux. Zapisz i wyjdź. Jeśli visudo skarży się, że twoje zmiany są nieważne, napraw je, dopóki nie zgłosi, że są one poprawne; w przeciwnym razie możesz złamać sudo w swoim systemie!

  • Po stronie systemu Windows edytuj zaporę systemu Windows (i wszelkie zapory innych firm, które mogą być uruchomione), aby zezwolić na ruch przychodzący na porcie 22. Ponieważ nie jest to super-bezpieczna konfiguracja, zalecam zezwalanie na ruch przychodzący tylko z domu ( prywatne) i sieci domen, nie z publicznego Internetu.
  • Utwórz plik tekstowy autostartssh.vbsw systemie Windows zawierający:

    set ws=wscript.createobject("wscript.shell")
    ws.run "C:\Windows\System32\bash.exe -c 'sudo /usr/sbin/sshd -D'",0
    
    • Kliknij dwukrotnie skrypt. Powinien uruchomić sshd; powinieneś mieć możliwość ssh na swoim komputerze z systemem Windows.
    • Otwórz Harmonogram zadań systemu Windows. Dodaj zadanie uruchamiane autostartssh.vbspodczas uruchamiania systemu. Użyj wscript.exejako polecenia do uruchomienia, a lokalizacja skryptu VBS jako parametru.

I to wszystko - na twoim komputerze z systemem Windows powinien być uruchomiony serwer Linux openssh!

Poma
źródło
Skrypt VBS nic dla mnie nie zrobił. sshd nie pojawia się na karcie Sieć monitora zasobów.
megamaiku
Napisałem dyspozytora procesów github.com/131/dispatcher, który pozwala na odrodzenie basha bez okien.
131
@megamaiku: Miałem ten sam problem. Okazuje się, że mały wycięty do uruchomienia sshd utknął na (niewidocznym) haśle, ponieważ nie zrobiłem części „visudo” poprawnie. Na początku dodałem linię NOPASSWD gdzieś pośrodku pliku sudoers. Działało, kiedy przeniosłem go na dół!
ltjax,
1
Obecnie współpracuje z UsePrivilegeSeparation = yestym wyjątkiem, że sudo /bin/mkdir -p /var/run/sshdprzed uruchomieniem sshd należy również uruchomić (aby utworzyć katalogi separacji uprawnień). Czy WLS obsługuje teraz chroot (), czy istnieje obejście w źródle openssh, czy też = Noustawienie jest bardziej zaleceniem bezpieczeństwa? Ponadto wydaje się, że zadanie systemu Windows działa tylko dla mnie, jeśli mój użytkownik jest zalogowany.
init_js
To działało doskonale. Sugerowałbym, aby ułatwić sprawę, przesunąć port, na którym nasłuchuje SSH, np. 3322, coś losowego. Skomentuj wiersz w /etc/ssh/sshd_configtym czytaniu Port 22i przejdź do Port 8822. Jednym z powodów jest to, że Windows uruchamia jakiś proces SSH na 22. Widziałem sugestie, że nie ma problemu z wyłączeniem tego, ale najłatwiej było po prostu zmienić port SSH WSL.
knickum
4

Musiałem zrobić to samo.

Oto, jak uruchomić system Linux Ubuntu ze wszystkimi usługami crona podczas rozruchu systemu Windows i zapewnić sposób na ponowne uruchomienie systemu Linux.

Z powodzeniem hostuję bazę openssh-server, nginx i mariadb na naszym serwerze.

Zainstaluj podsystem Linux

  • Otwórz PowerShell jako administrator
  • Pasta:

    Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux
    
  • Zainstaluj Ubuntu ze Sklepu Windows.

Usuń pytanie o hasło sudo (wymagane)

  • Open bash (Linux Subsystem instaluje to)
  • Pasta:

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

Włącz logowanie za pomocą hasła SSH (opcjonalnie)

  • Otwórz bash
  • Pasta:

    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
    

Autologinowanie Windows podczas startu (wymagane, jeśli masz hasło lub RDP w)

  • Otwórz netplwiz
  • Odznacz „Użytkownicy muszą wprowadzić nazwę użytkownika i hasło ...”
  • Otwórz regedit jako Administrator
  • Przeglądaj do

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon
    
  • Utwórz nowy ciąg DefaultPasswordi wpisz hasło użytkownika jako wartość.

Uruchom pętlę bash / cron przy starcie

  • Utwórz plik o nazwie linux.batinshell:startup
  • Pasta:

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

Dodaj aplikacje / usługi do uruchamiania na cronie

  • Otwórz bash
  • sudo crontab -e
  • Wybierz nano (lub dowolny edytor, w którym wiesz, jak zapisać)
  • Dołącz aplikacje startowe, takie jak 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
    
  • Zapisz i wyjdź:, ctrlxa następnie naciśnij yi enter.

Uruchom ponownie podsystem Linux bez ponownego uruchamiania systemu Windows

  • Otwórz bash lub SSH w

    sudo service ssh restart
    
  • Spowoduje to zamknięcie bieżącej instancji i utworzenie nowej z zastosowaniem crona.

Extra - Zainstaluj PHP 7.1 (nie tak prosto)

  • Uruchom poniższe polecenia, aby uzyskać dość standardową konfigurację:

    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
    
  • Uruchom poniższe polecenie, aby skonfigurować „OwnCloud”:

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

Extra - Zainstaluj serwer WWW Nginx

  • Uruchom poniższe polecenia dla podstawowej konfiguracji z 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 - Zainstaluj bazę danych mysql mariadb

  • Uruchom poniższe polecenia dla serwera bazy danych 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
    
  • Po wyświetleniu monitu ustaw hasło użytkownika root bazy danych.

Nie m
źródło
To bardzo sprytne! i dokładne instrukcje, dzięki. Czy istnieje sposób, aby całkowicie pominąć hasło „sudo”?
greg
Nie polecam już używania podsystemu Linux. Kompatybilność aplikacji jest do bani, jest niestabilna, a narzędzia nie działają tak dobrze, jak mogłyby - integracja bash, itp. Zamiast tego użyj msys2, zapewnia świetną powłokę bash i pozwala zainstalować wiele aplikacji za pośrednictwem jej menedżer pakietów pacman - Najlepsze są wszystkie aplikacje .exe. Wystarczy dodać katalogi bin do zmiennych środowiskowych w systemie Windows. Używam teraz poleceń Linuksa w systemie Windows i odwrotnie. Wszystkie moje skrypty systemu Windows są wykonywane w bash.
Nom
1

Odpowiedź @poma jest bardzo dobra i na tej podstawie oparta jest moja odpowiedź. Chcę jednak dodać kilka ulepszeń:

  • Użyj servicezamiast dzwonić sshdbezpośrednio: 'sudo service ssh start'zamiast 'sudo /usr/sbin/sshd -D'. W ten sposób, nawet jeśli wywołasz skrypt wielokrotnie, będzie tylko jeden sshdproces. Ponadto łatwo go zabić za pomocą innego uruchomionego skryptu 'sudo service ssh stop'. W pliku sudoers, wystarczy zamienić /usr/sbin/sshd -Dz /usr/sbin/service.
  • Jeśli ustawione na wywołanie sshdbezpośrednio, pozbyć się -Dopcją , ponieważ wprowadzi proces na pierwszym planie w nieskończoność. Jeśli mi nie wierzysz, po prostu zrób to, topa zobaczysz initi sudoproces za każdym razem, gdy wywołasz skrypt. Nie zapomnij również usunąć -Dopcji z pliku sudoers!
  • Użyj PowerShell zamiast vbs! Utwórz plik o nazwie autostartsshd.ps1i wklej w następujących przypadkach: bash -c 'sudo service ssh start'. Aby wykonać skrypt, kliknij go prawym przyciskiem myszy i kliknij Run with PowerShell.

Inne pytanie o przepełnienie stosu ma podobne kroki: /superuser//a/1114162/182590

Mam nadzieję, że ktoś komuś pomoże :)

Hintron
źródło
Jesteś pewien, że to zadziała? Uruchomienie sshd na pierwszym planie było celowe, aby sesja bash była otwarta (nie będzie problemów z wieloma instancjami, ponieważ duplikaty nie uruchomią się). Jeśli po prostu uruchomisz, sudo service ssh starta następnie zamkniesz bash, zabije to demona ssh. Przynajmniej tak zrobiłem w momencie pisania mojego przewodnika.
Poma
@Poma Dzięki najnowszej aktualizacji systemu Windows 10 aplikacje Linux mogą teraz działać w tle, więc myślę, że powinno to działać dobrze.
JacobTheDev
1

wstaw bash -c "echo [password] | service ssh start"do skryptu uruchamiania systemu Windows i użyj własnego hasła sudo, aby zastąpić [hasło]

Wei
źródło
Nie możesz po prostu przesłać hasła do monitu sudo (nie to, że twoje polecenie zawiera nawet niezbędne sudosłowo kluczowe, które sugeruje twoje zdanie). To po prostu nie działa. W każdym razie nie powinieneś przechowywać hasła w postaci zwykłego tekstu!
adam_0
1

Odpowiedzi na @Poma i @Hintron są świetne.

Chciałbym rozszerzyć opis ostatniego punktu, jak dodać zadanie ssh w Harmonogramie zadań Windows, ponieważ wymaga przełączenia niektórych opcji:

  • Uruchom „Harmonogram zadań”. Z lewej listy wybierz „Harmonogram zadań (lokalny)”, a następnie przejdź do menu „Akcja” i „Utwórz zadanie”.
  • Karta Ogólne:
    • Nazwa: „ssh”
    • Wybierz „Uruchom bez względu na to, czy użytkownik jest zalogowany”
  • Karta Wyzwalacze:
    • Nowy
      • Rozpocznij zadanie: „Przy uruchomieniu”
  • Karta Działania:
    • Nowy
      • Program / skrypt: C: \ Windows \ System32 \ bash.exe
      • Dodaj argumenty (opcjonalnie): -c "sudo / usr / sbin / service ssh start"
  • Warunki:
    • Odznacz „Uruchom zadanie tylko wtedy, gdy komputer jest zasilany prądem przemiennym
  • Ustawienia
    • Odznacz „Zatrzymaj zadanie, jeśli działa dłużej niż

Służy do bezpośredniego wywoływania bash. Nie ma potrzeby zawijania go w skryptach VBS ani PowerShell.

Korzystam z polecenia serwisowego z powodów wyjaśnionych przez @Hintron. Dodatkowo bezpośrednie wywołanie sshd powoduje błąd

Brak katalogu separacji uprawnień: / var / run / sshd

W takim przypadku należy dodać ten wpis sudo visudopoleceniem

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

Zauważ również, że tutaj wszyscy użytkownicy (pierwsza kolumna) mogą uruchomić lub zatrzymać sshd. Jeśli jesteś tylko jednym użytkownikiem tego komputera z systemem Windows, powinno być w porządku.

kwojtas
źródło
1
  1. Utwórz plik o nazwie wsl_setup.bati dodaj zawartość w następujący sposób

    wsl -u root -e sudo service ssh start
    wsl -u root -e sudo service nginx start
    
  2. Dodaj wsl_setup.batplik do folderu startowego systemu Windows windows-10-change-startup-apps

  3. Uruchom ponownie i zaloguj się do konta Windows (tak, musisz się zalogować)

gaozhidf
źródło