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-server
em um shell bash - Correr
sudo nano /etc/ssh/sshd_config
; edite aUsePrivilegeSeparation yes
linha para lerUsePrivilegeSeparation no
. (Isso é necessário porqueUsePrivilegeSeparation
usa ochroot()
syscall, que o WSL não suporta atualmente.) - Enquanto ainda estiver editando
/etc/ssh/sshd_config
, você pode optar por mudarPasswordAuthentication no
paraPasswordAuthentication yes
. Caso contrário, você terá que configurar chaves SSH. - Salvar
/etc/ssh/sshd_config
e sair. Execute
sudo visudo
para 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.vbs
no 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.vbs
na inicialização do sistema. Usewscript.exe
como 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
Crie um arquivo chamado
wsl_setup.bat
e adicione conteúdo da seguinte maneirawsl -u root -e sudo service ssh start wsl -u root -e sudo service nginx start
Adicionar
wsl_setup.bat
arquivo à pasta de inicialização do Windowswindows-10-change-startup-appsReinicie 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
DefaultPassword
e escreva a senha do usuário como valor.
Execute o loop bash/cron no início
- Crie um arquivo
linux.bat
chamadoshell: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:
- Usar
service
em vez de ligarsshd
diretamente:'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 umsshd
processo. 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 -D
por/usr/sbin/service
. - Se vocêsãodefinido para ligar
sshd
diretamente,livrar-se da-D
opção, porque isso colocará um processo em primeiro plano indefinidamente. Se você não acredita em mim, basta acreditartop
e você veráinit
umsudo
processo para cada vez que chamar o script. Não se esqueça de remover a-D
opção no arquivo sudoers também! - UsarPowerShellem vez de vbs! Crie um arquivo chamado
autostartsshd.ps1
e cole o seguinte:bash -c 'sudo service ssh start'
. Para executar o script, clique com o botão direito e clique emRun with PowerShell
.
Outra questão de estouro de pilha tem etapas semelhantes:https://superuser.com/a/1114162/182590
Espero que ajude alguém :)