Come eseguire il servizio Ubuntu su Windows (all'avvio)?


22

Voglio avviare un server SSH sul sottosistema Linux (Bash su Ubuntu su Windows) all'avvio di Windows. Il problema è che tutti i processi Linux vengono chiusi quando viene chiusa la finestra di Bash.

C'è un modo per far funzionare permanentemente il processo Linux in background senza bash window?

Risposte:


26

Ho trovato un tutorial per questo orientando:

Questo è stato originariamente discusso e risolto dagli utenti di github imjakey, fpqc, qris, therealkenc, Manouchehri e aseering (me stesso) qui:

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

Si noti che l'esecuzione di sshd ha implicazioni per la sicurezza. Fino a quando il modello di sicurezza di WSL non avrà dovuto essere più lungo, è necessario supporre che chiunque sia in grado di accedere a ssh nella propria casella di Windows disponga dell'autorizzazione per eseguire qualsiasi comando come utente Windows che esegue sshd, indipendentemente dalle autorizzazioni a livello di Linux. (Le autorizzazioni sono probabilmente più restrittive di quelle nella pratica, ma il modello di sicurezza iniziale di WSL non è destinato a essere molto sofisticato.)

Tentativo di aggregare le istruzioni da github:

  • Genera chiavi host SSH eseguendo sudo dpkg-reconfigure openssh-serverin una shell bash
  • Corri sudo nano /etc/ssh/sshd_config; modifica la UsePrivilegeSeparation yesriga da leggere UsePrivilegeSeparation no. (Ciò è necessario perché UsePrivilegeSeparationutilizza la chroot()syscall, che WSL attualmente non supporta.)
  • Durante la modifica /etc/ssh/sshd_config, puoi scegliere di passare PasswordAuthentication noa PasswordAuthentication yes. Altrimenti dovrai impostare le chiavi SSH.
  • Salva /etc/ssh/sshd_configed esci.
  • Esegui sudo visudoper modificare il file sudoers. Aggiungi la linea

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

    sostituendo "$ USER" con il tuo nome utente Linux. Salva ed esci. Se visudo si lamenta che le modifiche non sono valide, correggile fino a quando non segnala che sono valide; altrimenti puoi rompere sudo sul tuo sistema!

  • Sul lato Windows, modifica il firewall di Windows (e tutti i firewall di terze parti che potresti essere in esecuzione) per consentire il traffico in entrata sulla porta 22. Poiché questa non è un'impostazione super sicura, ti consiglio di consentire solo il traffico in entrata da casa ( privato) e reti di dominio, non da Internet pubblico.
  • Creare un file di testo autostartssh.vbsin Windows contenente quanto segue:

    set ws=wscript.createobject("wscript.shell")
    ws.run "C:\Windows\System32\bash.exe -c 'sudo /usr/sbin/sshd -D'",0
    
    • Fare doppio clic sullo script. Dovrebbe iniziare sshd; dovresti essere in grado di ssh nel tuo computer Windows.
    • Apri l'Utilità di pianificazione di Windows. Aggiungi un'attività che viene eseguita autostartssh.vbsall'avvio del sistema. Utilizzare wscript.execome comando da eseguire e la posizione dello script VBS come parametro.

E il gioco è fatto: il tuo computer Windows dovrebbe eseguire un server openssh Linux!


Lo script VBS non ha fatto nulla per me. sshd non viene visualizzato nella scheda Rete del monitor delle risorse.
megamaiku,

Ho scritto un dispatcher di processo github.com/131/dispatcher che ti permetterà di generare bash senza finestre.
131,

@megamaiku: ho avuto lo stesso problema. Si scopre che il piccolo frammento da eseguire sshd si è bloccato sul prompt della password (invisibile) perché non ho fatto bene la parte "visudo". All'inizio ho aggiunto la linea NOPASSWD da qualche parte nel mezzo del file sudoers. Ha funzionato una volta spostato verso il basso!
ltjax,

1
Attualmente sta funzionando UsePrivilegeSeparation = yes, tranne per il fatto che è necessario eseguire anche sudo /bin/mkdir -p /var/run/sshd(per creare le directory di separazione dei privilegi) prima di avviare sshd. WLS ora supporta chroot (), esiste una soluzione alternativa nella fonte openssh o l' = Noimpostazione è più una raccomandazione di sicurezza? Inoltre, l'attività di Windows sembra funzionare solo per me se il mio utente è connesso.
init_js

Questo ha funzionato in modo eccellente. Suggerirei, per rendere le cose più facili, spostare la porta su cui SSH è in ascolto, ad esempio 3322, qualcosa di casuale. Commenta la riga /etc/ssh/sshd_configche legge Port 22e passa a Port 8822. Uno dei motivi è che Windows esegue una sorta di processo SSH il 22. Ho visto dei suggerimenti che dicono che non c'è alcun problema con la disabilitazione di questo, ma ho trovato più semplice cambiare la porta SSH WSL.
knickum,

4

Ho dovuto fare la stessa cosa.

Ecco come avviare il sottosistema Ubuntu Linux con tutti i servizi di cron all'avvio di Windows e fornire un mezzo per "riavviare" il sottosistema Linux.

Sto ospitando con successo il database openssh-server, nginx e mariadb sul nostro server.

Installa sottosistema Linux

  • Apri Powershell come amministratore
  • Incolla:

    Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux
    
  • Installa Ubuntu da Windows Store.

Rimuovi richiesta password sudo (richiesto)

  • Open bash (il sottosistema Linux lo installa)
  • Incolla:

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

Abilita accesso con password SSH (opzionale)

  • Apri bash
  • Incolla:

    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
    

Accesso automatico di Windows all'avvio (richiesto se si dispone di una password o RDP in)

  • Apri netplwiz
  • Deseleziona "Gli utenti devono inserire un nome utente e una password ..."
  • Apri regedit come amministratore
  • Sfoglia per

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon
    
  • Crea una nuova stringa DefaultPassworde scrivi la password dell'utente come valore.

Esegui loop bash / cron all'avvio

  • Creare un file denominato linux.batinshell:startup
  • Incolla:

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

Aggiungi app / servizi all'avvio su cron

  • Apri bash
  • sudo crontab -e
  • Seleziona nano (o qualsiasi editor in cui sai salvare)
  • Aggiungi app di avvio come 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
    
  • Salva ed esci:, ctrlxquindi premere ye enter.

Riavvia il sottosistema Linux senza riavviare Windows

  • Apri bash o SSH in

    sudo service ssh restart
    
  • Questo chiuderà l'istanza corrente e ne creerà una nuova applicando cron.

Extra - Installa PHP 7.1 (non è così semplice)

  • Esegui i comandi seguenti per una configurazione abbastanza 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
    
  • Esegui il comando seguente per un'installazione 'OwnCloud':

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

Extra - Installa il server web nginx

  • Esegui i comandi seguenti per una configurazione di base con 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: installa il database mysql di mariadb

  • Eseguire i comandi seguenti per un server di database 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
    
  • Quando richiesto, impostare una password utente per il database radice.


È molto intelligente! e istruzioni precise, grazie. C'è un modo per evitare di saltare completamente la password "sudo"?
Greg

Non consiglio più di usare il sottosistema Linux. La compatibilità delle app fa schifo, è instabile e gli strumenti non funzionano tutti come potrebbero - bash integrazione, ecc. Invece usa msys2, ti fornisce un'ottima shell bash e ti permetterà di installare molte app tramite pacman package manager - Soprattutto, tutte le app sono .exe. Tutto quello che devi fare è aggiungere le directory bin alle variabili di ambiente in Windows. Uso i comandi di Linux in Windows e viceversa ora. Tutti i miei script di Windows vengono eseguiti in bash.
Nom

1

La risposta di @poma è molto buona, ed è ciò su cui si basa la mia risposta. Voglio aggiungere alcuni miglioramenti ad esso, però:

  • Usa serviceinvece di chiamare sshddirettamente: 'sudo service ssh start'invece di 'sudo /usr/sbin/sshd -D'. In questo modo, anche se si chiama lo script più volte, ci sarà al massimo un sshdprocesso. Inoltre, è facile ucciderlo con un altro script che viene eseguito 'sudo service ssh stop'. Nel file sudoers, devi semplicemente sostituirlo /usr/sbin/sshd -Dcon /usr/sbin/service.
  • Se state impostate a chiamare sshddirettamente, sbarazzarsi della -Dpossibilità , perché questo mette un processo in primo piano a tempo indeterminato. Se non mi credete, basta fare tope vedrete una inite un sudoprocesso per ogni volta che si chiama lo script. Non dimenticare di rimuovere anche l' -Dopzione nel file sudoers!
  • Usa PowerShell invece di vbs! Creare un file chiamato autostartsshd.ps1e incollare il seguente: bash -c 'sudo service ssh start'. Per eseguire lo script, fare clic con il tasto destro e fare clic Run with PowerShell.

Un'altra domanda di overflow dello stack ha passaggi simili: /superuser//a/1114162/182590

Spero che aiuti qualcuno :)


