Ubuntu hizmetini Windows'ta (başlangıçta) nasıl çalıştırırım?


22

Windows başlangıcında Linux alt sisteminde (Windows'ta Ubuntu'da Bash) bir SSH sunucusu başlatmak istiyorum. Sorun, Bash penceresi kapatıldığında tüm Linux işlemlerinin sonlandırılmasıdır.

Linux işleminin bash penceresi olmadan arka planda kalıcı olarak çalışmasını sağlamanın bir yolu var mı?

Yanıtlar:


26

Aseering ile bunun için bir eğitim buldu:

Bu aslında github kullanıcıları imjakey, fpqc, qris, therealkenc, Manouchehri ve aseering (kendim) tarafından tartışıldı ve burada sıralandı:

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

Sshd çalıştırmanın güvenlik sonuçları olduğuna dikkat edin. WSL'nin güvenlik modeli daha uzun süre pişirilinceye kadar, Windows kutunuza ssh yapabilen herkesin Linux düzeyinde izinlere bakılmaksızın sshd çalıştıran Windows kullanıcısı olarak herhangi bir komut gerçekleştirme iznine sahip olduğunu varsaymalısınız. (İzinler muhtemelen uygulamadakinden daha kısıtlayıcıdır, ancak WSL'nin ilk güvenlik modelinin çok karmaşık olması amaçlanmamıştır.)

Talimatları github'dan toplama girişimi:

  • sudo dpkg-reconfigure openssh-serverBir bash kabuğunda çalışarak SSH ana bilgisayar anahtarları oluşturma
  • Çalıştır sudo nano /etc/ssh/sshd_config; UsePrivilegeSeparation yesokunacak satırı düzenleyin UsePrivilegeSeparation no. ( WSL'nin şu anda desteklemediği sistem çağrısı UsePrivilegeSeparationkullanıldığı için bu gereklidir chroot().)
  • Hala düzenlerken /etc/ssh/sshd_config, değiştirmek seçebilir PasswordAuthentication noiçin PasswordAuthentication yes. Aksi takdirde SSH anahtarlarını ayarlamanız gerekir.
  • Kaydet /etc/ssh/sshd_configve çık.
  • sudo visudoSudoers dosyasını düzenlemek için çalıştırın . Satırı ekleyin

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

    "$ USER" yerine Linux kullanıcı adınızı yazın. Kaydet ve çık. Visudo, değişikliklerinizin geçersiz olduğundan şikayet ederse, geçerli olduklarını bildirene kadar bunları düzeltin; aksi takdirde sudo'yu sisteminizde bozabilirsiniz!

  • Windows tarafında, Windows güvenlik duvarını (ve çalıştırdığınız herhangi bir üçüncü taraf güvenlik duvarını) 22 numaralı bağlantı noktasından gelen trafiğe izin verecek şekilde düzenleyin. Bu, süper güvenli bir kurulum olmadığından, yalnızca evden gelen trafiğe izin vermenizi öneririm ( özel) ve alan adı ağlarını (herkese açık İnternet'ten değil).
  • autostartssh.vbsWindows'ta aşağıdakileri içeren bir metin dosyası oluşturun :

    set ws=wscript.createobject("wscript.shell")
    ws.run "C:\Windows\System32\bash.exe -c 'sudo /usr/sbin/sshd -D'",0
    
    • Komut dosyasına çift tıklayın. Sshd başlamalıdır; Windows makinenize ssh edebilmeniz gerekir.
    • Windows'un Görev Zamanlayıcı'yı açın. autostartssh.vbsSistem önyüklemesinde çalışan bir görev ekleyin . wscript.exeÇalıştırılacak komut olarak ve parametre olarak VBS komut dosyası konumunu kullanın .

Ve işte bu - Windows bilgisayarınızda bir Linux openssh sunucusu çalışıyor olmalı!


VBS betiği benim için hiçbir şey yapmadı. sshd kaynak izleyicisi Ağ sekmesinde görünmüyor.
megamaiku

Ben bir pencereyi olmadan bash yumurtlamaya izin verecek bir süreç dağıtıcı github.com/131/dispatcher yazdı .
131

@megamaiku: Aynı sorunu yaşadım. Ben "visudo" kısmı doğru yapmadım çünkü sshd (görünmez) şifre isteminde takılıp çalıştırmak için küçük snipped çıkıyor. İlk önce NOPASSWD satırını sudoers dosyasının ortasında bir yere ekledim. Ben aşağıya taşındı bir kez çalıştı!
ltjax

1
Şu anda birlikte çalışmaktadır UsePrivilegeSeparation = yes, ancak sudo /bin/mkdir -p /var/run/sshdsshd'ye başlamadan önce (ayrıcalık ayırma dizinlerini oluşturmak için) de çalıştırılması gerekir . WLS artık chroot () özelliğini destekliyor mu, opensh kaynağında bir geçici çözüm var mı veya = Noayar daha fazla güvenlik önerisi mi? Ayrıca, windows görevi sadece benim kullanıcı oturum
açtıysanız

Bu mükemmel çalıştı. Bir şeyi kolaylaştırmak için SSH'nin dinlediği bağlantı noktasını hareket ettirmenizi öneririm, örneğin 3322, rastgele bir şey. İçinde satırı yorum /etc/ssh/sshd_configokur Port 22anahtarı ve Port 8822. Bunun bir nedeni, Windows 22'de bir çeşit SSH işlemi çalıştırmaktır. Bunu devre dışı bırakmada bir sorun olmadığını söyleyen öneriler gördüm, ancak WSL SSH bağlantı noktasını değiştirmenin en kolay yolunu buldum.
knickum

4

Aynı şeyi yapmam gerekiyordu.

Windows önyüklemesinde Ubuntu Linux alt sistemini tüm cron hizmetleriyle nasıl önyükleyeceğinizi ve Linux alt sistemini 'yeniden başlatmak' için bir yol sağlayacağınızı buradan öğrenebilirsiniz.

Sunucumuzda openssh-server, nginx & mariadb veritabanını başarıyla barındırıyorum.

Linux Alt Sistemini Kurun

  • Powershell'i Yönetici Olarak Aç
  • Yapıştırmak:

    Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux
    
  • Ubuntu'yu Windows Mağazası'ndan yükleyin.

Sudo parola istemini kaldır (gerekli)

  • Open bash (Linux Alt Sistemi bunu yükler)
  • Yapıştırmak:

    sudo sed -i "s/%sudo.*/%sudo ALL=(ALL:ALL) NOPASSWD:ALL/g" /etc/sudoers
    

SSH şifre girişini etkinleştir (isteğe bağlı)

  • Açık bash
  • Yapıştırmak:

    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
    

Başlangıçta Windows otomatik oturum açma (parolanız veya RDP'niz varsa gereklidir)

  • Netplwiz'i aç
  • 'Kullanıcılar bir kullanıcı adı ve şifre girmelidir ...' seçeneğinin işaretini kaldırın
  • Regedit'i Yönetici olarak aç
  • Şuraya göz at:

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon
    
  • Yeni bir dize oluşturun DefaultPasswordve kullanıcının şifresini değer olarak yazın.

Başlangıçta bash / cron döngüsünü çalıştır

  • Adlı bir dosya oluşturun linux.batiçindeshell:startup
  • Yapıştırmak:

    C:\Windows\System32\bash.exe -c 'while [ true ]; do sudo /usr/sbin/cron -f; done'
    

Cron'da başlatmak için uygulamalar / hizmetler ekleyin

  • Açık bash
  • sudo crontab -e
  • Nano'yu (veya nasıl kaydedileceğini bildiğiniz herhangi bir düzenleyiciyi) seçin
  • Openssh-server, nginx, mysql, php gibi başlangıç ​​uygulamalarını ekleyin:

    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
    
  • Kaydet ve çık:, ctrlxsonra yve tuşlarına basın enter.

Windows'u yeniden başlatmadan Linux alt sistemini yeniden başlatın

  • İçinde bash veya SSH açın

    sudo service ssh restart
    
  • Bu, geçerli örneği kapatır ve cron uygulayan yeni bir örnek oluşturur.

Ekstra - PHP 7.1'i yükleyin (çok basit değil)

  • Oldukça standart bir kurulum için aşağıdaki komutları çalıştırın:

    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
    
  • Bir 'OwnCloud' kurulumu için aşağıdaki komutu çalıştırın:

    PHPV=7.1 && apt install --allow-unauthenticated -y php${PHPV}-redis redis-server php${PHPV}-ldap php${PHPV}-smbclient
    

Ekstra - nginx web sunucusunu kurun

  • PHP7.1 ile temel kurulum için aşağıdaki komutları çalıştırın:

    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
    

Ekstra - mariadb'nin mysql veritabanını yükleyin

  • Bir mysql veritabanı sunucusu için aşağıdaki komutları çalıştırın:

    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
    
  • İstendiğinde, bir kök veritabanı kullanıcı parolası belirleyin.


Bu çok akıllı! ve kesin talimatlar, teşekkürler. "Sudo" şifresini tamamen atlamaktan kaçınmanın bir yolu var mı?
greg

Artık Linux alt sisteminin kullanılmasını önermiyorum. Uygulama uyumluluğu berbat, kararsız ve araçlar mümkün olduğunca iyi çalışmıyor - bash entegrasyonu, vb. Bunun yerine msys2 kullanın, size harika bir bash kabuğu sağlar ve onunla çok sayıda uygulama yüklemenize izin verir. pacman paket yöneticisi - Hepsinden iyisi, tüm uygulamalar .exe's. Yapmanız gereken tek şey, bin dizinlerini Windows'taki ortam değişkenlerinize eklemek. Windows'ta linux komutlarını kullanıyorum ve tam tersi. Tüm Windows betiklerim bash içinde yapılır.
Nom

1

@poma 'nın cevabı çok iyi ve cevabımın dayandığı şey bu. Yine de bazı iyileştirmeler eklemek istiyorum:

  • Doğrudan servicearamak yerine kullanın sshd: 'sudo service ssh start'yerine 'sudo /usr/sbin/sshd -D'. Bu şekilde, komut dosyasını birden çok kez çağırsanız bile, yalnızca en fazla bir sshdişlem olacaktır. Ayrıca, çalışan başka bir komut dosyası ile öldürmek kolaydır 'sudo service ssh stop'. Sudoers dosyasında, sadece değiştirmeniz gerekiyor /usr/sbin/sshd -Dile/usr/sbin/service .
  • Eğer varsa vardır çağırarak ayarlanır sshddoğrudan kurtulmak -Dseçeneği olduğunu süresiz ön planda bir süreç koyacağız çünkü. Bana inanmıyorsanız, sadece yapın topve senaryoyu her aradığınızda bir initve bir sudoişlem göreceksiniz . Kaldırmayı unutmayın-DSudoers dosyasındaki seçeneği de !
  • Kullanım PowerShell yerine vbs ait! Adlı bir dosya oluşturun autostartsshd.ps1ve aşağıda yapıştırın: bash -c 'sudo service ssh start'. Komut dosyasını yürütmek için sağ tıklayın ve tıklayın Run with PowerShell.

Başka bir yığın taşması sorusu benzer adımlara sahiptir: /superuser//a/1114162/182590

Umarım birine yardım eder :)


Bunun işe yarayacağından emin misin? Sshd'nin ön planda çalıştırılması bash oturumunu açık tutmak için kasıtlıydı (çoklu örneklerle ilgili herhangi bir sorun olmayacak, çünkü kopyalar başlatılamayacak). Sadece koşup sudo service ssh startbash'ı kapatırsanız ssh daemon'u öldürür. En azından rehberimi yazarken böyle yaptı.
Poma

@Poma Windows 10'daki en son güncelleme ile Linux uygulamaları artık arka planda çalışabiliyor, bu yüzden bunun iyi çalışması gerektiğini düşünüyorum.
JacobTheDev

1

koymak bash -c "echo [password] | service ssh start"Windows'un başlatma komut ve [şifreyi] yerine kendi sudo şifrenizi kullanabilirsiniz


Bir şifreyi sudo komut istemine bağlayamazsınız (komutunuz sudocümlenizin ima ettiği anahtar kelimeyi bile içermez). Bu işe yaramıyor. Parolanızı zaten düz metin olarak saklamanız gerektiği için değil!
adam_0

1

@Poma ve @Hintron cevapları harika.

Bazı seçeneklerin değiştirilmesini gerektirdiği için Windows Görev Zamanlayıcı'da ssh görevinin nasıl ekleneceğini son noktanın açıklamasını genişletmek istiyorum:

  • "Görev Zamanlayıcı" yı çalıştırın. Sol taraftaki listeden "Görev Zamanlayıcı (Yerel)" öğesini seçin, ardından "İşlem" menüsüne ve "Görev Oluştur" a gidin.
  • Genel sekmesi:
    • İsim: "ssh"
    • "Kullanıcının oturum açmış olup olmadığını çalıştır" ı seçin
  • Tetikleyiciler sekmesi:
    • Yeni
      • Göreve başlayın: "Başlangıçta"
  • İşlemler sekmesi:
    • Yeni
      • Program / komut dosyası: C: ​​\ Windows \ System32 \ bash.exe
      • Bağımsız değişken ekle (isteğe bağlı): -c "sudo / usr / sbin / service ssh start"
  • Koşullar:
    • "Görevi yalnızca bilgisayar AC gücündeyse başlat" seçimini kaldırın
  • Ayarlar
    • "Görevi şundan daha uzun süre çalışıyorsa durdur" seçimini kaldırın

Doğrudan bash invokasyonu kullanılır. Vbs veya powershell komut dosyalarına sarmaya gerek yoktur.

@Hintron'un açıkladığı nedenlerle service komutunu kullanıyorum. Ayrıca doğrudan sshd çağırma hatası verir

Ayrıcalık ayırma dizini eksik: / var / run / sshd

Bu durumda, bu giriş sudo visudokomutla eklenmelidir

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

Ayrıca burada tüm kullanıcıların (ilk sütun) sshd'yi başlatabileceğini veya durdurabileceğini unutmayın. Bu Windows makinesinin yalnızca bir kullanıcısıysanız, o zaman iyi olmalı.


1
  1. Aşağıdaki gibi bir dosya oluşturun wsl_setup.batve içerik ekleyin

    wsl -u root -e sudo service ssh start
    wsl -u root -e sudo service nginx start
    
  2. wsl_setup.batWindows başlangıç ​​klasörüne dosya ekle windows-10-change-startup-apps

  3. Windows hesabınızı yeniden başlatın ve giriş yapın (evet, giriş yapmanız gerekir)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.