วิธีการเรียกใช้บริการ Ubuntu บน Windows (เมื่อเริ่มต้น)


22

ฉันต้องการเปิดตัวเซิร์ฟเวอร์ SSH บนระบบย่อย Linux (Bash บน Ubuntu บน Windows) เมื่อเริ่มต้น Windows ปัญหาคือว่ากระบวนการ Linux ทั้งหมดจะถูกยกเลิกเมื่อปิดหน้าต่าง Bash

มีวิธีทำให้กระบวนการ Linux ทำงานอย่างถาวรในพื้นหลังโดยไม่มีหน้าต่างทุบตีหรือไม่?

คำตอบ:


26

พบบทช่วยสอนสำหรับสิ่งนั้นโดย aseering:

สิ่งนี้ถูกกล่าวถึงในขั้นต้นและเรียงลำดับโดยผู้ใช้ github imjakey, fpqc, qris, therealkenc, Manouchehri และ aseering (ตัวเอง) ที่นี่:

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

โปรดทราบว่าการรัน sshd มีผลกระทบด้านความปลอดภัย จนกว่ารูปแบบการรักษาความปลอดภัยของ WSL จะใช้เวลานานกว่าการอบคุณควรถือว่าทุกคนที่สามารถ ssh ลงในกล่อง Windows ของคุณได้รับอนุญาตให้ทำคำสั่งใด ๆ ในฐานะผู้ใช้ Windows ที่กำลังเรียกใช้ sshd โดยไม่คำนึงถึงสิทธิ์ระดับ (สิทธิ์อาจมีข้อ จำกัด มากกว่าในทางปฏิบัติ แต่รูปแบบความปลอดภัยเริ่มต้นของ WSL นั้นไม่ได้มีความซับซ้อนมากนัก)

ความพยายามรวบรวมคำแนะนำจาก github:

  • สร้างคีย์โฮสต์ SSH ด้วยการรันsudo dpkg-reconfigure openssh-serverใน bash shell
  • วิ่งsudo nano /etc/ssh/sshd_config; แก้ไขบรรทัดที่จะอ่านUsePrivilegeSeparation yes UsePrivilegeSeparation no(สิ่งนี้จำเป็นเนื่องจาก UsePrivilegeSeparationใช้chroot()syscall ซึ่ง WSL ไม่สนับสนุนในปัจจุบัน)
  • ขณะที่ยังคงการแก้ไข /etc/ssh/sshd_configคุณอาจเลือกที่จะเปลี่ยน ไปPasswordAuthentication no PasswordAuthentication yesมิฉะนั้นคุณจะต้องตั้งค่าคีย์ SSH
  • บันทึก /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; คุณควรจะสามารถ ssh ในเครื่อง Windows ของคุณ
    • เปิด Task Scheduler ของ Windows เพิ่มงานที่ทำงานautostartssh.vbsในการบูตระบบ ใช้wscript.exeเป็นคำสั่งเพื่อรันและตำแหน่งสคริปต์ VBS เป็นพารามิเตอร์

และนั่นคือ - คอมพิวเตอร์ Windows ของคุณควรใช้เซิร์ฟเวอร์ Linux openssh!


สคริปต์ VBS ไม่ได้ทำอะไรให้ฉันเลย sshd ไม่แสดงขึ้นในแท็บเครือข่ายมอนิเตอร์ทรัพยากร
megamaiku

ฉันเขียนโปรแกรมตัวจัดการกระบวนการ aa github.com/131/dispatcherที่จะช่วยให้คุณวางไข่ทุบตีโดยไม่มีหน้าต่าง
131

@megamaiku: ฉันมีปัญหาเดียวกัน ปรากฎว่ามีการจามเล็กน้อยเพื่อเรียกใช้ sshd ที่ติดอยู่บนพรอมต์รหัสผ่าน (มองไม่เห็น) เพราะฉันไม่ได้ทำส่วน "visudo" ตอนแรกฉันเพิ่ม NOPASSWD บรรทัดที่ไหนสักแห่งที่อยู่ตรงกลางไฟล์ sudoers มันทำงานได้เมื่อฉันย้ายมันไปที่ด้านล่าง!
ltjax

1
ขณะนี้มันทำงานด้วยUsePrivilegeSeparation = yesยกเว้นว่าจำเป็นต้องเรียกใช้sudo /bin/mkdir -p /var/run/sshd(เพื่อสร้างไดเรกทอรีการแยกสิทธิ์) ก่อนที่จะเริ่ม sshd ตอนนี้ WLS รองรับ chroot () มีวิธีแก้ปัญหาในแหล่ง openssh หรือไม่หรือเป็นการ= Noตั้งค่าคำแนะนำด้านความปลอดภัยมากขึ้นหรือไม่ นอกจากนี้ดูเหมือนว่างาน windows จะใช้ได้เฉพาะกับฉันถ้าผู้ใช้ของฉันเข้าสู่ระบบ
init_js

