Làm cách nào để chạy dịch vụ Ubuntu trên Windows (khi khởi động)?


22

Tôi muốn khởi chạy một máy chủ SSH trên hệ thống con Linux (Bash trên Ubuntu trên Windows) khi khởi động windows. Vấn đề là tất cả các quy trình Linux bị chấm dứt khi cửa sổ Bash bị đóng.

Có cách nào để làm cho quá trình Linux chạy vĩnh viễn trong nền mà không có cửa sổ bash không?

Câu trả lời:


26

Tìm thấy một hướng dẫn cho điều đó bằng cách aseering:

Điều này ban đầu được thảo luận và sắp xếp bởi người dùng github imjakey, fpqc, qris, Therealkenc, Manouchehri và aseering (bản thân tôi) tại đây:

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

Lưu ý rằng chạy sshd có ý nghĩa bảo mật. Cho đến khi mô hình bảo mật của WSL có thời gian nướng lâu hơn, bạn nên cho rằng bất kỳ ai có thể ssh vào hộp Windows của bạn đều có quyền thực hiện bất kỳ lệnh nào khi người dùng Windows chạy sshd, bất kể cấp phép Linux. (Quyền có thể hạn chế hơn so với thực tế, nhưng mô hình bảo mật ban đầu của WSL không nhằm mục đích rất tinh vi.)

Cố gắng tổng hợp các hướng dẫn từ github:

  • Tạo khóa máy chủ SSH bằng cách chạy sudo dpkg-reconfigure openssh-servertrong shell bash
  • Chạy sudo nano /etc/ssh/sshd_config; chỉnh sửa UsePrivilegeSeparation yesdòng để đọc UsePrivilegeSeparation no. (Điều này là cần thiết bởi vì UsePrivilegeSeparationsử dụng tòa nhà chroot(), mà WSL hiện không hỗ trợ.)
  • Trong khi vẫn chỉnh sửa /etc/ssh/sshd_config, bạn có thể chọn thay đổi PasswordAuthentication nothành PasswordAuthentication yes. Nếu không, bạn sẽ phải thiết lập các khóa SSH.
  • Lưu /etc/ssh/sshd_configvà thoát.
  • Chạy sudo visudođể chỉnh sửa tập tin sudoers. Thêm dòng

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

    thay thế "$ USER" bằng tên người dùng Linux của bạn. Lưu và thoát. Nếu visudo phàn nàn rằng các thay đổi của bạn không hợp lệ, hãy sửa chúng cho đến khi nó báo cáo rằng chúng hợp lệ; nếu không bạn có thể phá sudo trên hệ thống của bạn!

  • Về phía Windows, hãy chỉnh sửa tường lửa Windows (và mọi tường lửa của bên thứ ba mà bạn có thể đang chạy) để cho phép lưu lượng truy cập đến trên cổng 22. Vì đây không phải là thiết lập siêu an toàn, tôi khuyên bạn chỉ nên cho phép lưu lượng truy cập đến từ nhà ( riêng tư) và các mạng miền, không phải từ Internet công cộng.
  • Tạo một tệp văn bản autostartssh.vbstrong Windows có chứa các mục sau:

    set ws=wscript.createobject("wscript.shell")
    ws.run "C:\Windows\System32\bash.exe -c 'sudo /usr/sbin/sshd -D'",0
    
    • Nhấp đúp vào tập lệnh. Nó nên bắt đầu sshd; bạn sẽ có thể ssh vào máy Windows của bạn.
    • Mở Trình lập lịch tác vụ của Windows. Thêm một tác vụ chạy autostartssh.vbstrên hệ thống khởi động. Sử dụng wscript.exelàm lệnh để chạy và vị trí tập lệnh VBS làm tham số.

Và đó là - máy tính Windows của bạn sẽ chạy máy chủ Linux openssh!


Kịch bản VBS không làm gì cho tôi. sshd không hiển thị trong tab Mạng giám sát tài nguyên.
megamaiku

Tôi đã viết một bộ xử lý quy trình github.com/131/dispatcher cho phép bạn sinh ra bash không có cửa sổ.
131

@megamaiku: Tôi gặp vấn đề tương tự. Hóa ra con nhỏ bị bắn để chạy sshd đã bị kẹt trên dấu nhắc mật khẩu (vô hình) vì tôi đã không thực hiện đúng phần "visudo". Lúc đầu, tôi đã thêm dòng NOPASSWD ở đâu đó ở giữa tệp sudoers. Nó hoạt động một khi tôi di chuyển nó xuống dưới cùng!
ltjax

1
Hiện tại nó đang hoạt động UsePrivilegeSeparation = yes, ngoại trừ việc người ta cũng cần chạy sudo /bin/mkdir -p /var/run/sshd(để tạo các thư mục phân tách đặc quyền) trước khi bắt đầu sshd. Hiện tại, WLS có hỗ trợ chroot () không, có một cách giải quyết khác trong nguồn openssh hay là = Nocài đặt thêm về khuyến nghị an toàn? Ngoài ra, tác vụ windows dường như chỉ hoạt động với tôi nếu người dùng của tôi đăng nhập.
init_js

