Comment exécuter le service Ubuntu sur Windows (au démarrage)?

22

Je veux lancer un serveur SSH sur le sous-système Linux (Bash sur Ubuntu sur Windows) au démarrage de Windows. Le problème est que tous les processus Linux sont arrêtés lorsque la fenêtre Bash est fermée.

Existe-t-il un moyen de faire fonctionner le processus Linux en permanence en arrière-plan sans fenêtre bash?

Poma
la source

Réponses:

26

Trouvé un tutoriel pour cela en aseering:

Cela a été initialement discuté et trié par les utilisateurs de github imjakey, fpqc, qris, therealkenc, Manouchehri et aseering (moi-même) ici:

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

Notez que l'exécution de sshd a des implications sur la sécurité. Jusqu'à ce que le modèle de sécurité de WSL ait mis plus de temps à cuire, vous devez supposer que toute personne qui peut ssh dans votre boîte Windows a la permission d'exécuter n'importe quelle commande en tant qu'utilisateur Windows exécutant sshd, indépendamment des autorisations au niveau Linux. (Les autorisations sont probablement plus restrictives que dans la pratique, mais le modèle de sécurité initial de WSL n'est pas censé être très sophistiqué.)

Tentative d'agrégation des instructions de github:

  • Générez des clés d'hôte SSH en exécutant sudo dpkg-reconfigure openssh-serverdans un shell bash
  • Run sudo nano /etc/ssh/sshd_config; éditez la UsePrivilegeSeparation yesligne à lire UsePrivilegeSeparation no. (Ceci est nécessaire car UsePrivilegeSeparationutilise l'appel chroot()système, que WSL ne prend pas en charge actuellement.)
  • Pendant la modification /etc/ssh/sshd_config, vous pouvez choisir de passer PasswordAuthentication noà PasswordAuthentication yes. Sinon, vous devrez configurer des clés SSH.
  • Enregistrez /etc/ssh/sshd_configet quittez.
  • Exécutez sudo visudopour modifier le fichier sudoers. Ajoutez la ligne

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

    en remplaçant "$ USER" par votre nom d'utilisateur Linux. Sauvegarder et quitter. Si visudo se plaint que vos modifications ne sont pas valides, corrigez-les jusqu'à ce qu'il signale qu'elles sont valides; sinon vous pouvez casser sudo sur votre système!

  • Côté Windows, modifiez le pare-feu Windows (et tous les pare-feu tiers que vous exécutez) pour autoriser le trafic entrant sur le port 22. Étant donné qu'il ne s'agit pas d'une configuration super sécurisée, je recommande d'autoriser uniquement le trafic entrant depuis la maison ( privés) et les réseaux de domaine, pas à partir d'Internet public.
  • Créez un fichier texte autostartssh.vbsdans Windows contenant les éléments suivants:

    set ws=wscript.createobject("wscript.shell")
    ws.run "C:\Windows\System32\bash.exe -c 'sudo /usr/sbin/sshd -D'",0
    
    • Double-cliquez sur le script. Il devrait démarrer sshd; vous devriez pouvoir accéder à ssh sur votre machine Windows.
    • Ouvrez le Planificateur de tâches de Windows. Ajoutez une tâche qui s'exécute autostartssh.vbsau démarrage du système. Utilisez wscript.execomme commande à exécuter et l'emplacement du script VBS comme paramètre.

Et c'est tout - votre ordinateur Windows devrait exécuter un serveur Linux openssh!

Poma
la source
Le script VBS n'a rien fait pour moi. sshd n'apparaît pas dans l'onglet Réseau du moniteur de ressources.
megamaiku
J'ai écrit un répartiteur de processus github.com/131/dispatcher qui vous permettra de générer bash sans fenêtre.
131
@megamaiku: J'ai eu le même problème. Il s'avère que le petit coupure pour exécuter sshd s'est coincé sur l'invite de mot de passe (invisible) parce que je n'ai pas fait la partie "visudo" correctement. Au début, j'ai ajouté la ligne NOPASSWD quelque part au milieu du fichier sudoers. Cela a fonctionné une fois que je l'ai déplacé vers le bas!
ltjax
1
Il fonctionne actuellement UsePrivilegeSeparation = yes, sauf qu'il faut également exécuter sudo /bin/mkdir -p /var/run/sshd(pour créer les répertoires de séparation des privilèges) avant de démarrer sshd. Est-ce que WLS prend désormais en charge chroot (), y a-t-il une solution de contournement en place dans la source openssh, ou le = Noparamètre est-il plutôt une recommandation de sécurité? De plus, la tâche Windows ne semble fonctionner pour moi que si mon utilisateur est connecté.
init_js
Cela a très bien fonctionné. Je suggère, pour faciliter les choses, de déplacer le port que SSH écoute, par exemple 3322, quelque chose de aléatoire. Mettez en commentaire la ligne /etc/ssh/sshd_configqui se lit Port 22et passez à Port 8822. Une des raisons à cela est que Windows exécute une sorte de processus SSH sur 22. J'ai vu des suggestions disant qu'il n'y avait pas de problème avec la désactivation de cela, mais j'ai trouvé qu'il était plus facile de simplement changer le port WSL SSH.
knickum
4

J'ai dû faire la même chose.

Voici comment démarrer le sous-système Ubuntu Linux avec tous les services de cron au démarrage de Windows et fournir un moyen de «redémarrer» le sous-système Linux.

J'héberge avec succès la base de données openssh-server, nginx & mariadb sur notre serveur.

Installer le sous-système Linux

  • Ouvrez Powershell en tant qu'administrateur
  • Pâte:

    Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux
    
  • Installez Ubuntu à partir du Windows Store.

Supprimer l'invite de mot de passe sudo (obligatoire)

  • Open bash (Linux Subsystem installe ceci)
  • Pâte:

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

Activer la connexion par mot de passe SSH (facultatif)

  • Open bash
  • Pâte:

    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
    

Ouverture de session Windows au démarrage (obligatoire si vous avez un mot de passe ou un RDP)

  • Netplwiz ouvert
  • Décochez "Les utilisateurs doivent saisir un nom d'utilisateur et un mot de passe ..."
  • Ouvrez regedit en tant qu'administrateur
  • Accédez à

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon
    
  • Créez une nouvelle chaîne DefaultPasswordet écrivez le mot de passe de l'utilisateur comme valeur.

Exécuter la boucle bash / cron au démarrage

  • Créez un fichier appelé linux.batdansshell:startup
  • Pâte:

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

Ajouter des applications / services au démarrage sur cron

  • Open bash
  • sudo crontab -e
  • Sélectionnez nano (ou n'importe quel éditeur dans lequel vous savez comment enregistrer)
  • Ajoutez des applications de démarrage telles que 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
    
  • Enregistrer et quitter:, ctrlxpuis appuyez sur yet enter.

Redémarrez le sous-système Linux sans redémarrer Windows

  • Ouvrez bash ou SSH dans

    sudo service ssh restart
    
  • Cela fermera l'instance actuelle et en créera une nouvelle en appliquant cron.

Extra - Installez PHP 7.1 (pas aussi simple)

  • Exécutez les commandes ci-dessous pour une configuration assez standard:

    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
    
  • Exécutez la commande ci-dessous pour une configuration 'OwnCloud':

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

Extra - Installer le serveur Web nginx

  • Exécutez les commandes ci-dessous pour une configuration de base avec 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 - Installer la base de données mysql de mariadb

  • Exécutez les commandes ci-dessous pour un serveur de base de données 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
    
  • Lorsque vous y êtes invité, définissez un mot de passe utilisateur de base de données racine.

Nom
la source
C'est très intelligent! et des instructions précises, merci. Existe-t-il un moyen d'éviter de sauter complètement le mot de passe "sudo"?
greg
Je ne recommande plus d'utiliser le sous-système Linux. La compatibilité des applications est nulle, elle est instable et les outils ne fonctionnent pas tous aussi bien qu'ils le pourraient - intégration bash, etc. Utilisez plutôt msys2, il vous fournit un excellent shell bash et vous permettra d'installer beaucoup d'applications via pacman package manager - Mieux encore, toutes les applications sont des fichiers .exe. Il vous suffit d'ajouter les répertoires bin à vos variables d'environnement dans Windows. J'utilise des commandes Linux dans Windows et vice versa maintenant. Tous mes scripts Windows se font en bash.
Nom
1

La réponse de @poma est très bonne, et c'est ce sur quoi ma réponse est basée. Je veux cependant y ajouter quelques améliorations:

  • Utilisez serviceau lieu d'appeler sshddirectement: 'sudo service ssh start'au lieu de 'sudo /usr/sbin/sshd -D'. De cette façon, même si vous appelez le script plusieurs fois, il n'y aura qu'un maximum de sshdprocessus. De plus, il est facile de le tuer avec un autre script qui s'exécute 'sudo service ssh stop'. Dans le fichier sudoers, il vous suffit de le remplacer /usr/sbin/sshd -Dpar /usr/sbin/service.
  • Si vous êtes prêt à appeler sshddirectement, supprimez l' -Doption , car cela mettra un processus au premier plan indéfiniment. Si vous ne me croyez pas, faites-le topet vous verrez un initet un sudoprocessus pour chaque fois que vous appelez le script. N'oubliez pas de supprimer également l' -Doption du fichier sudoers!
  • Utilisez PowerShell au lieu de vbs! Créez un fichier appelé autostartsshd.ps1et collez ce qui suit: bash -c 'sudo service ssh start'. Pour exécuter le script, faites un clic droit dessus et cliquez sur Run with PowerShell.

Une autre question de dépassement de pile a des étapes similaires: /superuser//a/1114162/182590

J'espère que cela aide quelqu'un :)

Hintron
la source
Êtes-vous sûr que cela fonctionnera? L'exécution de sshd au premier plan était intentionnelle pour garder la session bash ouverte (il n'y aura aucun problème avec plusieurs instances car les doublons ne démarreront pas). Si vous exécutez sudo service ssh startet fermez bash, il tuera le démon ssh. C'est du moins ce qu'il a fait au moment d'écrire mon guide.
Poma
@Poma Avec la dernière mise à jour de Windows 10, les applications Linux peuvent désormais s'exécuter en arrière-plan, donc je pense que cela devrait fonctionner correctement.
JacobTheDev
1

