Wie führe ich den Ubuntu-Dienst unter Windows aus (beim Start)?

Wie führe ich den Ubuntu-Dienst unter Windows aus (beim Start)?

Ich möchte beim Windows-Start einen SSH-Server auf einem Linux-Subsystem (Bash unter Ubuntu unter Windows) starten. Das Problem besteht darin, dass alle Linux-Prozesse beendet werden, wenn das Bash-Fenster geschlossen wird.

Gibt es eine Möglichkeit, Linux-Prozesse dauerhaft im Hintergrund laufen zu lassen, ohne Bash-Fenster?

Antwort1

Habe dazu ein Tutorial von aseering gefunden:

Dies wurde ursprünglich von den GitHub-Benutzern imjakey, fpqc, qris, therealkenc, Manouchehri und aseering (ich selbst) hier diskutiert und geklärt:

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

Beachten Sie, dass die Ausführung von sshd Auswirkungen auf die Sicherheit hat. Bis das Sicherheitsmodell von WSL ausgereift ist, sollten Sie davon ausgehen, dass jeder, der sich per SSH auf Ihre Windows-Box einloggen kann, die Berechtigung hat, jeden Befehl als Windows-Benutzer auszuführen, der sshd ausführt, unabhängig von den Berechtigungen auf Linux-Ebene. (Die Berechtigungen sind in der Praxis wahrscheinlich restriktiver, aber das anfängliche Sicherheitsmodell von WSL soll nicht sehr ausgefeilt sein.)

Versuch, die Anweisungen von GitHub zusammenzufassen:

  • Generieren Sie SSH-Hostschlüssel durch Ausführen sudo dpkg-reconfigure openssh-serverin einer Bash-Shell
  • Führen Sie aus sudo nano /etc/ssh/sshd_config; bearbeiten Sie die UsePrivilegeSeparation yesZeile, sodass sie lautet UsePrivilegeSeparation no. (Das ist notwendig, weil UsePrivilegeSeparationder chroot()Systemaufruf verwendet wird, den WSL derzeit nicht unterstützt.)
  • Während Sie noch bearbeiten /etc/ssh/sshd_config, können Sie zu ändern PasswordAuthentication no. PasswordAuthentication yesAndernfalls müssen Sie SSH-Schlüssel einrichten.
  • Speichern /etc/ssh/sshd_configund schließen.
  • Führen Sie sudo visudoden Befehl aus, um die sudoers-Datei zu bearbeiten. Fügen Sie die Zeile

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

    Ersetzen Sie „$USER“ durch Ihren Linux-Benutzernamen. Speichern und beenden Sie. Wenn visudo beschwert, dass Ihre Änderungen ungültig sind, korrigieren Sie sie, bis es sie als gültig meldet. Andernfalls können Sie sudo auf Ihrem System beschädigen!

  • Bearbeiten Sie auf der Windows-Seite die Windows-Firewall (und alle Firewalls von Drittanbietern, die Sie möglicherweise ausführen), um eingehenden Datenverkehr auf Port 22 zuzulassen. Da dies kein supersicheres Setup ist, empfehle ich, nur eingehenden Datenverkehr von Heim- (privaten) und Domänennetzwerken zuzulassen, nicht aber vom öffentlichen Internet.
  • Erstellen Sie in Windows eine Textdatei autostartssh.vbsmit folgendem Inhalt:

    set ws=wscript.createobject("wscript.shell")
    ws.run "C:\Windows\System32\bash.exe -c 'sudo /usr/sbin/sshd -D'",0
    
    • Doppelklicken Sie auf das Skript. Es sollte sshd starten; Sie sollten in der Lage sein, per SSH auf Ihren Windows-Rechner zuzugreifen.
    • Öffnen Sie den Taskplaner von Windows. Fügen Sie eine Aufgabe hinzu, die autostartssh.vbsbeim Systemstart ausgeführt wird. Verwenden Sie wscript.exeals auszuführenden Befehl und den Speicherort des VBS-Skripts als Parameter.

Und das war’s – auf Ihrem Windows-Computer sollte ein Linux OpenSSH-Server laufen!

Antwort2

  1. Erstellen Sie eine Datei mit dem Namen wsl_setup.batund fügen Sie den Inhalt wie folgt hinzu

    wsl -u root -e sudo service ssh start
    wsl -u root -e sudo service nginx start
    
  2. wsl_setup.batDatei zum Windows-Startordner hinzufügenWindows 10: Start-Apps ändern

  3. Starten Sie neu und melden Sie sich bei Ihrem Windows-Konto an (ja, Sie müssen sich anmelden)

