¿Cómo ejecutar el servicio Ubuntu en Windows (al inicio)?

22

Quiero iniciar un servidor SSH en el subsistema Linux (Bash en Ubuntu en Windows) al inicio de Windows. El problema es que todos los procesos de Linux finalizan cuando se cierra la ventana Bash.

¿Hay alguna manera de hacer que el proceso de Linux se ejecute permanentemente en segundo plano sin bash window?

Poma
fuente

Respuestas:

26

Encontré un tutorial para eso al consultar:

Esto fue originalmente discutido y resuelto 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 que hornearse más tiempo, debe suponer que cualquiera que pueda ingresar a su caja de Windows tiene permiso para ejecutar cualquier comando como usuario de Windows que ejecuta sshd, independientemente de los permisos de nivel de Linux. (Los permisos son probablemente 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ándose sudo dpkg-reconfigure openssh-serveren un shell bash
  • Correr sudo nano /etc/ssh/sshd_config; edite la UsePrivilegeSeparation yeslínea para leer UsePrivilegeSeparation no. (Esto es necesario porque UsePrivilegeSeparationusa chroot()syscall, que WSL no admite actualmente).
  • Mientras sigue editando /etc/ssh/sshd_config, puede elegir cambiar PasswordAuthentication noa PasswordAuthentication yes. De lo contrario, deberá configurar las claves SSH.
  • Guardar /etc/ssh/sshd_configy salir.
  • Ejecute sudo visudopara editar el archivo sudoers. Agrega 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, puede romper sudo en su 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 solo permitir el tráfico entrante desde el hogar ( privado) y redes de dominio, no de Internet público.
  • Cree un archivo de texto autostartssh.vbsen 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ías poder ingresar a tu máquina Windows.
    • Abra el Programador de tareas de Windows. Agregue una tarea que se ejecuta autostartssh.vbsen el arranque del sistema. Use wscript.execomo comando para ejecutar y la ubicación del script VBS como parámetro.

Y eso es todo: ¡tu computadora con Windows debería estar ejecutando un servidor Linux openssh!

Poma
fuente
El script VBS no hizo nada por mí. sshd no aparece en la pestaña Red del monitor de recursos.
megamaiku
Escribí un despachador de procesos github.com/131/dispatcher que te permitirá generar bash sin ventanas.
131
@megamaiku: tuve el mismo problema. Resulta que el pequeño recorte para ejecutar sshd se atascó en la solicitud de contraseña (invisible) porque no hice bien la parte "visudo". Al principio agregué la línea NOPASSWD en algún lugar en el medio del archivo sudoers. ¡Funcionó una vez que lo moví al fondo!
ltjax
1
Actualmente está trabajando con UsePrivilegeSeparation = yes, excepto que también es necesario ejecutar sudo /bin/mkdir -p /var/run/sshd(para crear los directorios de separación de privilegios) antes de iniciar sshd. ¿WLS ahora admite chroot (), ¿hay una solución alternativa en el código de openssh o la = Noconfiguración es más una recomendación de seguridad? Además, la tarea de Windows parece funcionar solo para mí si mi usuario ha iniciado sesión.
init_js
Esto funcionó excelentemente. Sugeriría, para facilitar las cosas, mover el puerto que SSH está escuchando, por ejemplo, 3322, algo al azar. Comente la línea en /etc/ssh/sshd_configque se lee Port 22y cambie a Port 8822. Una razón para esto es que Windows ejecuta algún tipo de proceso SSH el 22. He visto sugerencias que dicen que no hay problema para deshabilitar eso, pero me pareció más fácil simplemente cambiar el puerto SSH WSL.
knickum
4

Necesito hacer lo mismo.

Aquí se explica cómo iniciar el subsistema Ubuntu Linux con todos los servicios de cron en el inicio de 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 subsistema Linux

  • Abra Powershell como administrador
  • Pegar:

    Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux
    
  • Instalar Ubuntu desde la tienda de Windows.

Eliminar solicitud de contraseña de sudo (requerido)

  • Open bash (el subsistema Linux lo instala)
  • Pegar:

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

Habilitar 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 (requerido 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 hacia

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon
    
  • Cree una nueva cadena DefaultPasswordy escriba la contraseña del usuario como valor.

Ejecute bash / cron loop al inicio

  • Crear un archivo llamado linux.batenshell:startup
  • Pegar:

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

Agregue aplicaciones / servicios al inicio en cron

  • Fiesta abierta
  • sudo crontab -e
  • Seleccione nano (o cualquier editor 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:, ctrlxluego presione yy enter.

Reinicie el subsistema Linux sin reiniciar Windows

  • Abrir 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 '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 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 - 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, configure una contraseña de usuario de la base de datos raíz.

Nom
fuente
Eso es muy inteligente! e instrucciones precisas, gracias. ¿Hay alguna manera de evitar omitir por completo la contraseña de "sudo"?
greg
Ya no recomiendo usar el subsistema Linux. La compatibilidad de la aplicación es una mierda, es inestable y las herramientas no funcionan tan bien como podrían: integración de bash, etc. Pacman Package Manager: lo mejor de todo es que todas las aplicaciones son .exe. Todo lo que necesita hacer es agregar los directorios bin a sus variables de entorno en Windows. Yo uso comandos de Linux en Windows y viceversa ahora. Todos mis scripts de Windows se realizan en bash.
Nom
1

La respuesta de @poma es muy buena, y de eso se basa mi respuesta. Sin embargo, quiero agregarle algunas mejoras:

  • Usar en servicelugar de llamar sshddirectamente: en 'sudo service ssh start'lugar de 'sudo /usr/sbin/sshd -D'. De esa manera, incluso si llama al script varias veces, solo habrá como máximo un sshdproceso. Además, es fácil matarlo con otro script que se ejecuta 'sudo service ssh stop'. En el archivo sudoers, simplemente necesita reemplazar /usr/sbin/sshd -Dcon /usr/sbin/service.
  • Si está configurado para llamar sshddirectamente, deshágase de la -Dopción , ya que eso pondrá un proceso en primer plano indefinidamente. Si no me creen, basta con hacer topy verá una inity un sudoproceso para cada vez que llamó el guión. ¡No olvides eliminar la -Dopción en el archivo sudoers también!
  • ¡Use PowerShell en lugar de vbs! Crear un archivo llamado autostartsshd.ps1y pegar en la siguiente: bash -c 'sudo service ssh start'. Para ejecutar el script, haga clic derecho y haga clic Run with PowerShell.

Otra pregunta de desbordamiento de pila tiene pasos similares: /superuser//a/1114162/182590

Espero que ayude a alguien :)

Hintron
fuente
¿Estás seguro de que esto funcionará? La ejecución de sshd en primer plano fue intencional para mantener abierta la sesión de bash (no habrá problemas con varias instancias porque los duplicados no se iniciarán). Si solo corres sudo service ssh starty luego cierras bash, matará a ssh daemon. Al menos eso es lo que hizo al momento de escribir mi guía.
Poma
@Poma Con la última actualización de Windows 10, las aplicaciones de Linux ahora pueden ejecutarse en segundo plano, por lo que creo que esto debería funcionar bien.
JacobTheDev
1

poner bash -c "echo [password] | service ssh start"en el script de inicio de Windows y usar su propia contraseña de sudo para sustituir [contraseña]

Wei
fuente
No puede simplemente canalizar una contraseña a un indicador de sudo (no es que su comando incluso incluya la sudopalabra clave necesaria que implica su oración). Esto simplemente no funciona. ¡No es que siempre debas guardar tu contraseña en texto sin formato!
adam_0
1

Las respuestas de @Poma y @Hintron son geniales.

Me gustaría ampliar la descripción del último punto sobre cómo agregar tareas ssh en el Programador de tareas de Windows, ya que requiere cambiar algunas opciones:

  • Ejecute "Programador de tareas". En la lista de la izquierda, seleccione "Programador de tareas (local)", luego vaya al menú "Acción" y "Crear tarea".
  • Pestaña General:
    • Nombre: "ssh"
    • Seleccione "Ejecutar si el usuario inició sesión o no"
  • Pestaña de activadores:
    • Nuevo
      • Comience la tarea: "Al inicio"
  • Pestaña Acciones:
    • Nuevo
      • Programa / script: C: \ Windows \ System32 \ bash.exe
      • Agregue argumentos (opcional): -c "sudo / usr / sbin / service ssh start"
  • Condiciones:
    • Anule la selección de "Iniciar la tarea solo si la computadora está alimentada por CA
  • Configuraciones
    • Anule la selección de "Detener la tarea si dura más de

Se utiliza la invocación directa de bash. No hay necesidad de envolverlo en vbs o scripts de PowerShell.

Uso el comando de servicio por razones que @Hintron explicó. Además, la invocación directa de sshd da error

Falta el directorio de separación de privilegios: / var / run / sshd

En tal caso, se debe agregar esta entrada por sudo visudocomando

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

Observe también que aquí todos los usuarios (primera columna) pueden iniciar o detener sshd. Si solo es un usuario de esta máquina con Windows, entonces debería estar bien.

kwojtas
fuente
1
  1. Cree un archivo llamado wsl_setup.baty agregue contenido de la siguiente manera

    wsl -u root -e sudo service ssh start
    wsl -u root -e sudo service nginx start
    
  2. Agregar wsl_setup.batarchivo a la carpeta de inicio de Windows windows-10-change-startup-apps

  3. Reinicie e inicie sesión en su cuenta de Windows (sí, debe iniciar sesión)

gaozhidf
fuente