มันใช้งานได้ดีมาก ฉันอยากจะแนะนำให้ทำสิ่งต่าง ๆ ให้ง่ายขึ้นย้ายพอร์ต SSH ที่กำลังฟังอยู่เช่น 3322 สิ่งที่สุ่ม แสดงความคิดเห็นออกเส้นใน/etc/ssh/sshd_configที่อ่านและสลับไปPort 22 Port 8822เหตุผลหนึ่งคือ Windows ใช้กระบวนการ SSH ในวันที่ 22 ฉันเห็นคำแนะนำว่าไม่มีปัญหาในการปิดใช้งาน แต่ฉันพบว่าง่ายที่สุดในการเปลี่ยนพอร์ต WSL SSH
knickum

4

ฉันต้องการทำสิ่งเดียวกัน

นี่คือวิธีการบูทระบบย่อย Ubuntu Linux ด้วยบริการทั้งหมดของ cron เมื่อบู๊ต Windows และจัดหาวิธีการ 'รีบูต' ระบบย่อยลินุกซ์

ฉันโฮสต์โฮสติ้ง openssh-server, nginx & mariadb บนเซิร์ฟเวอร์ของเราเรียบร้อยแล้ว

ติดตั้งระบบย่อย Linux

  • เปิด Powershell ในฐานะผู้ดูแลระบบ
  • วาง:

    Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux
    
  • ติดตั้ง Ubuntu จาก Windows Store

ลบพรอมต์รหัสผ่าน 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 autologin เมื่อเริ่มต้น (จำเป็นถ้าคุณมีรหัสผ่านหรือ RDP ใน)

  • เปิด netplwiz
  • ยกเลิกการเลือก 'ผู้ใช้จะต้องป้อนชื่อผู้ใช้และรหัสผ่าน ... '
  • เปิด regedit ในฐานะผู้ดูแลระบบ
  • เรียกดู

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon
    
  • สร้างสตริงใหม่DefaultPasswordและเขียนรหัสผ่านของผู้ใช้เป็นค่า

ใช้ bash / cron loop เมื่อเริ่มต้น

  • สร้างไฟล์ที่เรียกว่า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จากนั้นกดและyenter

รีบูตระบบย่อย Linux โดยไม่ต้องบูต Windows ใหม่

  • เปิด 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
    

พิเศษ - ติดตั้งฐานข้อมูล mysql ของ mariadb

  • เรียกใช้คำสั่งด้านล่างสำหรับเซิร์ฟเวอร์ฐานข้อมูล 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
    
  • เมื่อได้รับพร้อมต์ให้ตั้งรหัสผ่านผู้ใช้ฐานข้อมูลรูท


นั่นฉลาดมาก! และคำแนะนำที่แม่นยำขอบคุณ มีวิธีหลีกเลี่ยงการข้ามรหัสผ่าน "sudo" ทั้งหมดหรือไม่
greg

ฉันไม่แนะนำให้ใช้ระบบย่อย Linux อีกต่อไป ความเข้ากันได้ของแอพมันไม่เสถียรและเครื่องมือไม่ทำงานอย่างที่ทำได้ - การรวม bash เป็นต้นแทนที่จะใช้ msys2 จะให้ bash shell ที่ยอดเยี่ยมและจะช่วยให้คุณติดตั้งแอพจำนวนมากผ่านทาง pacman package manager - ที่ดีที่สุดคือปพลิเคชันทั้งหมดเป็น. exe สิ่งที่คุณต้องทำคือเพิ่มไดเรกทอรี bin ลงในตัวแปรสภาพแวดล้อมของคุณใน Windows ฉันใช้คำสั่ง linux ใน windows และในทางกลับกันตอนนี้ การเขียนสคริปต์ Windows ของฉันเสร็จสมบูรณ์แล้ว
Nom

1

คำตอบของ @poma นั้นดีมากและเป็นคำตอบของฉัน ฉันต้องการเพิ่มการปรับปรุงบางอย่างแม้ว่า:

  • ใช้serviceแทนการโทรsshdโดยตรงแทน'sudo service ssh start' 'sudo /usr/sbin/sshd -D'ด้วยวิธีนี้แม้ว่าคุณจะเรียกใช้สคริปต์หลายครั้ง แต่จะมีเพียงsshdกระบวนการเดียวเท่านั้น 'sudo service ssh stop'นอกจากนี้มันเป็นเรื่องง่ายที่จะฆ่ามันด้วยสคริปต์อื่นที่วิ่ง ใน sudoers ไฟล์คุณก็ต้องเปลี่ยนด้วย/usr/sbin/sshd -D/usr/sbin/service
  • หากคุณกำลังตั้งอยู่บนโทรsshdโดยตรงได้รับการกำจัดของ-Dตัวเลือกเพราะที่จะทำให้กระบวนการในเบื้องหน้าไปเรื่อย ๆ ถ้าคุณไม่เชื่อฉันเพียงแค่ทำtopและคุณจะเห็นการinitและsudoกระบวนการในแต่ละครั้งที่คุณเรียกว่าสคริปต์ อย่าลืมลบ-Dตัวเลือกในไฟล์ sudoers ด้วย!
  • ใช้PowerShellแทน vbs! สร้างไฟล์ชื่อautostartsshd.ps1และวางในรายการต่อไปนี้: bash -c 'sudo service ssh start'. Run with PowerShellการรันสคริปต์ให้คลิกขวาและคลิก

