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

22

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 Linux seja executado permanentemente em segundo plano sem a janela do bash?

Poma
fonte

Respostas:

26

Encontrei um tutorial para isso pesquisando:

Isso foi discutido e resolvido originalmente pelos usuários do github imjakey, fpqc, qris, therealkenc, Manouchehri e aseering (eu) 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 da WSL tenha demorado mais tempo para assar, você deve assumir que qualquer pessoa que possa ssh na sua caixa do Windows tem permissão para executar qualquer comando como 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 da WSL não se destina a ser muito sofisticado.)

Tentativa de agregar as instruções do github:

  • Gere chaves de host SSH executando sudo dpkg-reconfigure openssh-serverem um shell bash
  • Corra 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 no momento.)
  • Enquanto ainda está editando /etc/ssh/sshd_config, você pode optar por mudar PasswordAuthentication nopara PasswordAuthentication yes. Caso contrário, você precisará configurar as chaves SSH.
  • Salve /etc/ssh/sshd_confige saia.
  • 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 relate 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 qualquer firewall de terceiros que você possa estar executando) para permitir o tráfego de entrada na porta 22. Como essa não é uma configuração super-segura, recomendo apenas permitir o tráfego de entrada em casa ( privadas) 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 poder fazer o ssh na sua máquina Windows.
    • Abra o Agendador de tarefas do Windows. Adicione uma tarefa que seja executada autostartssh.vbsna inicialização do sistema. Use wscript.execomo o comando a ser executado e o local do script VBS como parâmetro.

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

Poma
fonte
O script VBS não fez nada por mim. O sshd não está aparecendo na guia Rede do monitor de recursos.
megamaiku
Eu escrevi um expedidor de processo github.com/131/dispatcher que permite gerar o bash sem janelas.
131
@megamaiku: Eu tive o mesmo problema. Acontece que o pequeno recorte para executar o sshd ficou preso no prompt de senha (invisível) porque eu não fiz a parte "visudo" corretamente. No começo, adicionei a linha NOPASSWD em algum lugar no meio do arquivo sudoers. Funcionou assim que o movi para o fundo!
precisa saber é
11
No momento, ele está trabalhando UsePrivilegeSeparation = yes, exceto que também é necessário executar sudo /bin/mkdir -p /var/run/sshd(para criar os diretórios de separação de privilégios) antes de iniciar o sshd. O WLS agora suporta chroot (), existe uma solução alternativa na fonte openssh ou a = Noconfiguração é mais uma recomendação de segurança? Além disso, a tarefa do Windows parece funcionar apenas para mim se meu usuário estiver logado.
init_js 11/11
Isso funcionou excelentemente. Eu sugeriria, para facilitar as coisas, mover a porta em que o SSH está ouvindo, por exemplo, 3322, algo aleatório. Comente a linha /etc/ssh/sshd_configque lê Port 22e mude para Port 8822. Uma razão para isso é o Windows executando algum tipo de processo SSH em 22. Vi sugestões dizendo que não há problema em desativar isso, mas achei mais fácil alternar a porta SSL WSL.
knickum
4

Eu precisava 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 'reinicializar' o subsistema Linux.

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

Instalar subsistema Linux

  • Abra o PowerShell como administrador
  • Colar:

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

Remover prompt de senha sudo (obrigatório)

  • Open bash (o Subsistema Linux instala isso)
  • Colar:

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

Ativar login com senha SSH (opcional)

  • Open bash
  • 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
    

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

  • Abrir netplwiz
  • Desmarque "Os usuários devem digitar 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 chamado linux.batnoshell:startup
  • Colar:

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

Adicionar aplicativos / serviços à inicialização no cron

  • Open bash
  • sudo crontab -e
  • Selecione nano (ou qualquer editor que você saiba como 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
    
  • Salvar e sair:, ctrlxdepois pressione ye enter.

Reinicialize o subsistema Linux sem reiniciar o Windows

  • Abra o bash ou SSH no

    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 direto)

  • Execute os comandos abaixo para obter 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 da web nginx

  • Execute os comandos abaixo para uma configuração básica com o 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.

