it-swarm.com.de

Wie starte ich den Ubuntu-Dienst unter Windows (beim Start)?

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

Gibt es eine Möglichkeit, Linux-Prozesse dauerhaft im Hintergrund ohne Bash-Fenster auszuführen?

18
Poma

Fand ein Tutorial dafür von aseering:

Dies wurde ursprünglich von den github-Benutzern imjakey, fpqc, qris, therealkenc, Manouchehri und aseering (myself) hier besprochen und aussortiert:

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

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

Versuch, die Anweisungen von github zusammenzufassen:

  • Generieren Sie SSH-Host-Schlüssel, indem Sie Sudo dpkg-reconfigure openssh-server in einer Bash-Shell ausführen
  • Sudo nano /etc/ssh/sshd_config ausführen; Bearbeiten Sie die Zeile UsePrivilegeSeparation yes, um UsePrivilegeSeparation no zu lesen. (Dies ist erforderlich, da UsePrivilegeSeparation den Syscall chroot() verwendet, den die WSL derzeit nicht unterstützt.)
  • Während Sie noch /etc/ssh/sshd_config bearbeiten, können Sie PasswordAuthentication no in PasswordAuthentication yes ändern. Andernfalls müssen Sie SSH-Schlüssel einrichten.
  • /etc/ssh/sshd_config speichern und beenden.
  • Führen Sie Sudo visudo aus, um die sudoers-Datei zu bearbeiten. Fügen Sie die Zeile hinzu

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

    ersetzen Sie "$ USER" durch Ihren Linux-Benutzernamen. Speichern und schließen. Wenn visudo beschwert, dass Ihre Änderungen ungültig sind, korrigieren Sie sie, bis sie als gültig gemeldet werden. sonst können Sie Sudo auf Ihrem System brechen!

  • Bearbeiten Sie auf der Windows-Seite die Windows-Firewall (und eventuell von Ihnen ausgeführte Firewalls von Drittanbietern), um eingehenden Datenverkehr auf Port 22 zuzulassen. private) und Domain-Netzwerke, nicht aus dem öffentlichen Internet.
  • Erstellen Sie eine Textdatei autostartssh.vbs in Windows, die Folgendes enthält:

    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, in Ihren Windows-Rechner zu sshen.
    • Öffnen Sie den Windows-Taskplaner. Fügen Sie eine Aufgabe hinzu, die autostartssh.vbs beim Systemstart ausführt. Verwenden Sie wscript.exe als auszuführenden Befehl und den Speicherort des VBS-Skripts als Parameter.

Und das war's - auf Ihrem Windows-Computer sollte ein Linux-OpenSh-Server ausgeführt werden!

24
Poma

Ich musste das Gleiche tun.

Hier erfahren Sie, wie Sie das Ubuntu Linux-Subsystem mit allen Diensten von cron beim Windows-Start booten und das Linux-Subsystem neu starten können.

Ich betreibe erfolgreich die Datenbank openssh-server, nginx & mariadb auf unserem Server.

Linux-Subsystem installieren

  • Öffnen Sie Powershell als Administrator
  • Einfügen:

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

Sudo Passwort entfernen Prompt (erforderlich)

  • Open bash (Linux Subsystem installiert dies)
  • Einfügen:

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

SSH Passwort Login aktivieren (optional)

  • Öffne die Bash
  • Einfügen:

    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-Autologin beim Start (erforderlich, wenn Sie ein Passwort oder RDP haben)

  • Öffne netplwiz
  • Deaktivieren Sie "Benutzer müssen einen Benutzernamen und ein Passwort eingeben ...".
  • Öffnen Sie regedit als Administrator
  • Suchen Sie nach

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

Bash/Cron-Schleife beim Start ausführen

  • Erstellen Sie eine Datei mit dem Namen linux.bat in Shell:startup
  • Einfügen:

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

Apps/Dienste zum Starten auf cron hinzufügen

  • Öffne die Bash
  • Sudo crontab -e
  • Wähle nano (oder einen Editor, in dem du speichern kannst)
  • Startup-Apps wie openssh-server, nginx, mysql, php anhängen:

    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 schließen: ctrlx, dann drücken y und enter.

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

  • Öffne bash oder SSH in

    Sudo service ssh restart
    
  • Dadurch wird die aktuelle Instanz geschlossen und eine neue erstellt, die cron anwendet.

