Windows 上で Ubuntu サービスを実行するにはどうすればいいですか (起動時に)?

Windows 上で Ubuntu サービスを実行するにはどうすればいいですか (起動時に)?

Windows の起動時に Linux サブシステム (Windows 上の Ubuntu 上の Bash) で SSH サーバーを起動したいと考えています。問題は、Bash ウィンドウを閉じるとすべての Linux プロセスが終了することです。

bash ウィンドウなしで Linux プロセスをバックグラウンドで永続的に実行する方法はありますか?

答え1

aseering によるチュートリアルを見つけました:

これはもともと、github ユーザーの imjakey、fpqc、qris、therealkenc、Manouchehri、aseering (私) によってここで議論され、整理されました。

https://github.com/Microsoft/BashOnWindows/issues/612

sshd を実行するとセキュリティに影響があることに注意してください。WSL のセキュリティ モデルが完成するまでは、Linux レベルの権限に関係なく、Windows ボックスに ssh できるユーザーは誰でも、sshd を実行している Windows ユーザーとして任意のコマンドを実行する権限を持っていると想定する必要があります。(実際には権限はおそらくそれよりも制限が厳しいですが、WSL の初期のセキュリティ モデルはそれほど高度なものではありません。)

github からの指示を集約しようとしています:

  • sudo dpkg-reconfigure openssh-serverbashシェルで実行してSSHホストキーを生成する
  • を実行します。行を に sudo nano /etc/ssh/sshd_config編集します。(これは、WSL が現在サポートしていない syscall を使用するために必要です 。)UsePrivilegeSeparation yesUsePrivilegeSeparation noUsePrivilegeSeparationchroot()
  • を編集中に 、に/etc/ssh/sshd_config変更することもできます 。それ以外の場合は、SSH キーを設定する必要があります。PasswordAuthentication noPasswordAuthentication yes
  • 保存 /etc/ssh/sshd_configして終了。
  • 実行してsudo visudosudoersファイルを編集します。次の行を追加します。

    $USER ALL = (root) NOPASSWD: /usr/sbin/sshd -D
    

    「$USER」を Linux ユーザー名に置き換えます。保存して終了します。visudo が変更が無効であると報告した場合は、変更が有効であると報告されるまで修正してください。そうしないと、システムで sudo が壊れる可能性があります。

  • Windows 側では、Windows ファイアウォール (および実行している可能性のあるサードパーティのファイアウォール) を編集して、ポート 22 の着信トラフィックを許可します。これは非常に安全な設定ではないため、パブリック インターネットからの着信トラフィックではなく、ホーム (プライベート) ネットワークとドメイン ネットワークからの着信トラフィックのみを許可することをお勧めします。
  • autostartssh.vbsWindows で次の内容を含むテキスト ファイルを作成します 。

    set ws=wscript.createobject("wscript.shell")
    ws.run "C:\Windows\System32\bash.exe -c 'sudo /usr/sbin/sshd -D'",0
    
    • スクリプトをダブルクリックします。sshd が起動し、Windows マシンに ssh で接続できるようになります。
    • autostartssh.vbsWindows のタスク スケジューラを開きます。システムの起動時に実行されるタスクを追加します。wscript.exe実行するコマンドとして を使用し、VBS スクリプトの場所をパラメーターとして使用します。

これで完了です。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.batWindowsのスタートアップフォルダにファイルを追加する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というファイルを作成します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

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 ウェブサーバーをインストールする

  • 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 さんの回答は非常に優れており、私の回答もそれに基づいています。ただし、いくつか改善点を追加したいと思います。

  • 使用servicesshd直接呼び出す代わりに、'sudo service ssh start'の代わりに を使用します'sudo /usr/sbin/sshd -D'。こうすることで、スクリプトを複数回呼び出しても、プロセスは最大でも 1 つだけになりますsshd。また、 を実行する別のスクリプトを使用して簡単に終了できます'sudo service ssh stop'。sudoers ファイルでは、/usr/sbin/sshd -Dを に置き換えるだけです/usr/sbin/service
  • もし、あんたが直接電話をかけることにしたsshd-Dオプションを削除するなぜなら、これによりプロセスが無期限にフォアグラウンドに置かれるからです。信じられないなら、そうしてください。そうすれば、スクリプトを呼び出すたびに とプロセスtopが表示されます。sudoersファイルでもオプションを削除することを忘れないでください。initsudo-D
  • 使用パワーシェルvbs の代わりに というファイルを作成しautostartsshd.ps1、以下を貼り付けますbash -c 'sudo service ssh start'。スクリプトを実行するには、それを右クリックして をクリックしますRun with PowerShell

別の Stack Overflow の質問にも同様の手順があります:https://superuser.com/a/1114162/182590

誰かの役に立てば幸いです :)

関連情報