Nom
fonte
Isso é muito inteligente! e instruções precisas, obrigado. Existe uma maneira de evitar pular a senha "sudo" completamente?
greg
Não recomendo mais usar o subsistema Linux. A compatibilidade do aplicativo é péssima, é instável e as ferramentas não funcionam tão bem quanto poderiam - integração do bash, etc. Em vez disso, use o msys2, ele fornece um ótimo shell do bash e permitirá a instalação de vários aplicativos pacman package manager - O melhor de tudo é que todos os aplicativos são .exe. Tudo o que você precisa fazer é adicionar os diretórios bin às suas variáveis ​​de ambiente no Windows. Eu uso comandos linux no windows e vice-versa agora. Todos os meus scripts do Windows são feitos no bash.
Nom
1

A resposta de @poma é muito boa, e é com isso que minha resposta se baseia. Eu quero adicionar algumas melhorias, no entanto:

  • Use em servicevez de ligar sshddiretamente: em 'sudo service ssh start'vez de 'sudo /usr/sbin/sshd -D'. Dessa forma, mesmo se você chamar o script várias vezes, haverá apenas no máximo um sshdprocesso. Além disso, é fácil matá-lo com outro script que é executado 'sudo service ssh stop'. No arquivo sudoers, basta substituir /usr/sbin/sshd -Dpor /usr/sbin/service.
  • Se você estiver ligando sshddiretamente, livre-se da -Dopção , porque isso colocará um processo em primeiro plano indefinidamente. Se você não acredita em mim, apenas acredite tope verá initum sudoprocesso para cada vez que chamou o script. Não se esqueça de remover a -Dopção no arquivo sudoers também!
  • Use o PowerShell em vez de vbs! Crie um arquivo chamado autostartsshd.ps1e colar no seguinte: bash -c 'sudo service ssh start'. Para executar o script, clique com o botão direito do mouse e clique em Run with PowerShell.

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

Espero que ajude alguém :)

Hintron
fonte
Tem certeza de que isso funcionará? A execução do sshd em primeiro plano foi intencional para manter a sessão do bash aberta (não haverá problemas com várias instâncias porque as duplicatas falharão ao iniciar). Se você apenas executar sudo service ssh starte fechar o bash, o ssh daemon será morto. Pelo menos foi o que fez no momento em que escrevi meu guia.
Poma 28/05
@ Poma Com a atualização mais recente do Windows 10, os aplicativos Linux agora podem ser executados em segundo plano, então acho que isso deve funcionar bem.
JacobTheDev
1

insira bash -c "echo [password] | service ssh start"o script de inicialização do Windows e use sua própria senha sudo para substituir [password]

Wei
fonte
Você não pode simplesmente canalizar uma senha para um prompt do sudo (não que seu comando inclua a sudopalavra-chave necessária que sua sentença implica). Isso simplesmente não funciona. Não que você deva armazenar sua senha em texto simples de qualquer maneira!
adam_0 17/09
1

As respostas @Poma e @Hintron são ótimas.

Gostaria de estender a descrição do último ponto, como adicionar a tarefa ssh no Agendador de Tarefas do Windows, pois é necessário alternar algumas opções:

  • Execute o "Agendador de tarefas". Na lista à esquerda, selecione "Agendador de tarefas (local)" e vá para o menu "Ação" e "Criar tarefa".
  • Guia geral:
    • Nome: "ssh"
    • Selecione "Executar se o usuário estiver conectado ou não"
  • Guia Acionadores:
    • Novo
      • Comece a tarefa: "Na inicialização"
  • Guia Ações:
    • Novo
      • Programa / script: C: \ Windows \ System32 \ bash.exe
      • Adicione argumentos (opcional): -c "sudo / usr / sbin / service ssh start"
  • Condições:
    • Desmarque "Iniciar a tarefa apenas se o computador estiver ligado à energia CA
  • Configurações
    • Desmarque "Interrompa a tarefa se ela executar mais do que

É usada a chamada direta do bash. Não há necessidade de envolvê-lo em scripts vbs ou powershell.

Eu uso o comando service por razões explicadas pelo @Hintron. Além disso, a chamada sshd direta fornece erro

Diretório de separação de privilégios ausente: / var / run / sshd

Nesse caso, deve ser adicionada esta entrada por sudo visudocomando

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

Observe também que aqui todos os usuários (primeira coluna) podem iniciar ou parar o sshd. Se você é apenas um usuário desta máquina Windows, tudo bem.

kwojtas
fonte
1
  1. Crie um arquivo nomeado 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 Windows windows-10-change-startup-apps

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

gaozhidf
fonte