Extra - Install PHP 7.1 (nicht ganz so einfach)

  • Führen Sie die folgenden Befehle aus, um ein ziemlich standardmäßiges Setup zu erhalten:

    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 ein 'OwnCloud'-Setup aus:

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

Nginx Webserver extra installieren

  • Führen Sie die folgenden Befehle für ein Basis-Setup 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 - Installiere 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
    
  • Wenn Sie dazu aufgefordert werden, legen Sie ein Kennwort für den Root-Datenbankbenutzer fest.

3
Nom

geben Sie bash -c "echo [password] | service ssh start" in das Windows-Startskript ein und verwenden Sie Ihr eigenes Sudo-Passwort, um [password] zu ersetzen.

1
Wei

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

  • Verwenden Sie serviceNAME _, anstatt sshddirekt aufzurufen: 'Sudo service ssh start' anstelle von 'Sudo /usr/sbin/sshd -D'. Selbst wenn Sie das Skript mehrmals aufrufen, gibt es auf diese Weise höchstens einen sshd-Prozess. Es ist auch einfach, es mit einem anderen Skript zu beenden, das 'Sudo service ssh stop' ausführt. In der sudoers-Datei müssen Sie einfach /usr/sbin/sshd -D durch /usr/sbin/service ersetzen.
  • Wenn Sie eingestellt sind , sshddirekt aufzurufen, wird die Option -D entfernt, da dadurch ein Prozess auf unbestimmte Zeit in den Vordergrund gerückt wird. Wenn Sie mir nicht glauben, führen Sie einfach topaus. Bei jedem Aufruf des Skripts werden ein initname__- und ein Sudoname__-Prozess angezeigt. Vergiss nicht, auch die Option -D in der sudoers-Datei zu entfernen!
  • Verwenden Sie PowerShell anstelle von vbs! Erstellen Sie eine Datei mit dem Namen autostartsshd.ps1 und 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 Stapelüberlauffrage hat ähnliche Schritte: https://superuser.com/a/1114162/182590

Hoffe das hilft jemandem :)

1
Hintron

Die Antworten von @Poma und @Hintron sind großartig.

Ich möchte die Beschreibung des letzten Punkts zum Hinzufügen einer SSH-Aufgabe in Windows Task Scheduler erweitern, da hier einige Optionen geändert werden müssen:

  • Führen Sie "Task Scheduler" aus. Wählen Sie in der linken Liste "Task Scheduler (Local)" aus, gehen Sie dann zum Menü "Action" und "Create Task".
  • Registerkarte "Allgemein":
    • Name: "ssh"
    • Wählen Sie "Ausführen, ob Benutzer angemeldet ist oder nicht"
  • Registerkarte "Auslöser":
    • Neu
      • Starten Sie die Aufgabe: "Beim Start"
  • Registerkarte "Aktionen":
    • Neu
      • Programm/Skript: C:\Windows\System32\bash.exe
      • Argumente hinzufügen (optional): -c "Sudo/usr/sbin/service ssh start"
  • Bedingungen:
    • Deaktivieren Sie "Starten Sie die Aufgabe nur, wenn der Computer mit Strom versorgt wird
  • Die Einstellungen
    • Deaktivieren Sie "Task anhalten, wenn sie länger läuft als"

Es wird ein direkter Bash-Aufruf verwendet. Es ist nicht erforderlich, es in VBS- oder Powershell-Skripten einzubinden.

Ich verwende den Befehl service aus Gründen, die @Hintron erläutert hat. Zusätzlich führt ein direkter sshd-Aufruf zu einem Fehler

Fehlendes Privilegientrennungsverzeichnis:/var/run/sshd

In diesem Fall sollte dieser Eintrag mit dem Befehl Sudo visudo hinzugefügt werden

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

Beachten Sie auch, dass hier alle Benutzer (erste Spalte) sshd starten oder stoppen können. Wenn Sie nur ein Benutzer dieses Windows-Computers sind, sollte dies in Ordnung sein.

0
kwojtas