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?
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:
Sudo dpkg-reconfigure openssh-server
dans un shell bashSudo 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.)/etc/ssh/sshd_config
, vous pouvez choisir de changer PasswordAuthentication no
en PasswordAuthentication yes
. Sinon, vous devrez configurer les clés SSH./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!
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
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!
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
Coller:
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux
Installez Ubuntu à partir du Windows Store.
Supprimer l'invite de mot de passe Sudo (obligatoire)
Coller:
Sudo sed -i "s/%Sudo.*/%Sudo ALL=(ALL:ALL) NOPASSWD:ALL/g" /etc/sudoers
Activer la connexion par mot de passe SSH (facultatif)
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)
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
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
Sudo crontab -e
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.
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]
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:
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
.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!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 :)
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:
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.