विंडोज पर (स्टार्टअप पर) उबंटू सेवा कैसे चलाएं?


22

मैं लिनक्स सबसिस्टम पर एसएसएच सर्वर लॉन्च करना चाहता हूं (विंडोज़ पर उबंटू पर बैश) विंडोज़ स्टार्टअप पर। समस्या यह है कि बैश विंडो बंद होने पर सभी लिनक्स प्रक्रियाएं समाप्त हो जाती हैं।

क्या बैश विंडो के बिना पृष्ठभूमि में लिनक्स प्रक्रिया को स्थायी रूप से चलाने का एक तरीका है?

जवाबों:


26

उस के लिए एक ट्यूटोरियल मिला aseering द्वारा:

यह मूल रूप से चर्चा की गई थी और यहाँ github उपयोगकर्ताओं imjakey, fpqc, qris, therealkenc, Manouchehri, और aseering (स्वयं) द्वारा हल किया गया था:

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

ध्यान दें कि sshd को चलाने के सुरक्षा निहितार्थ हैं। जब तक WSL के सुरक्षा मॉडल को बेक करने में अधिक समय नहीं लगता, तब तक आपको यह मान लेना चाहिए कि जो कोई भी आपके विंडोज बॉक्स में ssh कर सकता है, उसे लिनक्स-स्तर की अनुमति के बावजूद, किसी भी कमांड को Windows उपयोगकर्ता के sshd के रूप में चलाने की अनुमति है। (अभ्यास में संभवतः अनुमतियाँ इससे अधिक प्रतिबंधात्मक होती हैं, लेकिन WSL का प्रारंभिक सुरक्षा मॉडल बहुत परिष्कृत होने का इरादा नहीं है।)

गीथूब से निर्देशों को एकत्र करने का प्रयास:

  • SSH होस्ट कुंजियों को sudo dpkg-reconfigure openssh-serverबैश शेल में चलाकर उत्पन्न करें
  • भागो sudo nano /etc/ssh/sshd_config; UsePrivilegeSeparation yesपढ़ने के लिए लाइन संपादित करें UsePrivilegeSeparation no। (यह आवश्यक है क्योंकि syscall UsePrivilegeSeparationका उपयोग करता है chroot(), जिसे WSL वर्तमान में समर्थन नहीं करता है।)
  • अभी भी संपादन करते समय /etc/ssh/sshd_config, आप बदलने के PasswordAuthentication noलिए चुन सकते हैं PasswordAuthentication yes। अन्यथा आपको SSH कीज़ सेट करनी होंगी।
  • सहेजें /etc/ssh/sshd_configऔर बाहर निकलें।
  • sudo visudoSudoers फ़ाइल को संपादित करने के लिए चलाएँ । लाइन जोड़ें

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

    अपने लिनक्स उपयोगकर्ता नाम के साथ "$ USER" की जगह। सुरषित और बहार। यदि विडोको शिकायत करता है कि आपके परिवर्तन अमान्य हैं, तो उन्हें तब तक ठीक करें जब तक यह रिपोर्ट न हो जाए कि वे वैध हैं; अन्यथा आप अपने सिस्टम पर sudo तोड़ सकते हैं!

  • Windows 22 पर, पोर्ट 22 पर आने वाले ट्रैफ़िक की अनुमति देने के लिए Windows फ़ायरवॉल (और आपके द्वारा चलाए जा रहे किसी भी तृतीय-पक्ष फ़ायरवॉल) को संपादित करें। क्योंकि यह एक सुपर-सुरक्षित सेटअप नहीं है, मैं केवल घर से आने वाले ट्रैफ़िक की अनुमति देने की सलाह देता हूं ( निजी) और डोमेन नेटवर्क, सार्वजनिक इंटरनेट से नहीं।
  • autostartssh.vbsWindows में एक पाठ फ़ाइल बनाएँ जिसमें निम्नलिखित हैं:

    set ws=wscript.createobject("wscript.shell")
    ws.run "C:\Windows\System32\bash.exe -c 'sudo /usr/sbin/sshd -D'",0
    
    • स्क्रिप्ट पर डबल-क्लिक करें। इसे sshd शुरू करना चाहिए; आप अपने विंडोज मशीन में ssh करने में सक्षम होना चाहिए।
    • विंडोज के टास्क शेड्यूलर को खोलें। एक कार्य जोड़ें जो autostartssh.vbsसिस्टम बूट पर चलता है । का प्रयोग करें wscript.exeचलाने के लिए और पैरामीटर के रूप में VBS स्क्रिप्ट स्थान पर कमांड के रूप में।