Điều này làm việc xuất sắc. Tôi muốn đề xuất, để làm cho mọi thứ dễ dàng hơn, hãy di chuyển cổng SSH đang lắng nghe, ví dụ: 3322, một cái gì đó ngẫu nhiên. Nhận xét dòng trong /etc/ssh/sshd_configđó đọc Port 22và chuyển sang Port 8822. Một lý do cho điều này là Windows chạy một số quy trình SSH trên 22. Tôi đã thấy các đề xuất nói rằng không có vấn đề gì với việc vô hiệu hóa điều đó, nhưng tôi thấy dễ dàng nhất là chỉ cần chuyển đổi cổng WSL SSH.
knickum

4

Tôi cần phải làm điều tương tự.

Đây là cách khởi động hệ thống con Ubuntu Linux với tất cả các dịch vụ của cron khi khởi động Windows và cung cấp phương tiện để 'khởi động lại' hệ thống con Linux.

Tôi đang lưu trữ thành công cơ sở dữ liệu openssh-server, nginx & mariadb trên máy chủ của chúng tôi.

Cài đặt hệ thống con Linux

  • Mở Powershell với tư cách Quản trị viên
  • Dán:

    Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux
    
  • Cài đặt Ubuntu từ Windows Store.

Xóa dấu nhắc mật khẩu sudo (bắt buộc)

  • Mở bash (Hệ thống con Linux cài đặt cái này)
  • Dán:

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

Cho phép đăng nhập mật khẩu SSH (tùy chọn)

  • Mở bash
  • Dán:

    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 khi bắt đầu (bắt buộc nếu bạn có mật khẩu hoặc RDP trong)

  • Mở mạng
  • Bỏ chọn 'Người dùng phải nhập tên người dùng và mật khẩu ...'
  • Mở regedit với tư cách Quản trị viên
  • Duyệt đến

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon
    
  • Tạo một chuỗi mới DefaultPasswordvà viết mật khẩu của người dùng làm giá trị.

Chạy vòng lặp bash / cron khi bắt đầu

  • Tạo một tệp có tên linux.battrongshell:startup
  • Dán:

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

Thêm ứng dụng / dịch vụ để khởi động trên cron

  • Mở bash
  • sudo crontab -e
  • Chọn nano (hoặc bất kỳ trình chỉnh sửa nào bạn biết cách lưu vào)
  • Nối các ứng dụng khởi động như 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
    
  • Lưu và thoát : ctrlx, sau đó nhấn yenter.

Khởi động lại hệ thống con Linux mà không cần khởi động lại Windows

  • Mở bash hoặc SSH trong

    sudo service ssh restart
    
  • Điều này sẽ đóng phiên bản hiện tại và tạo một cron mới áp dụng.

Bổ sung - Cài đặt PHP 7.1 (không hoàn toàn đơn giản)

  • Chạy các lệnh dưới đây để thiết lập tiêu chuẩn khá:

    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
    
  • Chạy lệnh bên dưới để thiết lập 'ownCloud':

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

Thêm - Cài đặt máy chủ web nginx

  • Chạy các lệnh bên dưới để thiết lập cơ sở với 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
    

Thêm - Cài đặt cơ sở dữ liệu mysql của mariadb

  • Chạy các lệnh dưới đây cho một máy chủ cơ sở dữ liệu 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
    
  • Khi được nhắc, hãy đặt mật khẩu người dùng cơ sở dữ liệu gốc.


Điều đó rất thông minh! và hướng dẫn chính xác, cảm ơn. Có cách nào để tránh bỏ qua mật khẩu "sudo" hoàn toàn không?
greg

Tôi không khuyên bạn nên sử dụng hệ thống con Linux nữa. Khả năng tương thích của ứng dụng rất tệ, nó không ổn định và các công cụ không hoạt động tốt như họ có thể - tích hợp bash, v.v. Thay vào đó hãy sử dụng msys2, nó cung cấp cho bạn một bash shell tuyệt vời và sẽ cho phép bạn cài đặt rất nhiều ứng dụng thông qua nó Trình quản lý gói pacman - Tốt nhất trong tất cả, tất cả các ứng dụng là .exe. Tất cả bạn cần làm là thêm các thư mục bin vào các biến môi trường của bạn trong Windows. Tôi sử dụng các lệnh linux trong windows và ngược lại. Tất cả các kịch bản Windows của tôi được thực hiện trong bash.
Nôm

1

