问题描述
我想在Windows启动时在Linux子系统(Windows上的Ubuntu上的Bash)上启动SSH服务器。问题是当关闭Bash窗口时,所有Linux进程都会终止。
有没有一种方法可以使Linux进程在没有bash窗口的情况下在后台永久运行?
最佳方法
通过咨询找到了一个有关此的教程:
最初由github用户imjakey,fpqc,qris,therealkenc,Manouchehri和aseering(myself)在这里讨论并整理:
https://github.com/Microsoft/BashOnWindows/issues/612
请注意,运行sshd具有安全隐患。在WSL的安全模型需要更长时间之前,您应该假定可以ssh进入Windows框的任何人都具有以运行sshd的Windows用户身份执行任何命令的权限,而不管Linux-level权限如何。 (权限可能比实践中的限制更严格,但是WSL的初始安全模型并不是很复杂。)
尝试汇总来自github的指令:
-
通过在bash shell中运行
sudo dpkg-reconfigure
生成SSH主机密钥
openssh-server -
运行
sudo nano /etc/ssh/sshd_config
;编辑UsePrivilegeSeparation yes
行以读取UsePrivilegeSeparation no
。 (这是必需的,因为UsePrivilegeSeparation
使用WSL当前不支持的chroot()
系统调用。) -
仍在编辑
/etc/ssh/sshd_config
时,您可以选择将PasswordAuthentication no
更改为PasswordAuthentication yes
。否则,您将必须设置SSH密钥。 -
保存
/etc/ssh/sshd_config
并退出。 -
运行
sudo visudo
以编辑sudoers文件。添加行$USER ALL = (root) NOPASSWD: /usr/sbin/sshd -D
用您的Linux用户名替换”$USER”。保存并退出。如果visudo抱怨您的更改无效,请对其进行修复,直到其报告有效为止;否则,请执行以下操作。否则,您可以在系统上破坏sudo!
-
在Windows上,编辑Windows防火墙(以及您可能正在运行的任何第三方防火墙)以允许端口22上的传入通信。由于这不是super-secure设置,因此我建议仅允许来自家庭(私有)的传入通信。和域网络,而不是来自公共Internet。
-
在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服务器!
次佳方法
-
创建一个名为
wsl_setup.bat
的文件,并添加如下内容wsl -u root -e sudo service ssh start wsl -u root -e sudo service nginx start
-
将
wsl_setup.bat
文件添加到Windows启动文件夹windows-10-change-startup-apps -
重新启动并登录您的Windows帐户(是的,您需要登录)
第三种方法
我需要做同样的事情。
以下是在Windows启动和启动时使用cron的所有服务启动Ubuntu Linux子系统的方法。为Linux子系统’reboot’提供一种方法。
我已经成功托管了openssh-server,nginx&我们服务器上的mariadb数据库。
安装Linux子系统
-
以管理员身份打开Powershell
-
糊:
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux
-
从Windows Store安装Ubuntu。
删除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
并将用户密码写为value。
在启动时运行bash /cron循环
-
在
shell:startup
中创建一个名为linux.bat
的文件 -
糊:
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
和enter
。
在不重新启动Windows的情况下重新启动Linux子系统
-
在以下位置打开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 Web服务器
-
运行以下命令以使用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
额外-安装mariadb的mysql数据库
-
对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
-
出现提示时,设置根数据库用户密码。