我想在 Windows 啟動時在 Linux 子系統上啟動 SSH 伺服器(Windows 上的 Ubuntu 上的 Bash)。問題是當 Bash 視窗關閉時,所有 Linux 進程都會終止。
有沒有辦法讓Linux進程在沒有bash視窗的情況下永久在後台運行?
答案1
透過尋求找到了一個教學:
這最初是由 github 用戶 imjakey、fpqc、qris、realkenc、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
建立一個名為in 的文件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
打開 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
額外 - 安裝 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
和 一個過程。sudo
不要忘記刪除-D
sudoers 文件中的選項! - 使用電源外殼而不是vb!建立一個名為的檔案
autostartsshd.ps1
並貼上以下內容:bash -c 'sudo service ssh start'
。若要執行該腳本,請以滑鼠右鍵按一下該腳本,然後按一下Run with PowerShell
。
另一個堆疊溢位問題也有類似的步驟:https://superuser.com/a/1114162/182590
希望對某人有幫助:)