Sei sicuro che funzionerà? L'esecuzione di sshd in primo piano era intenzionale per mantenere aperta la sessione bash (non ci saranno problemi con più istanze perché i duplicati non si avviano). Se corri sudo service ssh starte chiudi bash, ucciderà il demone ssh. Almeno questo è quello che ha fatto al momento di scrivere la mia guida.
Poma,

@Poma Con l'ultimo aggiornamento di Windows 10, le applicazioni Linux possono ora essere eseguite in background, quindi penso che dovrebbe funzionare bene.
JacobTheDev,

1

inserire lo bash -c "echo [password] | service ssh start"script di avvio di Windows e utilizzare la propria password sudo per sostituire [password]


Non puoi semplicemente reindirizzare una password a un prompt di sudo (non che il tuo comando includa anche la sudoparola chiave necessaria che la tua frase implica). Questo non funziona. Non che tu debba mai archiviare la tua password in testo normale comunque!
adam_0,

1

Le risposte di @Poma e @Hintron sono fantastiche.

Vorrei estendere la descrizione dell'ultimo punto su come aggiungere attività ssh nell'Utilità di pianificazione di Windows in quanto richiede il passaggio di alcune opzioni:

  • Esegui "Utilità di pianificazione". Nell'elenco a sinistra selezionare "Utilità di pianificazione (locale)", quindi andare al menu "Azione" e "Crea attività".
  • Scheda Generale:
    • Nome: "ssh"
    • Seleziona "Esegui se l'utente è connesso o meno"
  • Scheda Trigger:
    • Nuovo
      • Inizia l'attività: "All'avvio"
  • Scheda Azioni:
    • Nuovo
      • Programma / script: C: \ Windows \ System32 \ bash.exe
      • Aggiungi argomenti (facoltativo): -c "sudo / usr / sbin / service ssh start"
  • condizioni:
    • Deseleziona "Avvia l'attività solo se il computer è alimentato a corrente alternata
  • impostazioni
    • Deseleziona "Interrompi l'attività se viene eseguita più a lungo di

Si utilizza l'invocazione bash diretta. Non è necessario racchiuderlo negli script VBS o PowerShell.

Uso il comando di servizio per le ragioni spiegate da @Hintron. Inoltre, l'invocazione diretta sshd dà errore

Directory di separazione dei privilegi mancante: / var / run / sshd

In tal caso, è necessario aggiungere questa voce tramite sudo visudocomando

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

Si noti inoltre che qui tutti gli utenti (prima colonna) possono avviare o interrompere sshd. Se sei solo un utente di questo computer Windows, allora dovrebbe andare bene.


1
  1. Crea un file denominato wsl_setup.bate aggiungi il contenuto come segue

    wsl -u root -e sudo service ssh start
    wsl -u root -e sudo service nginx start
    
  2. Aggiungi wsl_setup.batfile alla cartella di avvio di Windows windows-10-change-startup-apps

  3. Riavvia e accedi al tuo account di Windows (sì, devi accedere)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.