Я хочу запустить SSH-сервер на подсистеме Linux (Bash на Ubuntu на Windows) при запуске Windows. Проблема в том, что все процессы Linux завершаются при закрытии окна Bash.
Есть ли способ заставить процесс Linux постоянно работать в фоновом режиме без окна bash?
решение1
Нашел руководство по этому вопросу от пользователя aseering:
Первоначально это обсуждалось и решалось пользователями 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. Поскольку это не очень безопасная настройка, я рекомендую разрешать входящий трафик только из домашних (частных) и доменных сетей, а не из публичного Интернета.
Создайте в Windows текстовый файл,
autostartssh.vbs
содержащий следующее: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!
решение2
Создайте файл с именем
wsl_setup.bat
и добавьте содержимое следующим образом:wsl -u root -e sudo service ssh start wsl -u root -e sudo service nginx start
Добавить
wsl_setup.bat
файл в папку автозагрузки Windowswindows-10-изменение-автозагрузки-приложенийПерезагрузите компьютер и войдите в свою учетную запись Windows (да, вам необходимо войти в систему)
решение3
Мне нужно было сделать то же самое.
Вот как загрузить подсистему Ubuntu Linux со всеми службами cron при загрузке Windows и предоставить средство для «перезагрузки» подсистемы Linux.
Я успешно размещаю на нашем сервере базы данных openssh-server, nginx и mariadb.
Установить подсистему Linux
- Откройте Powershell как администратор.
Вставить:
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux
Установите Ubuntu из Магазина Windows.
Удалить запрос пароля sudo (обязательно)
- Откройте bash (Linux Subsystem устанавливает его)
Вставить:
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
Сохранить и выйти: ctrlx, затем нажмите yи enter.
Перезагрузите подсистему Linux без перезагрузки Windows.
Откройте bash или SSH в
sudo service ssh restart
Это закроет текущий экземпляр и создаст новый, применяющий cron.
Дополнительно - Установка 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
Дополнительно - Установка веб-сервера 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
Дополнительно - Установка базы данных 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
При появлении соответствующего запроса установите пароль пользователя root базы данных.
решение4
Ответ @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
.
Еще один вопрос на Stack Overflow имеет похожие шаги:https://superuser.com/a/1114162/182590
Надеюсь, это кому-то поможет :)