web-dev-qa-db-ja.com

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

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

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

18
Poma

Aseeringによってそのためのチュートリアルを見つけました:

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

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

Sshdを実行するとセキュリティに影響することに注意してください。 WSLのセキュリティモデルの有効期限が切れるまでは、Linuxレベルの権限に関係なく、Windowsユーザーがsshdを実行しているユーザーとして任意のコマンドを実行できる権限を持っていると想定してください。 (パーミッションは実際よりもおそらく制限的ですが、WSLの初期のセキュリティモデルはそれほど洗練されたものではありません。)

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

  • BashシェルでSudo dpkg-reconfigure openssh-serverを実行してSSHホストキーを生成する
  • Sudo nano /etc/ssh/sshd_configを実行してください。 UsePrivilegeSeparation yes行を編集してUsePrivilegeSeparation noを読み取ります。 (これは、WSLが現在サポートしていないUsePrivilegeSeparationchroot() syscallを使用するために必要です。)
  • まだ/etc/ssh/sshd_configを編集中に、PasswordAuthentication noPasswordAuthentication yesに変更することを選択できます。そうでなければ、SSHキーを設定する必要があります。
  • /etc/ssh/sshd_configを保存して終了します。
  • Sudoersファイルを編集するためにSudo visudoを実行します。行を追加

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

    "$ USER"をあなたのLinuxユーザー名に置き換えます。保存して終了。 visudoがあなたの変更が無効であると文句を言ってきたら、それが有効であると報告するまでそれらを修正してください。そうでなければあなたのシステムでSudoを壊すことができます!

  • Windows側では、ポート22で着信トラフィックを許可するようにWindowsファイアウォール(および実行している可能性のあるサードパーティ製のファイアウォール)を編集します。公衆インターネットからではなく、ドメインネットワーク。
  • 以下を含むテキストファイル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サーバを実行しているべきです!

24
Poma

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

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 Subsystemはこれをインストールします)
  • ペースト:

    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がある場合は必須)

  • Open netplwiz
  • [ユーザーはユーザー名とパスワードを入力する必要があります...]のチェックを外します。
  • 管理者としてregeditを開く
  • 閲覧する

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon
    
  • 新しい文字列DefaultPasswordを作成し、ユーザーのパスワードを値として書き込みます。

起動時にbash/cronループを実行する

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

3
Nom

windowsの起動スクリプトにbash -c "echo [password] | service ssh start"を入力し、[password]の代わりに自分のSudoパスワードを使用

1
Wei

@ pomaの答えはとても良いもので、私の答えはこれに基づいています。私はそれにいくつかの改善を加えたいと思います、しかし:

  • 直接serviceを呼び出す代わりにsshdを使用します。'Sudo service ssh start'の代わりに'Sudo /usr/sbin/sshd -D'。そのため、スクリプトを複数回呼び出しても、sshdプロセスは1つしか存在しません。また、'Sudo service ssh stop'を実行する別のスクリプトを使って簡単に削除することもできます。 sudoersファイルでは、/usr/sbin/sshd -D/usr/sbin/serviceに置き換えるだけです。
  • sshdを直接呼び出すときにに設定されている場合、-Dオプションを削除します。無期限に前景。私を信じていないのであれば、topを実行するだけで、スクリプトを呼び出すたびにinitプロセスとSudoプロセスが表示されます。 sudoersファイルの-Dオプションも削除することを忘れないでください。
  • Vbsの代わりにPowerShellを使用してください。 autostartsshd.ps1という名前のファイルを作成し、次のように貼り付けます:bash -c 'Sudo service ssh start'。スクリプトを実行するには、スクリプトを右クリックしてRun with PowerShellをクリックします。

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

誰かに役立つことを願っています:)

1
Hintron

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

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

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

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

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

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

そのような場合はSudo visudoコマンドでこのエントリを追加するべきです

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

また、すべてのユーザー(最初の列)がsshdを起動または停止できることにも注意してください。あなたがこのWindowsマシンのただ一人のユーザーであるならば、それはそれで良いはずです。

0
kwojtas