Answers:
通过寻求帮助找到了一个相关的教程:
最初由github用户imjakey,fpqc,qris,therealkenc,Manouchehri和aseering(myself)讨论并整理出来:
https://github.com/Microsoft/BashOnWindows/issues/612
请注意,运行sshd具有安全隐患。在WSL的安全模型需要花费更长的时间之前,您应该假定可以ssh进入Windows框的任何人都有权以运行sshd的Windows用户的身份执行任何命令,而不管Linux级别的权限如何。(权限可能比实际中的限制更严格,但是WSL的初始安全模型并不是很复杂。)
尝试汇总来自github的指令:
sudo dpkg-reconfigure
openssh-server
在bash shell中运行来生成SSH主机密钥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
用您的Linux用户名替换“ $ USER”。保存并退出。如果visudo抱怨您的更改无效,请对其进行修复,直到其报告有效为止;否则,请执行以下操作。否则,您可以在系统上破坏sudo!
autostartssh.vbs
在Windows中创建一个包含以下内容的文本文件
:
set ws=wscript.createobject("wscript.shell")
ws.run "C:\Windows\System32\bash.exe -c 'sudo /usr/sbin/sshd -D'",0
autostartssh.vbs
在系统启动时运行的任务。使用wscript.exe
作为运行命令和VBS脚本位置作为参数。就是这样-您的Windows计算机应该正在运行Linux openssh服务器!
UsePrivilegeSeparation = yes
,除了sudo /bin/mkdir -p /var/run/sshd
在启动sshd之前还需要运行(创建特权分离目录)。WLS现在是否支持chroot(),openssh源代码中是否存在替代方法,还是= No
设置了更多安全建议?此外,Windows任务,似乎只为了我的工作,如果我的用户已登录。
/etc/ssh/sshd_config
读入的行Port 22
并切换到Port 8822
。原因之一是Windows在22上运行某种SSH进程。我看到有建议说禁用它没有问题,但是我发现仅切换WSL SSH端口是最容易的。
我需要做同样的事情。
这是在Windows启动时使用cron的所有服务启动Ubuntu Linux子系统的方法,并提供了“重新启动” Linux子系统的方法。
我已经在我们的服务器上成功托管了openssh-server,nginx和mariadb数据库。
安装Linux子系统
糊:
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux
从Windows应用商店安装Ubuntu。
删除sudo密码提示(必填)
糊:
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,则必须输入)
浏览到
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon
创建一个新字符串DefaultPassword
,并将用户的密码写为value。
在启动时运行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
附加启动应用程序,例如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。
在不重新启动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
出现提示时,设置根数据库用户密码。
@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文件中的选项!autostartsshd.ps1
并粘贴以下内容:bash -c 'sudo service ssh start'
。要执行脚本,请右键单击它,然后单击Run with PowerShell
。另一个堆栈溢出问题具有类似的步骤:https : //superuser.com/a/1114162/182590
希望能帮助到某人:)
sudo service ssh start
然后关闭bash,它将杀死ssh守护程序。至少在编写指南时就是这样做的。
@Poma和@Hintron的答案很好。
我想扩展一下最后一点的描述,即如何在Windows Task Scheduler中添加ssh任务,因为它需要切换一些选项:
它用于直接bash调用。无需将其包装在vbs或powershell脚本中。
我使用服务命令的原因是@Hintron解释的。此外,直接sshd调用会产生错误
缺少特权分离目录:/ var / run / sshd
在这种情况下,应通过sudo visudo
命令将该条目添加
ALL ALL = (root) NOPASSWD: /usr/sbin/service ssh *
还要注意,这里所有用户(第一列)都可以启动或停止sshd。如果您只是该Windows计算机的一个用户,那应该没问题。
创建一个名为的文件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帐户(是的,您需要登录)