WindowsでUbuntuサービスを実行する方法(起動時)


22

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

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

回答:


26

そのためのチュートリアルを見つけました:

これはもともと、githubユーザーimjakey、fpqc、qris、therealkenc、Manouchehri、およびaseering(myself)によって議論され、整理されています。

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; UsePrivilegeSeparation yes行を編集して読み取ります UsePrivilegeSeparation no。(これは、WSLが現在サポートしていないsyscallをUsePrivilegeSeparation使用するために必要 chroot()です。)
  • 編集中に /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を開始する必要があります。Windowsマシンにsshできるはずです。
    • Windowsのタスクスケジューラを開きます。autostartssh.vbsシステムの起動時に実行されるタスクを追加します。wscript.exe実行するコマンドとして使用し、VBSスクリプトの場所をパラメーターとして使用します。

そしてそれだけです-あなたのWindowsコンピューターはLinux opensshサーバーを実行しているはずです!


VBSスクリプトは私には何もしませんでした。リソースモニターの[ネットワーク]タブにsshdが表示されません。
メガマイク

プロセスディスパッチャgithub.com/131/dispatcher作成しました。これにより、ウィンドウなしでbashを生成できます。
-131

@megamaiku:同じ問題がありました。「visudo」の部分を正しく実行しなかったため、sshdを実行するために少し切り取られたものが(見えない)パスワードプロンプトに引っかかったことがわかりました。最初に、sudoersファイルの途中のどこかにNOPASSWD行を追加しました。一番下に移動するとうまくいきました!
ltjax

1
sshdを起動する前に(特権分離ディレクトリを作成するために)UsePrivilegeSeparation = yes実行する必要があることを除いて、現在で動作しsudo /bin/mkdir -p /var/run/sshdています。WLSはchroot()をサポートするようになりましたか、opensshソースに回避策があり= Noますか、それともより安全な推奨事項を設定していますか?また、Windowsタスクは、ユーザーがログインしている場合にのみ機能するようです。
init_js

これは非常にうまくいきました。物事を簡単にするために、SSHがリッスンしているポート(たとえば3322)をランダムに移動することをお勧めします。の行/etc/ssh/sshd_configをコメントアウトしてPort 22、に切り替えPort 8822ます。これの1つの理由は、Windowsが22で何らかのSSHプロセスを実行していることです。
-knickum

4

同じことをする必要がありました。

Windowsの起動時にすべてのcronのサービスを使用してUbuntu Linuxサブシステムを起動し、Linuxサブシステムを「再起動」する方法を提供する方法を次に示します。

サーバーでopenssh-server、nginx、mariadbデータベースを正常にホストしています。

Linuxサブシステムをインストールする

  • 管理者としてPowershellを開きます
  • ペースト:

    Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux
    
  • WindowsストアからUbuntuをインストールします。

sudoパスワードプロンプトの削除(必須)

  • Open bash(Linuxサブシステムがインストールします)
  • ペースト:

    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を持っている場合に必要)

  • 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の起動にアプリ/サービスを追加します

  • オープンバッシュ
  • 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

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
    
  • プロンプトが表示されたら、ルートデータベースユーザーのパスワードを設定します。


それは非常に賢いです!正確な指示、ありがとう。「sudo」パスワードを完全にスキップしない方法はありますか?
グレッグ

もうLinuxサブシステムの使用はお勧めしません。アプリの互換性は悪く、不安定で、ツールはすべてうまく機能しません-bash統合など。代わりにmsys2を使用すると、優れたbashシェルが提供され、多くのアプリをpacmanパッケージマネージャー-何よりも、アプリはすべて.exeのものです。必要なのは、binディレクトリをWindowsの環境変数に追加することだけです。私は今、WindowsでLinuxコマンドを使用しています。私のWindowsスクリプトはすべてbashで行われます。
ノム

1

