web-dev-qa-db-fra.com

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

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

Existe-t-il un moyen de faire en sorte que les processus Linux fonctionnent en permanence en arrière-plan sans fenêtre bash?

18
Poma

J'ai trouvé un tutoriel pour cela en aseering:

Cela a été discuté et réglé 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é WSL ait eu plus de temps à cuire, vous devez supposer que quiconque peut ssh dans votre machine Windows a le droit d'exécuter toute commande en tant qu'utilisateur Windows exécutant sshd, quelles que soient les autorisations accordées au niveau de Linux. (Les autorisations sont probablement plus restrictives que cela en pratique, mais le modèle de sécurité initial de WSL n'est pas très sophistiqué.)

Tenter d'agréger les instructions de github:

  • Générer des clés d'hôte SSH en exécutant Sudo dpkg-reconfigure openssh-server dans un shell bash
  • Exécutez Sudo nano /etc/ssh/sshd_config; éditez la ligne UsePrivilegeSeparation yes pour lire UsePrivilegeSeparation no. (Cela est nécessaire car UsePrivilegeSeparation utilise l'appel chroot(), que WSL ne prend actuellement pas en charge.)
  • Pendant que vous éditez toujours /etc/ssh/sshd_config, vous pouvez choisir de changer PasswordAuthentication no en PasswordAuthentication yes. Sinon, vous devrez configurer les clés SSH.
  • Enregistrez /etc/ssh/sshd_config et quittez.
  • Exécutez Sudo visudo pour éditer le fichier sudoers. Ajouter 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 de l'invalidité de vos modifications, corrigez-les jusqu'à ce que votre modification soit validée. sinon vous pouvez casser Sudo sur votre système!

  • Sous Windows, modifiez le pare-feu Windows (ainsi que tous les pare-feu tiers que vous exécutez peut-être) pour autoriser le trafic entrant sur le port 22. Etant donné qu'il ne s'agit pas d'une configuration super sécurisée, il est recommandé d'autoriser uniquement le trafic entrant à la maison ( réseaux privés) et de domaine, et non de l'Internet public.
  • Créez un fichier texte autostartssh.vbs dans 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 commencer sshd; vous devriez être capable de ssh sur votre machine Windows.
    • Ouvrez le planificateur de tâches de Windows. Ajoutez une tâche qui exécute autostartssh.vbs au démarrage du système. Utilisez wscript.exe comme commande à exécuter et l'emplacement du script VBS comme paramètre.

Et c'est tout - votre ordinateur Windows devrait utiliser un serveur Linux openssh!

24
Poma

J'ai eu besoin de faire la même chose.

Voici comment amorcer le sous-système Linux Ubuntu 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
  • Coller:

    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 (le sous-système Linux l'installe)
  • Coller:

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

Activer la connexion par mot de passe SSH (facultatif)

  • Bash ouvert
  • Coller:

    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
    

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

  • Ouvrez netplwiz
  • Décochez la case "Les utilisateurs doivent entrer un nom d'utilisateur et un mot de passe ..."
  • Ouvrez regedit en tant qu'administrateur
  • Naviguez vers

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon
    
  • Créez une nouvelle chaîne DefaultPassword et é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.bat dans Shell:startup
  • Coller:

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

Ajouter des applications/services au démarrage sur cron

  • Bash ouvert
  • Sudo crontab -e
  • Sélectionnez nano (ou n'importe quel éditeur dans lequel vous savez 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
    
  • Sauvegarder et quitter: ctrlx, puis appuyez y et enter.

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

  • Ouvrir bash ou SSH dans

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

Extra - Installer PHP 7.1 (pas tout à fait 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 installation de base avec PHP 7.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 la base de données racine.

3
Nom

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

1
Wei

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

  • Utilisez service au lieu d'appeler sshd directement: 'Sudo service ssh start' au lieu de 'Sudo /usr/sbin/sshd -D'. Ainsi, même si vous appelez le script plusieurs fois, il n’existe qu’un processus sshd au plus. En outre, il est facile de le tuer avec un autre script qui exécute 'Sudo service ssh stop'. Dans le fichier sudoers, il vous suffit de remplacer /usr/sbin/sshd -D par /usr/sbin/service.
  • Si vous définissez sur l'appel de sshd directement, supprimez l'option -D, car cela mettrait un processus au premier plan indéfiniment. Si vous ne me croyez pas, faites simplement top et vous verrez une procédure init et un Sudo à chaque fois que vous avez appelé le script. N'oubliez pas de supprimer également l'option -D du fichier sudoers!
  • Utilisez PowerShell au lieu de vbs! Créez un fichier appelé autostartsshd.ps1 et collez-le dans: bash -c 'Sudo service ssh start'. Pour exécuter le script, cliquez dessus avec le bouton droit et cliquez sur Run with PowerShell.

Une autre question relative au dépassement de pile comporte des étapes similaires: https://superuser.com/a/1114162/182590

J'espère que ça aide quelqu'un :)

1
Hintron

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

Je voudrais élargir 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 "Planificateur de tâches". Dans la liste de gauche, sélectionnez "Planificateur de tâches (local)", puis allez au menu "Action" et "Créer une tâche".
  • Onglet Général:
    • Nom: "ssh"
    • Sélectionnez "Exécuter si l'utilisateur est 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électionner "Ne démarrez la tâche que si l'ordinateur est sous tension
  • Réglages
    • Désélectionner "Arrête la tâche si elle est plus longue que

Il est utilisé invocation directe 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 convient d'ajouter cette entrée avec la commande Sudo visudo

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 seul utilisateur de cette machine Windows, cela devrait aller.

0
kwojtas