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

22

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?

Poma
quelle

Antworten:

26

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, die Berechtigung hat, 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 ist nicht besonders ausgefeilt.)

Versuch, die Anweisungen von github zusammenzufassen:

  • Generieren Sie SSH-Hostschlüssel, indem Sie sie sudo dpkg-reconfigure openssh-serverin einer Bash-Shell ausführen
  • Run sudo nano /etc/ssh/sshd_config; Bearbeiten Sie die UsePrivilegeSeparation yeszu lesende Zeile UsePrivilegeSeparation no. (Dies ist erforderlich, da UsePrivilegeSeparationder chroot()Syscall verwendet wird, den die WSL derzeit nicht unterstützt.)
  • Noch während der Bearbeitung /etc/ssh/sshd_configkönnen wählen Sie ändern PasswordAuthentication nozu PasswordAuthentication yes. Andernfalls müssen Sie SSH-Schlüssel einrichten.
  • Speichern /etc/ssh/sshd_configund beenden.
  • Führen Sie aus sudo visudo, 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. Andernfalls 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.vbsin 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-Computer zu sshen.
    • Öffnen Sie den Windows-Taskplaner. Fügen Sie eine Task 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-OpenSh-Server ausgeführt werden!

Poma
quelle
Das VBS-Skript hat nichts für mich getan. sshd wird auf der Registerkarte Netzwerk des Ressourcenmonitors nicht angezeigt.
Megamaiku
Ich schrieb aa Prozessverteiler github.com/131/dispatcher dass ‚ll können Sie laichen bash ohne Fenster.
131.
@ Megamaiku: Ich hatte das gleiche Problem. Es stellt sich heraus, dass das kleine, zum Ausführen von sshd geschnippte Programm bei der (unsichtbaren) Passwortabfrage hängen geblieben ist, weil ich den "visudo" -Teil nicht richtig ausgeführt habe. Zuerst habe ich die NOPASSWD-Zeile irgendwo in die sudoers-Datei eingefügt. Es hat funktioniert, als ich es nach unten verschoben habe!
ltjax
1
Es funktioniert derzeit mit UsePrivilegeSeparation = yes, außer dass man sudo /bin/mkdir -p /var/run/sshdvor dem Starten von sshd auch ausführen muss (um die Verzeichnisse für die Privilegentrennung zu erstellen). Unterstützt WLS jetzt chroot (), gibt es eine Problemumgehung in der OpenSh-Quelle oder ist die = NoEinstellung eher eine Sicherheitsempfehlung? Außerdem scheint die Windows-Aufgabe nur bei mir zu funktionieren, wenn mein Benutzer angemeldet ist.
init_js
Das hat hervorragend funktioniert. Ich würde vorschlagen, um die Sache einfacher zu machen, den Port zu verschieben, auf dem SSH lauscht, zB 3322, etwas Zufälliges. Kommentieren Sie die Zeile aus, in der steht /etc/ssh/sshd_config, Port 22und wechseln Sie zu Port 8822. Ein Grund dafür ist, dass Windows unter 22 eine Art SSH-Prozess ausführt. Ich habe Vorschläge gesehen, wonach es kein Problem gibt, dies zu deaktivieren, aber ich fand es am einfachsten, den WSL-SSH-Port zu wechseln.
Knickum
4

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.

Installieren Sie das Linux-Subsystem

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

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

Aufforderung zum Entfernen des sudo-Passworts (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 DefaultPasswordund schreiben Sie das Kennwort des Benutzers als Wert.

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

  • Erstellen Sie eine Datei mit dem Namen linux.batinshell:startup
  • Einfügen:

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

Hinzufügen von Apps / Diensten zum Starten auf cron

  • Ö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 beenden:, ctrlxdann yund drücken 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 - Installiere 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
    

Extra - Installiere den nginx Webserver

  • 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 - 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
    
  • Wenn Sie dazu aufgefordert werden, legen Sie ein Kennwort für den Root-Datenbankbenutzer fest.

Nom
quelle
Das ist sehr schlau! und genaue Anweisungen, danke. Gibt es eine Möglichkeit, das Überspringen des "sudo" -Passworts zu vermeiden?
Greg
Ich empfehle, das Linux-Subsystem nicht mehr zu verwenden. Die App-Kompatibilität ist zum Kotzen, sie ist instabil und die Tools funktionieren nicht alle so gut wie sie könnten - Bash-Integration usw. Verwenden Sie stattdessen msys2, es bietet Ihnen eine großartige Bash-Shell und ermöglicht Ihnen die Installation vieler Apps über deren pacman package manager - Das Beste ist, dass alle Apps .exe sind. Sie müssen lediglich die bin-Verzeichnisse zu Ihren Umgebungsvariablen in Windows hinzufügen. Ich benutze jetzt Linux-Befehle in Windows und umgekehrt. Alle meine Windows-Skripte werden in Bash ausgeführt.
Nom
1

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

  • Verwenden Sie serviceanstatt sshddirekt anzurufen : '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 sshdProzess. Es ist auch einfach, es mit einem anderen Skript zu beenden, das ausgeführt wird 'sudo service ssh stop'. In der sudoers-Datei müssen Sie lediglich ersetzen /usr/sbin/sshd -Ddurch /usr/sbin/service.
  • Wenn Sie sind auf Aufruf gesetzt sshddirekt, loszuwerden, die -DOption , weil das auf unbestimmte Zeit einen Prozess in den Vordergrund gestellt wird. Wenn Sie mir nicht glauben, tun Sie dies einfach topund Sie werden einen initund einen sudoProzess für jedes Mal sehen, wenn Sie das Skript aufrufen. Vergiss nicht, die -DOption auch in der sudoers-Datei zu entfernen !
  • Verwenden Sie PowerShell anstelle von VBS! Erstellen Sie eine Datei mit dem Namen autostartsshd.ps1und fügen Sie ihn in der folgenden: bash -c 'sudo service ssh start'. Um das Skript auszuführen, klicken Sie mit der rechten Maustaste darauf und dann auf Run with PowerShell.

Eine andere Stapelüberlauffrage weist ähnliche Schritte auf: /superuser//a/1114162/182590

Hoffe das hilft jemandem :)

Hintron
quelle
Sind Sie sicher, dass dies funktionieren wird? Das Ausführen von sshd im Vordergrund sollte die Bash-Sitzung offen halten (bei mehreren Instanzen treten keine Probleme auf, da Duplikate nicht gestartet werden können). Wenn Sie nur sudo service ssh startbash ausführen und dann schließen, wird der ssh-Daemon beendet. Zumindest war es das, was es zum Zeitpunkt des Schreibens meines Leitfadens getan hat.
Poma
@Poma Mit dem neuesten Update auf Windows 10 können Linux-Anwendungen jetzt im Hintergrund ausgeführt werden. Ich denke, dies sollte gut funktionieren.
JacobTheDev
1

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

Wei
quelle
Sie können nicht einfach ein Passwort an eine sudo-Eingabeaufforderung weiterleiten (nicht, dass Ihr Befehl sogar das notwendige sudoSchlüsselwort enthält, das Ihr Satz impliziert). Das geht einfach nicht. Nicht, dass Sie Ihr Passwort jemals im Klartext speichern sollten!
adam_0
1

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)" und 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 Fehlern

Fehlendes Privilegientrennungsverzeichnis: / var / run / sshd

In diesem Fall sollte dieser Eintrag per sudo visudoBefehl 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.

kwojtas
quelle
1
  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. In - wsl_setup.batDatei zu Windows Autostart - Ordner Windows-10-change-Startup-Anwendungen

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

Gaozhidf
quelle