18

Я хочу запустить SSH-сервер в подсистеме Linux (Bash в Ubuntu в Windows) при запуске Windows. Проблема в том, что все процессы Linux завершаются при закрытии окна Bash.

Есть ли способ заставить процесс Linux постоянно работать в фоновом режиме без окна bash?

4 ответа4

22

Нашел учебник для этого, посмотрев:

Это было первоначально обсуждено и разобрано пользователями github imjakey, fpqc, qris, therealkenc, Manouchehri и aseering (я) здесь:

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

Обратите внимание, что запуск sshd имеет последствия для безопасности. До тех пор, пока модель безопасности WSL больше не будет выпекаться, вы должны предполагать, что любой, кто может использовать ssh в вашем Windows-боксе, имеет разрешение на выполнение любой команды от имени пользователя Windows, выполняющего sshd, независимо от разрешений уровня Linux. (Разрешения, вероятно, более ограничивающие, чем на практике, но исходная модель безопасности WSL не должна быть слишком сложной.)

Попытка объединить инструкции от github:

  • Сгенерируйте ключи хоста SSH, запустив sudo dpkg-reconfigure openssh-server в оболочке bash.
  • Запустите sudo nano /etc/ssh/sshd_config ; отредактируйте UsePrivilegeSeparation yes чтобы прочитать UsePrivilegeSeparation no . (Это необходимо, потому что UsePrivilegeSeparation использует системный вызов chroot() , который в настоящее время не поддерживается WSL.)
  • Продолжая редактировать /etc/ssh/sshd_config , вы можете изменить PasswordAuthentication no на PasswordAuthentication yes . В противном случае вам придется настроить ключи SSH.
  • Сохраните /etc/ssh/sshd_config и выйдите.
  • Запустите sudo visudo для редактирования файла sudoers. Добавьте строку

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

    заменив $ USER на ваше имя пользователя в Linux. Сохранить и выйти. Если visudo жалуется, что ваши изменения недействительны, исправляйте их до тех пор, пока они не сообщат, что они действительны; в противном случае вы можете сломать sudo в вашей системе!

  • На стороне Windows отредактируйте брандмауэр Windows (и любые сторонние брандмауэры, которые вы можете использовать), чтобы разрешить входящий трафик через порт 22. Поскольку это не супер-безопасная установка, я рекомендую разрешать входящий трафик только из домашней (частной) и доменной сетей, а не из общедоступного Интернета.
  • Создайте текстовый файл autostartssh.vbs в Windows, содержащий следующее:

    set ws=wscript.createobject("wscript.shell")
    ws.run "C:\Windows\System32\bash.exe -c 'sudo /usr/sbin/sshd -D'",0
    
    • Дважды щелкните по сценарию. Должен запуститься sshd; Вы должны быть в состоянии SSH на вашем компьютере Windows.
    • Откройте планировщик задач Windows. Добавьте задачу, которая запускает autostartssh.vbs при загрузке системы. Используйте wscript.exe в качестве команды для запуска и расположение сценария VBS в качестве параметра.

И все - ваш компьютер под управлением Windows должен работать на сервере Linux openssh!

3

Мне нужно было сделать то же самое.

Вот как можно загрузить подсистему Ubuntu Linux со всеми службами cron при загрузке Windows и предоставить средства для «перезагрузки» подсистемы Linux.

Я успешно размещаю на нашем сервере базу данных openssh-server, nginx & mariadb.

Установить подсистему Linux

  • Откройте Powershell от имени администратора
  • Вставить:

    Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux
    
  • Установите Ubuntu из Магазина Windows.

Удалить запрос пароля sudo (обязательно)

  • Open bash (подсистема Linux устанавливает это)
  • Вставить:

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

Включить вход по паролю SSH (необязательно)

  • Открыть баш
  • Вставить:

    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
    

Автозапуск Windows при запуске (требуется, если у вас есть пароль или RDP)

  • Открыть netplwiz
  • Снять отметку 'Пользователи должны ввести имя пользователя и пароль ...'
  • Откройте regedit от имени администратора
  • Перейти к

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon
    
  • Создайте новую строку DefaultPassword и введите пароль пользователя в качестве значения.

Запустите цикл bash/cron при запуске

  • Создайте файл с именем linux.bat в shell:startup
  • Вставить:

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

Добавить приложения / сервисы для запуска на cron

  • Открыть баш
  • sudo crontab -e
  • Выберите nano (или любой редактор, который вы знаете, как сохранить)
  • Добавьте загрузочные приложения, такие как 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
    
  • Сохранить и выйти: Ctrl x, затем нажмите y и введите.

Перезагрузите подсистему Linux без перезагрузки Windows

  • Открыть Bash или SSH в

    sudo service ssh restart
    
  • Это закроет текущий экземпляр и создаст новый, применяя cron.

Extra - Установить PHP 7.1 (не совсем так просто)

  • Запустите команды ниже для довольно стандартной установки:

    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
    
  • Запустите команду ниже для установки «OwnCloud»:

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

Extra - Установите веб-сервер nginx

  • Запустите команды ниже для базовой установки с 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 - установить базу данных mysql от mariadb

  • Выполните команды ниже для сервера базы данных 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
    
  • При появлении запроса установите пароль пользователя корневой базы данных.

1

Ответ @poma очень хороший, и на этом основан мой ответ. Я хочу добавить к этому некоторые улучшения:

  • Используйте service вместо прямого вызова sshd : 'sudo service ssh start' вместо 'sudo /usr/sbin/sshd -D' . Таким образом, даже если вы вызовете скрипт несколько раз, будет только один процесс sshd . Кроме того, его легко убить с помощью другого скрипта, который запускает 'sudo service ssh stop' . В файле sudoers вам просто нужно заменить /usr/sbin/sshd -D на /usr/sbin/service .
  • Если вы настроены на вызове sshd напрямую, избавиться от опции -D потому что поставит процесс на переднем плане на неопределенный срок. Если вы мне не верите, просто сделайте top и вы будете видеть процесс init и sudo каждый раз, когда вызываете скрипт. Не забудьте также удалить опцию -D в файле sudoers!
  • Используйте PowerShell вместо VBS! Создайте файл с именем autostartsshd.ps1 и вставьте следующее: bash -c 'sudo service ssh start' . Чтобы выполнить сценарий, щелкните его правой кнопкой мыши и выберите « Run with PowerShell .

Другой вопрос переполнения стека имеет похожие шаги: https://superuser.com/a/1114162/182590

Надеюсь, что это помогает кому-то :)

0

поместите bash -c "echo [password] | service ssh start" в скрипт запуска Windows и используйте свой собственный пароль sudo для замены [пароля]

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .