Bagaimana cara menjalankan layanan Ubuntu pada Windows (saat startup)?

22

Saya ingin meluncurkan server SSH pada subsistem Linux (Bash di Ubuntu pada Windows) saat startup windows. Masalahnya adalah bahwa semua proses Linux dihentikan ketika jendela Bash ditutup.

Apakah ada cara untuk membuat proses Linux berjalan secara permanen di latar belakang tanpa bash window?

Poma
sumber

Jawaban:

26

Menemukan tutorial untuk itu dengan menilai:

Ini pada awalnya dibahas dan disortir oleh pengguna github imjakey, fpqc, qris, therealkenc, Manouchehri, dan aseering (sendiri) di sini:

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

Perhatikan bahwa menjalankan sshd memiliki implikasi keamanan. Sampai model keamanan WSL memiliki waktu lebih lama untuk dipanggang, Anda harus mengasumsikan bahwa siapa pun yang dapat ssh ke dalam kotak Windows Anda memiliki izin untuk melakukan perintah apa pun sebagai pengguna Windows yang menjalankan sshd, terlepas dari izin tingkat Linux. (Izin mungkin lebih ketat daripada yang dalam prakteknya, tetapi model keamanan awal WSL tidak dimaksudkan untuk menjadi sangat canggih.)

Mencoba untuk mengagregasi instruksi dari github:

  • Hasilkan kunci host SSH dengan menjalankan sudo dpkg-reconfigure openssh-serverbash shell
  • Jalankan sudo nano /etc/ssh/sshd_config; edit UsePrivilegeSeparation yesbaris untuk dibaca UsePrivilegeSeparation no. (Ini diperlukan karena UsePrivilegeSeparationmenggunakan chroot()syscall, yang saat ini tidak didukung WSL.)
  • Sementara masih mengedit /etc/ssh/sshd_config, Anda dapat memilih untuk mengubah PasswordAuthentication noke PasswordAuthentication yes. Kalau tidak, Anda harus mengatur kunci SSH.
  • Simpan /etc/ssh/sshd_configdan keluar.
  • Jalankan sudo visudountuk mengedit file sudoers. Tambahkan baris

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

    mengganti "$ USER" dengan nama pengguna Linux Anda. Simpan dan keluar. Jika visudo mengeluh bahwa perubahan Anda tidak valid, perbaiki sampai melaporkan bahwa itu valid; jika tidak, Anda dapat merusak sudo di sistem Anda!

  • Di sisi Windows, edit firewall Windows (dan firewall pihak ketiga mana pun yang mungkin Anda jalankan) untuk mengizinkan lalu lintas masuk pada port 22. Karena ini bukan pengaturan yang sangat aman, saya sarankan hanya mengizinkan lalu lintas masuk dari rumah ( pribadi) dan jaringan domain, bukan dari Internet publik.
  • Buat file teks autostartssh.vbsdi Windows yang berisi berikut ini:

    set ws=wscript.createobject("wscript.shell")
    ws.run "C:\Windows\System32\bash.exe -c 'sudo /usr/sbin/sshd -D'",0
    
    • Klik dua kali pada skrip. Itu harus mulai sshd; Anda harus dapat ssh ke mesin Windows Anda.
    • Buka Penjadwal Tugas Windows. Tambahkan tugas yang berjalan autostartssh.vbspada boot sistem. Gunakan wscript.exesebagai perintah untuk menjalankan dan lokasi skrip VBS sebagai parameter.

Dan itu saja - komputer Windows Anda harus menjalankan server Linux openssh!

Poma
sumber
Skrip VBS tidak melakukan apa pun untuk saya. sshd tidak muncul di tab Network monitor sumber daya.
megamaiku
Saya menulis sebuah proses dispatcher github.com/131/dispatcher yang akan memungkinkan Anda untuk menelurkan bash tanpa windows.
131
@megamaiku: Saya punya masalah yang sama. Ternyata sedikit terpotong untuk menjalankan sshd terjebak pada prompt kata sandi (tidak terlihat) karena saya tidak melakukan bagian "visudo" dengan benar. Pada awalnya saya menambahkan baris NOPASSWD di suatu tempat di tengah file sudoers. Itu berhasil setelah saya memindahkannya ke bawah!
ltjax
1
Saat ini bekerja dengan baik UsePrivilegeSeparation = yes, kecuali bahwa seseorang juga perlu menjalankan sudo /bin/mkdir -p /var/run/sshd(untuk membuat direktori pemisahan hak istimewa) sebelum memulai sshd. Apakah WLS sekarang mendukung chroot (), apakah ada solusi di sumber openssh, atau apakah = Nopengaturan lebih merupakan rekomendasi keselamatan? Selain itu, tugas windows tampaknya hanya berfungsi untuk saya jika pengguna saya login.
init_js
Ini bekerja dengan sangat baik. Saya menyarankan, untuk mempermudah, pindahkan port yang sedang didengarkan SSH, misalnya 3322, sesuatu yang acak. Komentari baris /etc/ssh/sshd_configyang bertuliskan Port 22dan beralih ke Port 8822. Salah satu alasan untuk ini adalah Windows menjalankan semacam proses SSH pada 22. Saya telah melihat saran mengatakan tidak ada masalah dengan menonaktifkan itu, tapi saya merasa lebih mudah untuk hanya mengganti port WSL SSH.
Knickum
4

Saya perlu melakukan hal yang sama.

Berikut cara mem-boot subsistem Linux Ubuntu dengan semua layanan cron pada saat boot Windows & menyediakan cara untuk 'me-reboot' subsistem Linux.

Saya berhasil meng-hosting database openssh-server, nginx & mariadb di server kami.

Instal Subsistem Linux

  • Buka Powershell sebagai Administrator
  • Tempel:

    Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux
    
  • Instal Ubuntu dari Windows Store.

Hapus sudo password prompt (wajib)

  • Open bash (Subsistem Linux menginstal ini)
  • Tempel:

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

Aktifkan login kata sandi SSH (opsional)

  • Buka bash
  • Tempel:

    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
    

Autologin Windows saat mulai (diperlukan jika Anda memiliki kata sandi atau RDP)

  • Buka netplwiz
  • Hapus centang 'Pengguna harus memasukkan nama pengguna dan kata sandi ...'
  • Buka regedit sebagai Administrator
  • Telusuri ke

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon
    
  • Buat string baru DefaultPassworddan tulis kata sandi pengguna sebagai nilai.

Jalankan bash / cron loop saat start

  • Buat file bernama linux.batdishell:startup
  • Tempel:

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

Tambahkan aplikasi / layanan ke startup di cron

  • Buka bash
  • sudo crontab -e
  • Pilih nano (atau editor yang Anda tahu cara menyimpannya)
  • Tambahkan aplikasi startup seperti 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
    
  • Simpan dan keluar:, ctrlxlalu tekan ydan enter.

Reboot subsistem Linux tanpa me-reboot Windows

  • Buka bash atau SSH di

    sudo service ssh restart
    
  • Ini akan menutup instance saat ini dan membuat yang baru menerapkan cron.

Ekstra - Instal PHP 7.1 (tidak cukup lurus ke depan)

  • Jalankan perintah di bawah ini untuk pengaturan standar yang cantik:

    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
    
  • Jalankan perintah di bawah ini untuk pengaturan 'OwnCloud':

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

Ekstra - Instal nginx webserver

  • Jalankan perintah di bawah ini untuk pengaturan dasar dengan 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
    

Ekstra - Instal database mysql mariadb

  • Jalankan perintah di bawah ini untuk server database 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
    
  • Saat diminta, tetapkan kata sandi pengguna basis data root.

Nom
sumber
Itu sangat pintar! dan instruksi yang tepat, terima kasih. Apakah ada cara untuk menghindari melewatkan kata sandi "sudo" sepenuhnya?
greg
Saya tidak merekomendasikan menggunakan subsistem Linux lagi. Kompatibilitas aplikasi menyebalkan, tidak stabil dan alat-alatnya tidak semuanya bekerja sebaik yang mereka bisa - integrasi bash, dll. Alih-alih menggunakan msys2, ia menyediakan Anda dengan bash shell yang bagus dan akan memungkinkan Anda untuk menginstal banyak aplikasi melalui manajer paket pacman - Terbaik dari semua, semua aplikasi adalah .exe Yang perlu Anda lakukan adalah menambahkan direktori bin ke variabel lingkungan Anda di Windows. Saya menggunakan perintah linux di windows dan sebaliknya sekarang. Semua skrip Windows saya dilakukan dalam bash.
Nom
1

@poma jawaban sangat bagus, dan berdasarkan apa jawaban saya. Saya ingin menambahkan beberapa peningkatan padanya, meskipun:

  • Gunakan servicealih-alih menelepon sshdlangsung: 'sudo service ssh start'alih-alih 'sudo /usr/sbin/sshd -D'. Dengan begitu, bahkan jika Anda memanggil skrip beberapa kali, hanya akan ada paling banyak satu sshdproses. Juga, mudah untuk membunuhnya dengan skrip lain yang berjalan 'sudo service ssh stop'. Dalam file sudoers, Anda hanya perlu menggantinya /usr/sbin/sshd -Ddengan /usr/sbin/service.
  • Jika Anda sedang mengatur memanggil sshdlangsung, menyingkirkan -Dpilihan , karena yang akan menempatkan proses di latar depan tanpa batas. Jika Anda tidak percaya kepada saya, lakukan saja topdan Anda akan melihat initdan sudoproses untuk setiap kali Anda memanggil skrip. Jangan lupa untuk menghapus -Dopsi di file sudoers juga!
  • Gunakan PowerShell sebagai ganti vbs! Buat file bernama autostartsshd.ps1dan paste berikut ini: bash -c 'sudo service ssh start'. Untuk menjalankan skrip, klik kanan dan klik Run with PowerShell.

Pertanyaan stack overflow lainnya memiliki langkah serupa: /superuser//a/1114162/182590

Semoga itu bisa membantu seseorang :)

Hintron
sumber
Apakah Anda yakin ini akan berhasil? Menjalankan sshd di latar depan adalah sengaja untuk membuat bash sesi terbuka (tidak akan ada masalah dengan beberapa instance karena duplikat akan gagal untuk memulai). Jika Anda hanya menjalankan sudo service ssh startdan kemudian menutup bash itu akan membunuh daemon ssh. Setidaknya itulah yang dilakukannya pada saat menulis panduan saya.
Poma
@ Poma Dengan pembaruan terbaru untuk Windows 10, aplikasi Linux sekarang dapat berjalan di latar belakang, jadi saya pikir ini akan berfungsi dengan baik.
JacobTheDev
1

masukkan bash -c "echo [password] | service ssh start"skrip startup Windows, dan gunakan kata sandi sudo Anda sendiri untuk mengganti [kata sandi]

Wei
sumber
Anda tidak bisa hanya mem-pipe kata sandi ke sudo prompt (bukan berarti perintah Anda bahkan memasukkan sudokata kunci yang diperlukan yang terkandung dalam kalimat Anda). Ini tidak berhasil. Bukan berarti Anda harus menyimpan kata sandi Anda di plaintext!
adam_0
1

@Poma dan @Hintron jawaban bagus.

Saya ingin memperluas uraian tentang poin terakhir cara menambahkan tugas ssh di Penjadwal Tugas Windows karena memerlukan pengalihan beberapa opsi:

  • Jalankan "Penjadwal Tugas". Di daftar sebelah kiri pilih "Penjadwal Tugas (Lokal)", lalu pergi ke menu "Aksi" dan "Buat Tugas".
  • Tab umum:
    • Nama: "ssh"
    • Pilih "Jalankan apakah pengguna masuk atau tidak"
  • Tab pemicu:
    • Baru
      • Mulai tugas: "Saat startup"
  • Tab tindakan:
    • Baru
      • Program / skrip: C: \ Windows \ System32 \ bash.exe
      • Tambahkan argumen (opsional): -c "sudo / usr / sbin / service ssh start"
  • Kondisi:
    • Batalkan pilihan "Mulai tugas hanya jika komputer memiliki daya AC
  • Pengaturan
    • Batalkan pilihan "Hentikan tugas jika berjalan lebih lama dari

Ini digunakan doa bash langsung. Tidak perlu membungkusnya dalam skrip vbs atau PowerShell.

Saya menggunakan perintah layanan untuk alasan yang dijelaskan @Hintron. Selain itu doa sshd langsung memberikan kesalahan

Direktori pemisahan hak istimewa yang hilang: / var / run / sshd

Dalam hal demikian harus ditambahkan entri ini dengan sudo visudoperintah

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

Juga perhatikan bahwa di sini semua pengguna (kolom pertama) dapat memulai atau menghentikan sshd. Jika Anda hanya satu pengguna mesin Windows ini, maka itu akan baik-baik saja.

kwojta
sumber
1
  1. Buat file dengan nama wsl_setup.batdan tambahkan konten sebagai berikut

    wsl -u root -e sudo service ssh start
    wsl -u root -e sudo service nginx start
    
  2. Tambahkan wsl_setup.batfile ke folder startup windows windows-10-change-startup-apps

  3. Mulai ulang dan masuk ke akun windows Anda (ya, Anda harus masuk)

gaozhidf
sumber