mettre bash -c "echo [password] | service ssh start"dans le script de démarrage de Windows et utiliser votre propre mot de passe sudo pour remplacer [mot de passe]

Wei
la source
Vous ne pouvez pas simplement diriger un mot de passe vers une invite sudo (pas que votre commande inclut même le sudomot-clé nécessaire que votre phrase implique). Cela ne fonctionne tout simplement pas. Non pas que vous devriez de toute façon stocker votre mot de passe en texte clair!
adam_0
1

Les réponses @Poma et @Hintron sont excellentes.

Je voudrais étendre la description du dernier point sur la façon d'ajouter une tâche ssh dans le Planificateur de tâches Windows car cela nécessite de changer certaines options:

  • Exécutez le "Planificateur de tâches". Dans la liste de gauche, sélectionnez "Planificateur de tâches (local)", puis allez dans le menu "Action" et "Créer une tâche".
  • Onglet Général:
    • Nom: "ssh"
    • Sélectionnez "Exécuter, que l'utilisateur soit connecté ou non"
  • Onglet Déclencheurs:
    • Nouveau
      • Commencez la tâche: "Au démarrage"
  • Onglet Actions:
    • Nouveau
      • Programme / script: C: \ Windows \ System32 \ bash.exe
      • Ajouter des arguments (facultatif): -c "sudo / usr / sbin / service ssh start"
  • Conditions:
    • Désélectionnez "Démarrer la tâche uniquement si l'ordinateur est alimenté en courant alternatif
  • Réglages
    • Désélectionnez "Arrêter la tâche si elle s'exécute plus longtemps que

Il est utilisé l'invocation directe de bash. Il n'est pas nécessaire de l'envelopper dans des scripts vbs ou PowerShell.

J'utilise la commande de service pour des raisons expliquées par @Hintron. De plus, l'invocation directe de sshd donne une erreur

Répertoire de séparation des privilèges manquant: / var / run / sshd

Dans ce cas, il faut ajouter cette entrée par sudo visudocommande

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

Notez également qu'ici tous les utilisateurs (première colonne) peuvent démarrer ou arrêter sshd. Si vous n'êtes qu'un utilisateur de cette machine Windows, cela devrait aller.

kwojtas
la source
1
  1. Créez un fichier nommé wsl_setup.batet ajoutez du contenu comme suit

    wsl -u root -e sudo service ssh start
    wsl -u root -e sudo service nginx start
    
  2. Ajouter un wsl_setup.batfichier au dossier de démarrage de Windows windows-10-change-startup-apps

  3. Redémarrez et connectez-vous à votre compte Windows (oui, vous devez vous connecter)

gaozhidf
la source