Quiero iniciar un servidor SSH en el subsistema Linux (Bash en Ubuntu en Windows) al iniciar Windows. El problema es que todos los procesos de Linux finalizan cuando se cierra la ventana de Bash.
¿Hay alguna manera de hacer que el proceso de Linux se ejecute permanentemente en segundo plano sin una ventana de bash?
Respuesta1
Encontré un tutorial para eso consultando:
Esto fue discutido y solucionado originalmente por los usuarios de github imjakey, fpqc, qris, therealkenc, Manouchehri y aseering (yo mismo) aquí:
https://github.com/Microsoft/BashOnWindows/issues/612
Tenga en cuenta que ejecutar sshd tiene implicaciones de seguridad. Hasta que el modelo de seguridad de WSL haya tenido más tiempo para prepararse, debe asumir que cualquiera que pueda ingresar mediante ssh a su caja de Windows tiene permiso para realizar cualquier comando como usuario de Windows que ejecuta sshd, independientemente de los permisos de nivel de Linux. (Los permisos probablemente sean más restrictivos que eso en la práctica, pero el modelo de seguridad inicial de WSL no pretende ser muy sofisticado).
Intentando agregar las instrucciones de github:
- Genere claves de host SSH ejecutándolas
sudo dpkg-reconfigure openssh-server
en un shell bash - Correr
sudo nano /etc/ssh/sshd_config
; edite laUsePrivilegeSeparation yes
línea para leerUsePrivilegeSeparation no
. (Esto es necesario porqueUsePrivilegeSeparation
utilizachroot()
syscall, que WSL no admite actualmente). - Mientras sigues editando
/etc/ssh/sshd_config
, puedes elegir cambiarPasswordAuthentication no
aPasswordAuthentication yes
. De lo contrario, tendrás que configurar claves SSH. - Guardar
/etc/ssh/sshd_config
y Salir. Ejecute
sudo visudo
para editar el archivo sudoers. Añade la línea$USER ALL = (root) NOPASSWD: /usr/sbin/sshd -D
reemplazando "$USER" con su nombre de usuario de Linux. Guardar y Salir. Si visudo se queja de que sus cambios no son válidos, corríjalos hasta que informe que son válidos; ¡De lo contrario, puedes romper Sudo en tu sistema!
- En el lado de Windows, edite el firewall de Windows (y cualquier firewall de terceros que pueda estar ejecutando) para permitir el tráfico entrante en el puerto 22. Debido a que esta no es una configuración súper segura, recomiendo permitir solo el tráfico entrante desde casa ( privadas) y redes de dominio, no de la Internet pública.
Cree un archivo de texto
autostartssh.vbs
en Windows que contenga lo siguiente:set ws=wscript.createobject("wscript.shell") ws.run "C:\Windows\System32\bash.exe -c 'sudo /usr/sbin/sshd -D'",0
- Haga doble clic en el guión. Debería comenzar sshd; Debería poder iniciar sesión mediante ssh en su máquina Windows.
- Abra el Programador de tareas de Windows. Agregue una tarea que se ejecute
autostartssh.vbs
al iniciar el sistema. Úselowscript.exe
como comando para ejecutar y la ubicación del script VBS como parámetro.
Y eso es todo: ¡su computadora con Windows debería estar ejecutando un servidor OpenSSH de Linux!
Respuesta2
Cree un archivo con el nombre
wsl_setup.bat
y agregue contenido de la siguiente manerawsl -u root -e sudo service ssh start wsl -u root -e sudo service nginx start
Agregar
wsl_setup.bat
archivo a la carpeta de inicio de Windowswindows-10-cambiar-aplicaciones-de-inicioReinicie e inicie sesión en su cuenta de Windows (sí, debe iniciar sesión)
Respuesta3
He necesitado hacer lo mismo.
A continuación se explica cómo iniciar el subsistema Ubuntu Linux con todos los servicios de cron al iniciar Windows y proporcionar un medio para "reiniciar" el subsistema Linux.
Estoy alojando con éxito la base de datos openssh-server, nginx y mariadb en nuestro servidor.
Instalar el subsistema Linux
- Abra Powershell como administrador
Pegar:
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux
Instale Ubuntu desde la Tienda Windows.
Eliminar la solicitud de contraseña de sudo (obligatorio)
- Abrir bash (el subsistema Linux lo instala)
Pegar:
sudo sed -i "s/%sudo.*/%sudo ALL=(ALL:ALL) NOPASSWD:ALL/g" /etc/sudoers
Habilite el inicio de sesión con contraseña SSH (opcional)
- fiesta abierta
Pegar:
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
Inicio de sesión automático de Windows al inicio (obligatorio si tiene una contraseña o RDP)
- Abrir netplwiz
- Desmarque 'Los usuarios deben ingresar un nombre de usuario y contraseña...'
- Abrir regedit como administrador
Navegar a
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon
Cree una nueva cadena
DefaultPassword
y escriba la contraseña del usuario como valor.
Ejecute el bucle bash/cron al inicio
- Crea un archivo llamado
linux.bat
enshell:startup
Pegar:
C:\Windows\System32\bash.exe -c 'while [ true ]; do sudo /usr/sbin/cron -f; done'
Agregar aplicaciones/servicios para iniciar en cron
- fiesta abierta
sudo crontab -e
- Seleccione nano (o cualquier editor en el que sepa cómo guardar)
Agregue aplicaciones de inicio 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
Guardar y salir: ctrlx, luego presione yy enter.
Reinicie el subsistema Linux sin reiniciar Windows
Abra bash o SSH en
sudo service ssh restart
Esto cerrará la instancia actual y creará una nueva aplicando cron.
Extra: instale PHP 7.1 (no tan sencillo)
Ejecute los siguientes comandos para una configuración bastante estándar:
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
Ejecute el siguiente comando para una configuración de 'OwnCloud':
PHPV=7.1 && apt install --allow-unauthenticated -y php${PHPV}-redis redis-server php${PHPV}-ldap php${PHPV}-smbclient
Extra: instalar el servidor web nginx
Ejecute los siguientes comandos para una configuración básica 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 - Instalar la base de datos mysql de mariadb
Ejecute los siguientes comandos para un servidor de base de datos 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
Cuando se le solicite, establezca una contraseña de usuario raíz de la base de datos.
Respuesta4
La respuesta de @poma es muy buena y en eso se basa mi respuesta. Sin embargo, quiero agregarle algunas mejoras:
- Usar
service
en lugar de llamarsshd
directamente:'sudo service ssh start'
en lugar de'sudo /usr/sbin/sshd -D'
. De esa manera, incluso si llamas al script varias veces, solo habrá como máximo unsshd
proceso. Además, es fácil eliminarlo con otro script que se ejecute'sudo service ssh stop'
. En el archivo sudoers, simplemente necesita reemplazarlo/usr/sbin/sshd -D
con/usr/sbin/service
. - Si ustedsonconfigurado para llamar
sshd
directamente,deshacerse de la-D
opción, porque eso pondrá un proceso en primer plano indefinidamente. Si no me cree, hágalotop
y veráinit
unsudo
proceso cada vez que llame al script. ¡No olvides eliminar-D
también la opción en el archivo sudoers! - UsarPotencia Shellen lugar de vbs! Crea un archivo llamado
autostartsshd.ps1
y pega lo siguiente:bash -c 'sudo service ssh start'
. Para ejecutar el script, haga clic derecho y haga clic enRun with PowerShell
.
Otra pregunta de desbordamiento de pila tiene pasos similares:https://superuser.com/a/1114162/182590
Espero que ayude a alguien :)