@pomaの答えは非常によく、私の答えの基になっています。ただし、いくつかの改善点を追加したいと思います。

  • 直接service呼び出す代わりに使用sshd:の'sudo service ssh start'代わりに'sudo /usr/sbin/sshd -D'。そうすれば、スクリプトを複数回呼び出しても、最大で1つのsshdプロセスしかありません。また、を実行する別のスクリプトを使用して簡単に削除できます'sudo service ssh stop'。sudoersファイルでは、単純に交換する必要がある/usr/sbin/sshd -D/usr/sbin/service
  • 直接呼び出すように設定されている場合は、オプションを削除します。これにより、プロセスが無期限にフォアグラウンドに配置されるためです。あなたが私を信じていないなら、ただしてください。そうすれば、スクリプトを呼び出すたびにプロセスとプロセスが表示されます。sudoersファイルのオプションも削除することを忘れないでください!sshd-Dtopinitsudo-D
  • vbsの代わりにPowerShellを使用してください!というファイルを作成autostartsshd.ps1し、次の場所に貼り付けますbash -c 'sudo service ssh start'。スクリプトを実行するには、スクリプトを右クリックしてをクリックしますRun with PowerShell

別のスタックオーバーフローの質問にも同様の手順があります:https : //superuser.com/a/1114162/182590

それが誰かを助けることを願っています:)


これは機能しますか?フォアグラウンドでのsshdの実行は、bashセッションを開いたままにすることを意図したものです(重複が開始できないため、複数のインスタンスで問題は発生しません)。実行sudo service ssh startしてからbashを閉じると、sshデーモンが終了します。少なくとも、それは私のガイドを書いた瞬間にやったことです。
ポマ

@Poma Windows 10の最新の更新により、Linuxアプリケーションがバックグラウンドで実行できるようになったため、これで問題なく動作するはずです。
JacobTheDev

1

入れてbash -c "echo [password] | service ssh start"Windowsのスタートアップスクリプトで、かつ代替に独自のsudoのパスワードを使用して[パスワード]


パスワードを単にsudoプロンプトにパイプすることはできません(コマンドにsudo文が示唆する必要なキーワードが含まれているわけではありません)。これは機能しません。とにかく平文でパスワードを保存する必要はありません!
adam_0

1

@Pomaと@Hintronの回答は素晴らしいです。

いくつかのオプションを切り替える必要があるため、Windowsタスクスケジューラでsshタスクを追加する方法の最後のポイントの説明を拡張したいと思います:

  • 「タスクスケジューラ」を実行します。左側のリストで[タスクスケジューラ(ローカル)]を選択し、[アクション]メニューから[タスクの作成]に移動します。
  • 一般タブ:
    • 名前:「ssh」
    • 「ユーザーがログオンしているかどうかに関係なく実行する」を選択します
  • [トリガー]タブ:
    • 新しい
      • タスクを開始:「起動時」
  • [アクション]タブ:
    • 新しい
      • プログラム/スクリプト:C:\ Windows \ System32 \ bash.exe
      • 引数の追加(オプション):-c "sudo / usr / sbin / service ssh start"
  • 条件:
    • 「コンピューターの電源がACの場合のみタスクを開始」の選択を解除します
  • 設定
    • 「タスクがより長く実行される場合、タスクを停止する」の選択を解除します

直接bash呼び出しに使用されます。vbsやpowershellスクリプトでラップする必要はありません。

@Hintronが説明した理由でサービスコマンドを使用します。さらに、sshdを直接呼び出すとエラーが発生します

特権分離ディレクトリがありません:/ var / run / sshd

そのような場合、sudo visudoコマンドでこのエントリを追加する必要があります

ALL ALL = (root) NOPASSWD: /usr/sbin/service ssh *

また、すべてのユーザー(最初の列)がsshdを開始または停止できることに注意してください。このWindowsマシンのユーザーが1人だけの場合は、問題ないはずです。


1
  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-change-startup-appsにファイルを追加する

  3. Windowsアカウントを再起動してログインします(はい、ログインする必要があります)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.