और वह यह है - आपका विंडोज कंप्यूटर एक लिनक्स ओपनश सर्वर चल रहा होना चाहिए!


VBS स्क्रिप्ट ने मेरे लिए कुछ नहीं किया। sshd संसाधन मॉनिटर नेटवर्क टैब में दिखाई नहीं दे रहा है।
मेगामिकु

मैंने लिखा है कि एक प्रक्रिया डिस्पैचर github.com/131/dispatcher है कि 'आपको बिना किसी विंडो के बैश करने की अनुमति देगा।
15

@megamaiku: मैं एक ही समस्या थी। Sshd को चलाने के लिए थोड़ा छीन लिया गया (अदृश्य) पासवर्ड प्रॉम्प्ट पर अटक गया क्योंकि मैंने "visudo" भाग सही नहीं किया था। सबसे पहले मैंने sudoers फ़ाइल के बीच में कहीं NOPASSWD लाइन जोड़ी। एक बार काम करने के बाद मैंने उसे नीचे ले जाया!
ltjax

1
यह वर्तमान में काम कर रहा है UsePrivilegeSeparation = yes, सिवाय इसके कि किसी को भी sudo /bin/mkdir -p /var/run/sshdsshd शुरू करने से पहले (विशेषाधिकार अलगाव निर्देशिकाओं को बनाने के लिए) चलाने की आवश्यकता है । क्या अब WLS चेरोट का समर्थन करता है (), क्या ओपनशॉ स्रोत में एक जगह पर वर्कअराउंड है, या = Noएक सुरक्षा सिफारिश की सेटिंग अधिक है? यदि मेरा उपयोगकर्ता लॉग इन है, तो भी, विंडो कार्य केवल मेरे लिए काम करता है।
init_js

इसने बेहतरीन काम किया। मैं सुझाव दूंगा कि चीजों को आसान बनाने के लिए, पोर्ट को स्थानांतरित करें SSH पर सुन रहा है, जैसे 3322, कुछ यादृच्छिक। उस पंक्ति को टिप्पणी /etc/ssh/sshd_configपढ़ें Port 22और उसमें स्विच करें Port 8822। इसका एक कारण यह है कि विंडोज 22 पर SSH प्रक्रिया को चला रहा है। मैंने सुझाव दिया है कि इसे अक्षम करने में कोई समस्या नहीं है, लेकिन मैंने केवल WSL SSH पोर्ट को स्विच करना आसान पाया।
प्रातः

4

मुझे एक ही काम करने की जरूरत है।

यहाँ विंडोज बूट पर क्रोन की सभी सेवाओं के साथ उबंटू लिनक्स सबसिस्टम को बूट करने का तरीका बताया गया है और लिनक्स सिस्टम को 'रिबूट' करने का साधन प्रदान किया गया है।

मैं सफलतापूर्वक अपने सर्वर पर ओपनश-सर्वर, नगनेक्स और मारीडब डेटाबेस की मेजबानी कर रहा हूं।

लिनक्स सबसिस्टम स्थापित करें

  • प्रशासक के रूप में Powershell खोलें
  • पेस्ट करें:

    Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux
    
  • विंडोज स्टोर से उबंटू स्थापित करें।

निकालें 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
    

