私は、Windows起動時にLinuxサブシステム(Windows上のUbuntu上のBash)上にSSHサーバーを立ち上げたいのです。問題は、Bashウィンドウを閉じると、すべてのLinuxプロセスが終了することです。
BashウィンドウなしでLinuxプロセスをバックグラウンドで永続的に実行させる方法はありますか?
Aseeringによってそのためのチュートリアルを見つけました:
これはもともと、githubユーザーのimjakey、fpqc、qris、therealkenc、Manouchehri、およびaseering(私自身)によって議論され、整理されました。
https://github.com/Microsoft/BashOnWindows/issues/612
Sshdを実行するとセキュリティに影響することに注意してください。 WSLのセキュリティモデルの有効期限が切れるまでは、Linuxレベルの権限に関係なく、Windowsユーザーがsshdを実行しているユーザーとして任意のコマンドを実行できる権限を持っていると想定してください。 (パーミッションは実際よりもおそらく制限的ですが、WSLの初期のセキュリティモデルはそれほど洗練されたものではありません。)
Githubからの指示を集約しようとしています:
Sudo dpkg-reconfigure openssh-server
を実行してSSHホストキーを生成するSudo nano /etc/ssh/sshd_config
を実行してください。 UsePrivilegeSeparation yes
行を編集してUsePrivilegeSeparation no
を読み取ります。 (これは、WSLが現在サポートしていないUsePrivilegeSeparation
がchroot()
syscallを使用するために必要です。)/etc/ssh/sshd_config
を編集中に、PasswordAuthentication no
をPasswordAuthentication yes
に変更することを選択できます。そうでなければ、SSHキーを設定する必要があります。/etc/ssh/sshd_config
を保存して終了します。Sudoersファイルを編集するためにSudo visudo
を実行します。行を追加
$USER ALL = (root) NOPASSWD: /usr/sbin/sshd -D
"$ USER"をあなたのLinuxユーザー名に置き換えます。保存して終了。 visudoがあなたの変更が無効であると文句を言ってきたら、それが有効であると報告するまでそれらを修正してください。そうでなければあなたのシステムでSudoを壊すことができます!
以下を含むテキストファイルautostartssh.vbs
をWindowsで作成します。
set ws=wscript.createobject("wscript.Shell")
ws.run "C:\Windows\System32\bash.exe -c 'Sudo /usr/sbin/sshd -D'",0
autostartssh.vbs
を実行するタスクを追加してください。実行するコマンドとしてwscript.exe
を使用し、パラメータとしてVBSスクリプトの場所を使用します。そしてそれだけです - あなたのWindowsコンピュータはLinux opensshサーバを実行しているべきです!
私は同じことをする必要がありました。
Windows起動時にcronのすべてのサービスでUbuntu Linuxサブシステムを起動し、Linuxサブシステムを「再起動」する手段を提供する方法は次のとおりです。
私たちのサーバーでopenssh-server、nginx&mariadbデータベースをうまくホスティングしている。
Linuxサブシステムのインストール
ペースト:
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux
WindowsストアからUbuntuをインストールします。
Sudoパスワードプロンプトを削除する(必須)
ペースト:
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がある場合は必須)
閲覧する
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
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データベースのユーザーパスワードを設定します。
windowsの起動スクリプトにbash -c "echo [password] | service ssh start"
を入力し、[password]の代わりに自分のSudoパスワードを使用
@ 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
オプションも削除することを忘れないでください。autostartsshd.ps1
という名前のファイルを作成し、次のように貼り付けます:bash -c 'Sudo service ssh start'
。スクリプトを実行するには、スクリプトを右クリックしてRun with PowerShell
をクリックします。別のスタックオーバーフローの質問にも同様の手順があります。 https://superuser.com/a/1114162/182590
誰かに役立つことを願っています:)
@Pomaと@Hintronの回答は素晴らしいです。
いくつかのオプションを切り替える必要があるので、Windowsタスクスケジューラにsshタスクを追加する方法の最後のポイントの説明を拡張したいと思います。
これは直接bash呼び出しに使用されます。それをvbsやpowershellスクリプトでラップする必要はありません。
@Hintronが説明した理由でserviceコマンドを使用します。さらにsshdを直接呼び出すとエラーが発生する
特権分離ディレクトリがありません:/ var/run/sshd
そのような場合はSudo visudo
コマンドでこのエントリを追加するべきです
ALL ALL = (root) NOPASSWD: /usr/sbin/service ssh *
また、すべてのユーザー(最初の列)がsshdを起動または停止できることにも注意してください。あなたがこのWindowsマシンのただ一人のユーザーであるならば、それはそれで良いはずです。