Como executar o serviço Ubuntu no Windows (na inicialização)?

Como executar o serviço Ubuntu no Windows (na inicialização)?

Quero iniciar um servidor SSH no subsistema Linux (Bash no Ubuntu no Windows) na inicialização do Windows. O problema é que todos os processos do Linux são encerrados quando a janela do Bash é fechada.

Existe uma maneira de fazer com que o processo do Linux seja executado permanentemente em segundo plano, sem a janela bash?

Responder1

Encontrei um tutorial para isso perguntando:

Isso foi originalmente discutido e resolvido pelos usuários do github imjakey, fpqc, qris, therealkenc, Manouchehri e aseering (eu mesmo) aqui:

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

Observe que a execução do sshd tem implicações de segurança. Até que o modelo de segurança do WSL tenha mais tempo para ser preparado, você deve assumir que qualquer pessoa que possa fazer ssh em sua caixa do Windows tenha permissão para executar qualquer comando como o usuário do Windows executando o sshd, independentemente das permissões no nível do Linux. (As permissões são provavelmente mais restritivas do que na prática, mas o modelo de segurança inicial do WSL não pretende ser muito sofisticado.)

Tentando agregar as instruções do github:

  • Gere chaves de host SSH executando sudo dpkg-reconfigure openssh-serverem um shell bash
  • Correr sudo nano /etc/ssh/sshd_config; edite a UsePrivilegeSeparation yeslinha para ler UsePrivilegeSeparation no. (Isso é necessário porque UsePrivilegeSeparationusa o chroot()syscall, que o WSL não suporta atualmente.)
  • Enquanto ainda estiver editando /etc/ssh/sshd_config, você pode optar por mudar PasswordAuthentication nopara PasswordAuthentication yes. Caso contrário, você terá que configurar chaves SSH.
  • Salvar /etc/ssh/sshd_confige sair.
  • Execute sudo visudopara editar o arquivo sudoers. Adicione a linha

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

    substituindo "$USER" pelo seu nome de usuário do Linux. Salvar e sair. Se o visudo reclamar que suas alterações são inválidas, corrija-as até que ele informe que são válidas; caso contrário, você pode quebrar o sudo no seu sistema!

  • No lado do Windows, edite o firewall do Windows (e quaisquer firewalls de terceiros que você possa estar executando) para permitir o tráfego de entrada na porta 22. Como esta não é uma configuração supersegura, recomendo permitir apenas o tráfego de entrada de casa ( privado) e redes de domínio, não da Internet pública.
  • Crie um arquivo de texto autostartssh.vbsno Windows contendo o seguinte:

    set ws=wscript.createobject("wscript.shell")
    ws.run "C:\Windows\System32\bash.exe -c 'sudo /usr/sbin/sshd -D'",0
    
    • Clique duas vezes no script. Deve iniciar o sshd; você deve ser capaz de fazer ssh em sua máquina Windows.
    • Abra o Agendador de Tarefas do Windows. Adicione uma tarefa executada autostartssh.vbsna inicialização do sistema. Use wscript.execomo comando a ser executado e a localização do script VBS como parâmetro.

E é isso – seu computador Windows deve estar executando um servidor Linux openssh!

Responder2

  1. Crie um arquivo chamado wsl_setup.bate adicione conteúdo da seguinte maneira

    wsl -u root -e sudo service ssh start
    wsl -u root -e sudo service nginx start
    
  2. Adicionar wsl_setup.batarquivo à pasta de inicialização do Windowswindows-10-change-startup-apps

  3. Reinicie e faça login na sua conta do Windows (sim, você precisa fazer login)

Responder3

Eu precisei fazer a mesma coisa.

Veja como inicializar o subsistema Ubuntu Linux com todos os serviços do cron na inicialização do Windows e fornecer um meio de ‘reiniciar’ o subsistema Linux.

Estou hospedando com sucesso o banco de dados openssh-server, nginx & mariadb em nosso servidor.

Instale o subsistema Linux

  • Abra o Powershell como administrador
  • Colar:

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

Remover solicitação de senha do sudo (obrigatório)

  • Abra o bash (o subsistema Linux instala isso)
  • Colar:

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

Habilitar login com senha SSH (opcional)

  • Festa aberta
  • Colar:

    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
    

Login automático do Windows na inicialização (obrigatório se você tiver uma senha ou RDP)

  • Abra o netplwiz
  • Desmarque 'Os usuários devem inserir um nome de usuário e senha...'
  • Abra o regedit como administrador
  • Navegue até

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon
    
  • Crie uma nova string DefaultPassworde escreva a senha do usuário como valor.

Execute o loop bash/cron no início

  • Crie um arquivo linux.batchamadoshell:startup
  • Colar:

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

Adicione aplicativos/serviços para inicialização no cron

  • Festa aberta
  • sudo crontab -e
  • Selecione nano (ou qualquer editor que você saiba salvar)
  • Anexe aplicativos de inicialização como 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
    
  • Salve e saia: ctrlxe pressione ye enter.

Reinicie o subsistema Linux sem reiniciar o Windows

  • Abra o bash ou SSH em

    sudo service ssh restart
    
  • Isso fechará a instância atual e criará uma nova aplicando o cron.

Extra - Instale o PHP 7.1 (não tão simples)

  • Execute os comandos abaixo para uma configuração bastante padrão:

    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
    
  • Execute o comando abaixo para uma configuração 'OwnCloud':

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

Extra - Instale o servidor web nginx

  • Execute os comandos abaixo para uma configuração básica com 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 - Instale o banco de dados mysql do mariadb

  • Execute os comandos abaixo para um servidor de banco de dados 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 solicitado, defina uma senha de usuário do banco de dados raiz.

Responder4

A resposta do @poma é muito boa e é nisso que minha resposta se baseia. Quero adicionar algumas melhorias a ele:

  • Usarserviceem vez de ligar sshddiretamente: 'sudo service ssh start'em vez de 'sudo /usr/sbin/sshd -D'. Dessa forma, mesmo que você chame o script diversas vezes, só haverá no máximo um sshdprocesso. Além disso, é fácil eliminá-lo com outro script que execute o 'sudo service ssh stop'. No arquivo sudoers, você simplesmente precisa substituir /usr/sbin/sshd -Dpor /usr/sbin/service.
  • Se vocêsãodefinido para ligar sshddiretamente,livrar-se da -Dopção, porque isso colocará um processo em primeiro plano indefinidamente. Se você não acredita em mim, basta acreditar tope você verá initum sudoprocesso para cada vez que chamar o script. Não se esqueça de remover a -Dopção no arquivo sudoers também!
  • UsarPowerShellem vez de vbs! Crie um arquivo chamado autostartsshd.ps1e cole o seguinte: bash -c 'sudo service ssh start'. Para executar o script, clique com o botão direito e clique em Run with PowerShell.

Outra questão de estouro de pilha tem etapas semelhantes:https://superuser.com/a/1114162/182590

Espero que ajude alguém :)

informação relacionada