स्टार्ट पर विंडोज ऑटोलॉगिन (यदि आपके पास पासवर्ड या आरडीपी है)

  • नेटप्लविज़ खोलें
  • 'उपयोगकर्ता उपयोक्तानाम और पासवर्ड दर्ज करें'
  • प्रशासक के रूप में regedit खोलें
  • के लिए ब्राउज़ करें

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon
    
  • एक नया स्ट्रिंग बनाएं DefaultPasswordऔर मूल्य के रूप में उपयोगकर्ता का पासवर्ड लिखें।

प्रारंभ पर बैश / क्रोन लूप चलाएं

  • एक फाइल बनाएं जिसका नाम linux.batमेंshell:startup
  • पेस्ट करें:

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

क्रोन पर स्टार्टअप में ऐप / सेवाएं जोड़ें

  • खुला बैश
  • sudo crontab -e
  • नैनो (या कोई भी संपादक जिसे आप जानते हैं कि कैसे सहेजना है) चुनें
  • स्टार्टअप ऐप जैसे कि ओपनश-सर्वर, नग्नेक्स, माईस्क्, 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फिर दबाएँ yऔर enter

विंडोज को रिबूट किए बिना लिनक्स सबसिस्टम को रिबूट करें

  • ओपन बैश या एसएसएच इन

    sudo service ssh restart
    
  • यह वर्तमान उदाहरण को बंद कर देगा और एक नया एप्रेन क्रोन बना देगा।

अतिरिक्त - 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
    
  • एक 'ओनक्लाउड' सेटअप के लिए नीचे दिया गया कमांड चलाएँ:

    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
    

अतिरिक्त - mariadb के mysql डेटाबेस को स्थापित करें

  • 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
    
  • संकेत दिए जाने पर, रूट डेटाबेस उपयोगकर्ता पासवर्ड सेट करें।


यह बहुत चालाक है! और सटीक निर्देश, धन्यवाद। क्या पूरी तरह से "सूडो" पासवर्ड को लंघन से बचने का एक तरीका है?
greg

मैं अब लिनक्स सबसिस्टम का उपयोग करने की सलाह नहीं देता। एप्लिकेशन संगतता बेकार है, यह अस्थिर है और उपकरण सभी काम नहीं करते हैं जैसे कि वे कर सकते हैं - बैश एकीकरण, आदि इसके बजाय msys2 का उपयोग करें, यह आपको एक शानदार बैश शेल प्रदान करता है और आपको इसके माध्यम से बहुत सारे एप्लिकेशन इंस्टॉल करने की अनुमति देगा। pacman package manager - सबसे अच्छा, सभी ऐप्स हैं .exe के। आपको बस Windows में अपने वातावरण चर में बिन निर्देशिकाओं को जोड़ना होगा। मैं विंडोज़ में लिनक्स कमांड का उपयोग करता हूं और इसके विपरीत। मेरे सभी विंडोज स्क्रिप्टिंग को बैश में किया जाता है।
नोम

1

@ पोमा का उत्तर बहुत अच्छा है, और यह है कि मेरा उत्तर क्या है। मैं इसमें कुछ सुधार जोड़ना चाहता हूं, हालांकि:

  • सीधे 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 फ़ाइल में विकल्प को हटाने के लिए मत भूलना !
  • Vbs के बजाय PowerShell का उपयोग करें ! नामक एक फ़ाइल बनाएँ autostartsshd.ps1और निम्नलिखित में पेस्ट करें bash -c 'sudo service ssh start':। स्क्रिप्ट निष्पादित करने के लिए, इसे राइट क्लिक करें और क्लिक करें Run with PowerShell

एक और स्टैक ओवरफ्लो प्रश्न के समान चरण हैं: /superuser//a/1114162/182590

आशा है कि किसी की मदद करता है :)