Câu trả lời của @poma là rất tốt, và đó là câu trả lời của tôi dựa trên. Tôi muốn thêm một số cải tiến cho nó, mặc dù:

  • Sử dụng servicethay vì gọi sshdtrực tiếp: 'sudo service ssh start'thay vì 'sudo /usr/sbin/sshd -D'. Theo cách đó, ngay cả khi bạn gọi tập lệnh nhiều lần, sẽ chỉ có tối đa một sshdquy trình. Ngoài ra, thật dễ dàng để giết nó với một kịch bản khác chạy 'sudo service ssh stop'. Trong tệp sudoers, bạn chỉ cần thay thế /usr/sbin/sshd -Dbằng /usr/sbin/service.
  • Nếu bạn được thiết lập để gọi sshdtrực tiếp, hãy loại bỏ -Dtùy chọn này , vì điều đó sẽ đặt một quá trình ở phía trước vô thời hạn. Nếu bạn không tin tôi, chỉ cần làm topvà bạn sẽ thấy một initvà một sudoquy trình cho mỗi lần bạn gọi kịch bản. Đừng quên xóa -Dtùy chọn trong tệp sudoers!
  • Sử dụng PowerShell thay vì vbs! Tạo một tập tin được gọi autostartsshd.ps1và dán vào sau : bash -c 'sudo service ssh start'. Để thực thi kịch bản, nhấp chuột phải vào nó và nhấp vào Run with PowerShell.

Một câu hỏi tràn ngăn xếp khác có các bước tương tự: /superuser//a/1114162/182590

Mong rằng sẽ giúp được ai đó :)


Bạn có chắc chắn điều này sẽ làm việc? Chạy sshd trong foreground là cố ý để giữ phiên bash mở (sẽ không có vấn đề với nhiều trường hợp vì các bản sao sẽ không bắt đầu). Nếu bạn chỉ chạy sudo service ssh startvà sau đó đóng bash, nó sẽ giết ssh daemon. Ít nhất đó là những gì nó đã làm tại thời điểm viết hướng dẫn của tôi.
Poma

@Poma Với bản cập nhật mới nhất cho Windows 10, các ứng dụng Linux hiện có thể chạy trong nền, vì vậy tôi nghĩ rằng nó sẽ hoạt động tốt.
JacobTheDev

1

đưa bash -c "echo [password] | service ssh start"vào tập lệnh khởi động Windows và sử dụng mật khẩu sudo của riêng bạn để thay thế [mật khẩu]


Bạn không thể chuyển mật khẩu đến dấu nhắc sudo (không phải lệnh của bạn thậm chí bao gồm sudotừ khóa cần thiết mà câu của bạn ngụ ý). Điều này chỉ không hoạt động. Không phải là bạn nên lưu trữ mật khẩu của mình bằng mọi cách!
adam_0

1

Câu trả lời @Poma và @Hintron rất tuyệt.

Tôi muốn mở rộng mô tả về điểm cuối cùng về cách thêm tác vụ ssh trong Trình lập lịch tác vụ Windows vì nó yêu cầu chuyển đổi một số tùy chọn:

  • Chạy "Lập lịch tác vụ". Trên danh sách bên trái, chọn "Trình lập lịch tác vụ (cục bộ)", sau đó chuyển đến trình đơn "Hành động" và "Tạo tác vụ".
  • Tab chung:
    • Tên: "ssh"
    • Chọn "Chạy cho dù người dùng đã đăng nhập hay không"
  • Tab kích hoạt:
    • Mới
      • Bắt đầu nhiệm vụ: "Lúc khởi động"
  • Tab hành động:
    • Mới
      • Chương trình / tập lệnh: C: \ Windows \ System32 \ bash.exe
      • Thêm đối số (tùy chọn): -c "sudo / usr / sbin / service ssh start"
  • Điều kiện:
    • Bỏ chọn "Chỉ bắt đầu tác vụ nếu máy tính bật nguồn AC
  • Cài đặt
    • Bỏ chọn "Dừng tác vụ nếu nó chạy lâu hơn

Nó được sử dụng gọi bash trực tiếp. Không cần phải bọc nó trong các tập lệnh vbs hoặc powershell.

Tôi sử dụng lệnh dịch vụ vì lý do mà @Hintron giải thích. Ngoài ra lời gọi sshd trực tiếp cho lỗi

Thiếu thư mục phân tách đặc quyền: / var / run / sshd

Trong trường hợp như vậy, nó nên được thêm vào mục này bằng sudo visudolệnh

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

Cũng lưu ý rằng ở đây tất cả người dùng (cột đầu tiên) có thể bắt đầu hoặc dừng sshd. Nếu bạn chỉ là một người dùng của máy Windows này, thì nó sẽ ổn thôi.


1
  1. Tạo một tệp có tên wsl_setup.batvà thêm nội dung như sau

    wsl -u root -e sudo service ssh start
    wsl -u root -e sudo service nginx start
    
  2. Thêm wsl_setup.battệp vào thư mục khởi động windows windows-10-change-startup-apps

  3. Khởi động lại và đăng nhập tài khoản windows của bạn (vâng, bạn cần đăng nhập)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.