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-server
in einer Bash-Shell - Führen Sie aus
sudo nano /etc/ssh/sshd_config
; bearbeiten Sie dieUsePrivilegeSeparation yes
Zeile, sodass sie lautetUsePrivilegeSeparation no
. (Das ist notwendig, weilUsePrivilegeSeparation
derchroot()
Systemaufruf verwendet wird, den WSL derzeit nicht unterstützt.) - Während Sie noch bearbeiten
/etc/ssh/sshd_config
, können Sie zu ändernPasswordAuthentication no
.PasswordAuthentication yes
Andernfalls müssen Sie SSH-Schlüssel einrichten. - Speichern
/etc/ssh/sshd_config
und schließen. Führen Sie
sudo visudo
den 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.vbs
mit 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.vbs
beim Systemstart ausgeführt wird. Verwenden Siewscript.exe
als 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
Erstellen Sie eine Datei mit dem Namen
wsl_setup.bat
und fügen Sie den Inhalt wie folgt hinzuwsl -u root -e sudo service ssh start wsl -u root -e sudo service nginx start
wsl_setup.bat
Datei zum Windows-Startordner hinzufügenWindows 10: Start-Apps ändernStarten 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
DefaultPassword
und 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.bat
Namenshell: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:
- Verwenden
service
stattsshd
direkt aufzurufen:'sudo service ssh start'
statt'sudo /usr/sbin/sshd -D'
. Auf diese Weise gibt es höchstens einensshd
Prozess, 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
,-D
die 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 Prozesstop
sehen . Vergessen Sie nicht, die Option auch in der sudoers-Datei zu entfernen !init
sudo
-D
- VerwendenPower Shellstatt 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 aufRun with PowerShell
.
Eine andere Stack-Overflow-Frage umfasst ähnliche Schritte:https://superuser.com/a/1114162/182590
Hoffe, das hilft jemandem :)