Antwort3

Ich musste dasselbe tun.

Hier erfahren Sie, wie Sie das Ubuntu-Linux-Subsystem mit allen Cron-Diensten beim Windows-Start starten und eine Möglichkeit zum „Neustart“ des Linux-Subsystems bereitstellen.

Ich hoste den OpenSSH-Server, die Nginx- und die MariaDB-Datenbank erfolgreich auf unserem Server.

Linux-Subsystem installieren

  • Öffnen Sie Powershell als Administrator
  • Paste:

    Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux
    
  • Installieren Sie Ubuntu aus dem Windows Store.

Eingabeaufforderung für Sudo-Passwort entfernen (erforderlich)

  • Öffnen Sie Bash (das Linux-Subsystem installiert dies)
  • Paste:

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

SSH-Passwort-Login aktivieren (optional)

  • Öffne Bash
  • Paste:

    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
    

Automatische Windows-Anmeldung beim Start (erforderlich, wenn Sie über ein Kennwort oder RDP verfügen)

  • Öffnen Sie netplwiz
  • Entfernen Sie das Häkchen bei „Benutzer müssen einen Benutzernamen und ein Passwort eingeben …“.
  • Öffnen Sie regedit als Administrator
  • Navigieren Sie zu

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon
    
  • Erstellen Sie eine neue Zeichenfolge DefaultPasswordund schreiben Sie das Passwort des Benutzers als Wert.

Führen Sie beim Start eine Bash-/Cron-Schleife aus

  • Erstellen Sie eine Datei mit dem linux.batNamenshell:startup
  • Paste:

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

Apps/Dienste zum Start per Cron hinzufügen

  • Öffne Bash
  • sudo crontab -e
  • Wählen Sie nano (oder einen beliebigen Editor, mit dem Sie speichern können)
  • Anhängen von Start-Apps wie 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
    
  • Speichern und beenden: ctrlx, dann yund drücken enter.

Starten Sie das Linux-Subsystem neu, ohne Windows neu zu starten

  • Öffnen Sie Bash oder SSH in

    sudo service ssh restart
    
  • Dadurch wird die aktuelle Instanz geschlossen und durch Anwendung von Cron eine neue erstellt.

Extra – Installieren Sie PHP 7.1 (nicht ganz so einfach)

  • Führen Sie die folgenden Befehle für eine relativ standardmäßige Einrichtung aus:

    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
    
  • Führen Sie den folgenden Befehl für eine „OwnCloud“-Einrichtung aus:

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

Extra - Nginx-Webserver installieren

  • Führen Sie die folgenden Befehle für eine Basiseinrichtung mit PHP7.1 aus:

    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 - Installieren Sie die MySQL-Datenbank von MariaDB

  • Führen Sie die folgenden Befehle für einen MySQL-Datenbankserver aus:

    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
    
  • Legen Sie bei der entsprechenden Aufforderung ein Kennwort für den Root-Datenbankbenutzer fest.

Antwort4

Die Antwort von @poma ist sehr gut und bildet die Grundlage meiner Antwort. Ich möchte jedoch einige Verbesserungen hinzufügen:

  • Verwendenservicestatt sshddirekt aufzurufen: 'sudo service ssh start'statt 'sudo /usr/sbin/sshd -D'. Auf diese Weise gibt es höchstens einen sshdProzess, auch wenn Sie das Skript mehrmals aufrufen. Außerdem ist es einfach, es mit einem anderen Skript zu beenden, das ausgeführt wird . In der sudoers-Datei müssen Sie einfach durch 'sudo service ssh stop'ersetzen ./usr/sbin/sshd -D/usr/sbin/service
  • Wenn duSinddirekt anrufen sshd,-Ddie Option loswerden, weil dadurch ein Prozess auf unbestimmte Zeit in den Vordergrund gestellt wird. Wenn Sie mir nicht glauben, tun Sie es einfach und Sie werden bei jedem Aufruf des Skripts ein und einen Prozess topsehen . Vergessen Sie nicht, die Option auch in der sudoers-Datei zu entfernen !initsudo-D
  • VerwendenPower Shellstatt vbs! Erstellen Sie eine Datei mit dem Namen autostartsshd.ps1und fügen Sie Folgendes ein: bash -c 'sudo service ssh start'. Um das Skript auszuführen, klicken Sie mit der rechten Maustaste darauf und klicken Sie auf Run with PowerShell.

Eine andere Stack-Overflow-Frage umfasst ähnliche Schritte:https://superuser.com/a/1114162/182590

Hoffe, das hilft jemandem :)

verwandte Informationen