如何在 Windows 上執行 Ubuntu 服務(啟動時)?

如何在 Windows 上執行 Ubuntu 服務(啟動時)?

我想在 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 noPasswordAuthentication 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.exeVBS 腳本位置作為參數。

就是這樣——您的 Windows 電腦應該運行 Linux openssh 伺服器!

答案2

  1. 建立一個名為的檔案wsl_setup.bat並新增內容如下

    wsl -u root -e sudo service ssh start
    wsl -u root -e sudo service nginx start
    
  2. wsl_setup.bat檔案新增至 Windows 啟動資料夾windows-10-更改-啟動-應用程式

  3. 重新啟動並登入您的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,然後按yenter

重新啟動 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不要忘記刪除-Dsudoers 文件中的選項!
  • 使用電源外殼而不是vb!建立一個名為的檔案autostartsshd.ps1並貼上以下內容:bash -c 'sudo service ssh start'。若要執行該腳本,請以滑鼠右鍵按一下該腳本,然後按一下Run with PowerShell

另一個堆疊溢位問題也有類似的步驟:https://superuser.com/a/1114162/182590

希望對某人有幫助:)

相關內容