क्या आपको यकीन है कि यह काम करेगा? अग्रभूमि में sshd चलाना जानबूझकर बैश सत्र को खुला रखने के लिए था (कई उदाहरणों के साथ कोई समस्या नहीं होगी क्योंकि डुप्लिकेट्स प्रारंभ करने में विफल होंगे)। यदि आप बस चलाते हैं sudo service ssh startऔर फिर इसे बंद करते हैं तो यह ssh डेमॉन को मार देगा। कम से कम यह है कि यह मेरे गाइड लिखने के क्षण में क्या किया।
पोमा

@Poma विंडोज 10 के नवीनतम अपडेट के साथ, लिनक्स एप्लिकेशन अब पृष्ठभूमि में चल सकते हैं, इसलिए मुझे लगता है कि यह ठीक काम करना चाहिए।
जैकब डेव

1

bash -c "echo [password] | service ssh start"विंडोज स्टार्टअप स्क्रिप्ट में डाल दिया , और [पासवर्ड] स्थानापन्न करने के लिए अपने स्वयं के पासवर्ड का उपयोग करें


आप किसी sudo प्रॉम्प्ट पर पासवर्ड नहीं डाल सकते (ऐसा नहीं है कि आपकी कमांड में वह आवश्यक sudoकीवर्ड भी शामिल हो , जो आपके वाक्य का अर्थ है)। यह सिर्फ काम नहीं करता है। ऐसा नहीं है कि आप कभी भी अपना पासवर्ड प्लेनटेक्स्ट वैसे भी स्टोर करें!
adam_0

1

@ पोमा और @ हिंट्रोन जवाब बहुत अच्छे हैं।

मैं विंडोज टास्क शेड्यूलर में ssh टास्क को जोड़ने के अंतिम बिंदु के विवरण का विस्तार करना चाहूंगा क्योंकि इसमें कुछ विकल्पों को बदलने की आवश्यकता होती है:

  • "कार्य शेड्यूलर" चलाएं। बाईं सूची में "टास्क शेड्यूलर (स्थानीय)" चुनें, फिर "एक्शन" मेनू और "टास्क बनाएं" पर जाएं।
  • सामान्य टैब:
    • नाम: "ssh"
    • "उपयोगकर्ता लॉग ऑन है या नहीं" का चयन करें
  • ट्रिगर टैब:
    • नया
      • कार्य शुरू करें: "स्टार्टअप पर"
  • क्रियाएँ टैब:
    • नया
      • कार्यक्रम / स्क्रिप्ट: C: \ Windows \ System32 \ bash.exe
      • तर्क जोड़ें (वैकल्पिक): -c "sudo / usr / sbin / सेवा ssh start"
  • शर्तेँ:
    • अचयनित करें "कार्य केवल तभी प्रारंभ करें जब कंप्यूटर AC पॉवर पर हो
  • समायोजन
    • अचयनित करें "यदि यह लंबे समय तक चलता है तो कार्य रोकें

इसका उपयोग प्रत्यक्ष बैश आह्वान के लिए किया जाता है। इसे vbs या पॉवरशेल स्क्रिप्ट में लपेटने की कोई आवश्यकता नहीं है।

मैं उन कारणों के लिए सेवा कमांड का उपयोग करता हूं जो @Hintron ने समझाया था। इसके अतिरिक्त प्रत्यक्ष sshd मंगलाचरण त्रुटि देता है

गुम विशेषाधिकार विशेषाधिकार निर्देशिका: / var / run / sshd

ऐसे मामले में इसे इस प्रविष्टि को sudo visudoकमांड द्वारा जोड़ा जाना चाहिए

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

यह भी ध्यान दें कि यहां सभी उपयोगकर्ता (पहला कॉलम) sshd शुरू या बंद कर सकते हैं। यदि आपका इस विंडोज मशीन का केवल एक उपयोगकर्ता है, तो यह ठीक होना चाहिए।


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विंडोज़ स्टार्टअप फ़ोल्डर विंडोज़ -10-चेंज-स्टार्टअप-ऐप्स में फ़ाइल जोड़ें

  3. पुनरारंभ करें और अपने विंडोज़ खाते में लॉग इन करें (हाँ, आपको लॉग इन करने की आवश्यकता है)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.