คำถามล้นสแต็กอื่นมีขั้นตอนที่คล้ายกัน: /superuser//a/1114162/182590

หวังว่าจะช่วยให้ใครบางคน :)


คุณแน่ใจว่าจะใช้งานได้หรือไม่ การเรียกใช้ sshd ในเบื้องหน้านั้นเป็นการตั้งใจที่จะเปิดเซสชัน bash ไว้ (จะไม่มีปัญหากับหลาย ๆ อินสแตนซ์เพราะการทำซ้ำจะไม่สามารถเริ่มต้นได้) หากคุณเพียงแค่เรียกใช้sudo service ssh startแล้วปิดทุบตีมันจะฆ่า ssh daemon อย่างน้อยนั่นคือสิ่งที่ทำในขณะที่เขียนคำแนะนำของฉัน
Poma

@Poma ด้วยการอัปเดตล่าสุดเป็น Windows 10 ทำให้แอปพลิเคชัน Linux สามารถทำงานในพื้นหลังได้ดังนั้นฉันคิดว่านี่น่าจะใช้ได้ดี
JacobTheDev

1

ใส่bash -c "echo [password] | service ssh start"สคริปต์เริ่มต้น Windows และใช้รหัสผ่าน sudo ของคุณเองเพื่อแทนที่ [รหัสผ่าน]


คุณไม่สามารถเพียงแค่ไพพ์รหัสผ่านไปยังพรอมต์ sudo (ไม่ใช่ว่าคำสั่งของคุณจะรวมsudoคำหลักที่จำเป็นที่ประโยคของคุณหมายถึง) สิ่งนี้ไม่ทำงาน ไม่ว่าคุณจะต้องเก็บรหัสผ่านของคุณไว้ในที่ใด ๆ !
adam_0

1

คำตอบ @Poma และ @Hintron นั้นยอดเยี่ยม

ฉันต้องการที่จะขยายคำอธิบายของจุดสุดท้ายวิธีการเพิ่มงาน ssh ใน Windows Task Scheduler เนื่องจากมันต้องสลับตัวเลือกบางอย่าง:

  • เรียกใช้ "Task Scheduler" ในรายการด้านซ้ายให้เลือก "Task Scheduler (Local)" จากนั้นไปที่เมนู "Action" และ "Create Task"
  • แท็บทั่วไป:
    • ชื่อ: "ssh"
    • เลือก "Run ว่าผู้ใช้เข้าสู่ระบบหรือไม่"
  • แท็บทริกเกอร์:
    • ใหม่
      • เริ่มงาน: "เมื่อเริ่มต้น"
  • แท็บการกระทำ:
    • ใหม่
      • โปรแกรม / สคริปต์: C: \ Windows \ System32 \ bash.exe
      • เพิ่มอาร์กิวเมนต์ (ตัวเลือก): -c "sudo / usr / sbin / service ssh start"
  • เงื่อนไข:
    • ยกเลิกการเลือก "เริ่มงานเฉพาะเมื่อคอมพิวเตอร์ใช้ไฟ AC
  • การตั้งค่า
    • ยกเลิกการเลือก "หยุดงานหากทำงานได้นานกว่า

มันถูกใช้ขอร้องทุบตีโดยตรง ไม่จำเป็นต้องห่อไว้ในสคริปต์ vbs หรือ powerhell

ฉันใช้คำสั่งบริการด้วยเหตุผลที่ @Hintron อธิบาย นอกจากนี้การเรียกใช้ sshd โดยตรงทำให้เกิดข้อผิดพลาด

ไม่มีไดเรกทอรีการแยกสิทธิพิเศษ: / var / run / sshd

ในกรณีเช่นนี้ควรจะเพิ่มรายการนี้โดยsudo visudoคำสั่ง

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

นอกจากนี้โปรดสังเกตว่าที่นี่ผู้ใช้ทั้งหมด (คอลัมน์แรก) สามารถเริ่มหรือหยุด sshd หากคุณเป็นผู้ใช้เครื่อง Windows เครื่องนี้เพียงคนเดียวก็ควรจะใช้ได้


1
  1. สร้างชื่อไฟล์wsl_setup.batและเพิ่มเนื้อหาดังต่อไปนี้

    wsl -u root -e sudo service ssh start
    wsl -u root -e sudo service nginx start
    
  2. เพิ่มwsl_setup.batไฟล์ไปยังโฟลเดอร์เริ่มต้นwindows windows-10-change-startup-apps

  3. รีสตาร์ทและเข้าสู่ระบบบัญชี windows ของคุณ (ใช่คุณต้องเข้าสู่ระบบ)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.