ฉันต้องการเปิดตัวเซิร์ฟเวอร์ SSH บนระบบย่อย Linux (Bash บน Ubuntu บน Windows) เมื่อเริ่มต้น Windows ปัญหาคือว่ากระบวนการ Linux ทั้งหมดจะถูกยกเลิกเมื่อปิดหน้าต่าง Bash
มีวิธีทำให้กระบวนการ Linux ทำงานอย่างถาวรในพื้นหลังโดยไม่มีหน้าต่างทุบตีหรือไม่?
ฉันต้องการเปิดตัวเซิร์ฟเวอร์ SSH บนระบบย่อย Linux (Bash บน Ubuntu บน Windows) เมื่อเริ่มต้น Windows ปัญหาคือว่ากระบวนการ Linux ทั้งหมดจะถูกยกเลิกเมื่อปิดหน้าต่าง Bash
มีวิธีทำให้กระบวนการ Linux ทำงานอย่างถาวรในพื้นหลังโดยไม่มีหน้าต่างทุบตีหรือไม่?
คำตอบ:
พบบทช่วยสอนสำหรับสิ่งนั้นโดย aseering:
สิ่งนี้ถูกกล่าวถึงในขั้นต้นและเรียงลำดับโดยผู้ใช้ github imjakey, fpqc, qris, therealkenc, Manouchehri และ aseering (ตัวเอง) ที่นี่:
https://github.com/Microsoft/BashOnWindows/issues/612
โปรดทราบว่าการรัน sshd มีผลกระทบด้านความปลอดภัย จนกว่ารูปแบบการรักษาความปลอดภัยของ WSL จะใช้เวลานานกว่าการอบคุณควรถือว่าทุกคนที่สามารถ ssh ลงในกล่อง Windows ของคุณได้รับอนุญาตให้ทำคำสั่งใด ๆ ในฐานะผู้ใช้ Windows ที่กำลังเรียกใช้ sshd โดยไม่คำนึงถึงสิทธิ์ระดับ (สิทธิ์อาจมีข้อ จำกัด มากกว่าในทางปฏิบัติ แต่รูปแบบความปลอดภัยเริ่มต้นของ WSL นั้นไม่ได้มีความซับซ้อนมากนัก)
ความพยายามรวบรวมคำแนะนำจาก github:
sudo dpkg-reconfigure
openssh-server
ใน bash shellsudo 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 ในระบบของคุณ!
สร้างไฟล์ข้อความ
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!
UsePrivilegeSeparation = yes
ยกเว้นว่าจำเป็นต้องเรียกใช้sudo /bin/mkdir -p /var/run/sshd
(เพื่อสร้างไดเรกทอรีการแยกสิทธิ์) ก่อนที่จะเริ่ม sshd ตอนนี้ WLS รองรับ chroot () มีวิธีแก้ปัญหาในแหล่ง openssh หรือไม่หรือเป็นการ= No
ตั้งค่าคำแนะนำด้านความปลอดภัยมากขึ้นหรือไม่ นอกจากนี้ดูเหมือนว่างาน windows จะใช้ได้เฉพาะกับฉันถ้าผู้ใช้ของฉันเข้าสู่ระบบ
/etc/ssh/sshd_config
ที่อ่านและสลับไปPort 22
Port 8822
เหตุผลหนึ่งคือ Windows ใช้กระบวนการ SSH ในวันที่ 22 ฉันเห็นคำแนะนำว่าไม่มีปัญหาในการปิดใช้งาน แต่ฉันพบว่าง่ายที่สุดในการเปลี่ยนพอร์ต WSL SSH
ฉันต้องการทำสิ่งเดียวกัน
นี่คือวิธีการบูทระบบย่อย Ubuntu Linux ด้วยบริการทั้งหมดของ cron เมื่อบู๊ต Windows และจัดหาวิธีการ 'รีบูต' ระบบย่อยลินุกซ์
ฉันโฮสต์โฮสติ้ง openssh-server, nginx & mariadb บนเซิร์ฟเวอร์ของเราเรียบร้อยแล้ว
ติดตั้งระบบย่อย Linux
วาง:
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux
ติดตั้ง Ubuntu จาก Windows Store
ลบพรอมต์รหัสผ่าน 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 autologin เมื่อเริ่มต้น (จำเป็นถ้าคุณมีรหัสผ่านหรือ RDP ใน)
เรียกดู
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
เมื่อได้รับพร้อมต์ให้ตั้งรหัสผ่านผู้ใช้ฐานข้อมูลรูท
คำตอบของ @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 ด้วย!autostartsshd.ps1
และวางในรายการต่อไปนี้: bash -c 'sudo service ssh start'
. Run with PowerShell
การรันสคริปต์ให้คลิกขวาและคลิกคำถามล้นสแต็กอื่นมีขั้นตอนที่คล้ายกัน: /superuser//a/1114162/182590
หวังว่าจะช่วยให้ใครบางคน :)
sudo service ssh start
แล้วปิดทุบตีมันจะฆ่า ssh daemon อย่างน้อยนั่นคือสิ่งที่ทำในขณะที่เขียนคำแนะนำของฉัน
ใส่bash -c "echo [password] | service ssh start"
สคริปต์เริ่มต้น Windows และใช้รหัสผ่าน sudo ของคุณเองเพื่อแทนที่ [รหัสผ่าน]
sudo
คำหลักที่จำเป็นที่ประโยคของคุณหมายถึง) สิ่งนี้ไม่ทำงาน ไม่ว่าคุณจะต้องเก็บรหัสผ่านของคุณไว้ในที่ใด ๆ !
คำตอบ @Poma และ @Hintron นั้นยอดเยี่ยม
ฉันต้องการที่จะขยายคำอธิบายของจุดสุดท้ายวิธีการเพิ่มงาน ssh ใน Windows Task Scheduler เนื่องจากมันต้องสลับตัวเลือกบางอย่าง:
มันถูกใช้ขอร้องทุบตีโดยตรง ไม่จำเป็นต้องห่อไว้ในสคริปต์ vbs หรือ powerhell
ฉันใช้คำสั่งบริการด้วยเหตุผลที่ @Hintron อธิบาย นอกจากนี้การเรียกใช้ sshd โดยตรงทำให้เกิดข้อผิดพลาด
ไม่มีไดเรกทอรีการแยกสิทธิพิเศษ: / var / run / sshd
ในกรณีเช่นนี้ควรจะเพิ่มรายการนี้โดยsudo visudo
คำสั่ง
ALL ALL = (root) NOPASSWD: /usr/sbin/service ssh *
นอกจากนี้โปรดสังเกตว่าที่นี่ผู้ใช้ทั้งหมด (คอลัมน์แรก) สามารถเริ่มหรือหยุด sshd หากคุณเป็นผู้ใช้เครื่อง Windows เครื่องนี้เพียงคนเดียวก็ควรจะใช้ได้
สร้างชื่อไฟล์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-change-startup-apps
รีสตาร์ทและเข้าสู่ระบบบัญชี windows ของคุณ (ใช่คุณต้องเข้าสู่ระบบ)