我想在 Windows 启动时启动 Linux 子系统(Windows 上的 Ubuntu 上的 Bash)上的 SSH 服务器。问题是关闭 Bash 窗口时所有 Linux 进程都会终止。
有没有办法让 Linux 进程在没有 Bash 窗口的情况下在后台永久运行?
答案1
通过 aseering 找到了相关教程:
这最初由 github 用户 imjakey、fpqc、qris、therealkenc、Manouchehri 和 aseering(我自己)在这里讨论并整理:
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
将“$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 服务器!
答案2
创建一个名为的文件
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-更改启动应用程序重启并登录你的windows账户(是的,你需要登录)
答案3
我需要做同样的事情。
以下是如何在 Windows 启动时使用所有 cron 服务启动 Ubuntu Linux 子系统并提供“重新启动”Linux 子系统的方法。
我已成功在我们的服务器上托管 openssh-server、nginx 和 mariadb 数据库。
安装Linux子系统
- 以管理员身份打开 Powershell
粘贴:
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux
从 Windows 商店安装 Ubuntu。
删除 sudo 密码提示(必需)
- 打开 bash(Linux 子系统安装它)
粘贴:
sudo sed -i "s/%sudo.*/%sudo ALL=(ALL:ALL) NOPASSWD:ALL/g" /etc/sudoers
启用 SSH 密码登录(可选)
- 打开 bash
粘贴:
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 上启动
- 打开 bash
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
在
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
额外-安装 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
出现提示时,设置根数据库用户密码。
答案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
和一个进程。不要忘记在 sudoers 文件中sudo
删除该选项!-D
- 使用电源外壳而不是 vbs!创建一个名为的文件
autostartsshd.ps1
并粘贴以下内容:bash -c 'sudo service ssh start'
。要执行脚本,请右键单击它并单击Run with PowerShell
。
另一个堆栈溢出问题有类似的步骤:https://superuser.com/a/1114162/182590
希望这对某人有帮助:)