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-server
bashシェルで実行してSSHホストキーを生成する- を実行します。行を に
sudo nano /etc/ssh/sshd_config
編集します。(これは、WSL が現在サポートしていない syscall を使用するために必要です 。)UsePrivilegeSeparation yes
UsePrivilegeSeparation no
UsePrivilegeSeparation
chroot()
- を編集中に 、に
/etc/ssh/sshd_config
変更することもできます 。それ以外の場合は、SSH キーを設定する必要があります。PasswordAuthentication no
PasswordAuthentication yes
- 保存
/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 で接続できるようになります。
autostartssh.vbs
Windows のタスク スケジューラを開きます。システムの起動時に実行されるタスクを追加します。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
というファイルを作成します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 さんの回答は非常に優れており、私の回答もそれに基づいています。ただし、いくつか改善点を追加したいと思います。
- 使用
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
。 - もし、あんたがは直接電話をかけることにした
sshd
、-D
オプションを削除するなぜなら、これによりプロセスが無期限にフォアグラウンドに置かれるからです。信じられないなら、そうしてください。そうすれば、スクリプトを呼び出すたびに とプロセスtop
が表示されます。sudoersファイルでもオプションを削除することを忘れないでください。init
sudo
-D
- 使用パワーシェルvbs の代わりに というファイルを作成し
autostartsshd.ps1
、以下を貼り付けますbash -c 'sudo service ssh start'
。スクリプトを実行するには、それを右クリックして をクリックしますRun with PowerShell
。
別の Stack Overflow の質問にも同様の手順があります:https://superuser.com/a/1114162/182590
誰かの役に立てば幸いです :)