मैं एक स्क्रिप्ट में, पृष्ठभूमि के रूप में OpenVPN कैसे चला सकता हूं?


22

मैं एक स्क्रिप्ट लिखना चाहता हूं जो openvpnपहले कॉल करे , उसके बाद ssh। कमांड टाइप करते समय

sudo openvpn ~/my_connection.ovpn

कमांड प्रॉम्प्ट में मुझे निम्न आउटपुट मिलता है:

...
Wed Jan  4 21:04:35 2017 do_ifconfig, tt->ipv6=0, tt->did_ifconfig_ipv6_setup=0
Wed Jan  4 21:04:35 2017 /sbin/ip link set dev tun0 up mtu 1500
Wed Jan  4 21:04:35 2017 /sbin/ip addr add dev tun0 local IP_FOO peer IP_FOO
Wed Jan  4 21:04:35 2017 Initialization Sequence Completed

यह आदेश अवरुद्ध है और शेल जारी नहीं किया गया है। बाद में एक ssh कनेक्शन शुरू करने के लिए, मुझे ओपनवैप प्रक्रिया को टाइपिंग Ctrl+ के Zबाद बैकग्राउंड में धकेलना होगा bg

हालाँकि, मैं सिर्फ अपने bash फ़ाइल को कॉल करके Openvpn कनेक्शन चरण और ssh को स्वचालित रूप से कॉल करना चाहूंगा। मैं इस फ़ाइल में Ctrl+ Zऔर bgचरणों का अनुकरण करने का प्रबंधन कैसे करूं ?

मैं एक संलग्न करने के लिए कोशिश की है &करने के लिए openvpnआदेश और जगह के लिए nohupइसे के सामने। न काम करता है।


इस तरह का प्रश्न कई बार पूछा गया है। यदि आपको अपनी स्क्रिप्ट पोस्ट करने के लिए वास्तव में मदद की आवश्यकता है।
पैंथर

sudo -bकमांड का उपयोग करने के लिए जो पृष्ठभूमि में इसका अनुसरण करता है
निक सिलिटो

1
मुझे लगता है कि यह वास्तव में उस प्रश्न का डुप्लिकेट नहीं है , जो शायद ही चल रहे पृष्ठभूमि कार्यक्रमों को मूल के रूप में शामिल करता है, और यह बिल्कुल भी नहीं है कि ओपनवीपीएन को ठीक से कैसे निर्धारित किया जाए।
एलियाह कगन El ’

फिर हमें शीर्षक को बदलने के लिए फिर से कहना चाहिए कि मैंने पृष्ठभूमि कार्यक्रम को रूट के रूप में चलाने की कोशिश की।
नल

@null मैंने अनुरोध के अनुसार शीर्षक को फिर से संपादित किया है। OpenVPN अक्सर रूट के रूप में चलाया जाता है स्थितियों में, जहां यह नहीं, है और, --daemonविकल्प अभी भी इस्तेमाल किया जा सकता है, लेकिन आप कर रहे हैं सही है कि रूट के रूप में इसे चलाने के बारे में हिस्सा है इस सवाल का केंद्रीय और इसके शीर्षक में परिलक्षित होना चाहिए । इस पर ध्यान दिलाने के लिए धन्यवाद!
एलियाह कगन

जवाबों:


35

टीएल; डीआर: का उपयोग करें sudo -bया, बेहतर ,।openvpn [...] --daemon

जब से आप चला रहे हैं openvpn(और, विशेष रूप से, जब से आप पृष्ठभूमि में रूट के रूप में एक प्रोग्राम चलाना चाहते हैं ), तो पृष्ठभूमि में कमांड चलाने के तरीके के बारे में सबसे अधिक जानकारी आपकी स्थिति को संबोधित नहीं करती है। तुमने कहा था:

मैंने cpenvpn कमांड में a & संलग्न करने की कोशिश की है और इसके सामने nohop रखने के लिए। दोनों काम नहीं करते।

आपकी आज्ञा है:

sudo openvpn ~/my_connection.ovpn

sudoडिफ़ॉल्ट कॉन्फ़िगरेशन के तहत , यदि आपने हाल ही sudoमें उसी संदर्भ के लिए अपना पासवर्ड दर्ज नहीं किया है (इंटरैक्टिव उपयोग के लिए, आमतौर पर इसका मतलब वही टर्मिनल है) तो यह आपके पासवर्ड के लिए पूछेगा। लेकिन अगर आप कमांड को बैकग्राउंड में चलाते हैं, &तो आपको लाइन नहीं दिखाई जाएगी या इसे टाइप करने का अवसर नहीं दिया जाएगा।[sudo] password for user:

तो इस स्थिति में, कमांड चलाना, अपना पासवर्ड दर्ज करना, और बाद में बैकग्राउंड में भेजना यह एक उचित तरीका है, इंटरैक्टिव उपयोग के लिए

लेकिन यह एकमात्र तरीका नहीं है और जैसा कि आप कहते हैं, आप एक स्क्रिप्ट में ऐसा नहीं करना चाहेंगे ।

रास्ता 1: सुनिश्चित करें कि sudoएक ताजा टाइमस्टैम्प है।

आप यह सुनिश्चित कर सकते हैं कि sudoवर्तमान टाइमस्टैम्प जब आपके कमांड को चलाने के लिए प्रयोग किया जाता है, तो पहले चलाकर:

sudo -v

उसके बाद, आप चला सकते हैं:

sudo openvpn ~/my_connection.ovpn &

हालाँकि, जब आप बैकग्राउंड में कमांड चलाना चाहते हैं तो आमतौर पर &(और nohup) पूरी तरह से बचना बेहतर होता है sudo। यह विशेष रूप से स्क्रिप्टिंग के मामले में है।

रास्ता 2: उपयोग करें sudo -bसामान्य तौर पर, यह आमतौर पर आप क्या चाहते हैं।

इसके बजाय, आप sudoस्वयं को अग्रभूमि में चला सकते हैं , लेकिन -bध्वज को पास कर सकते हैं , जिससे sudoपृष्ठभूमि में कमांड को चलाया जा सकता है।

sudo -b openvpn ~/my_connection.ovpn

यह आमतौर पर एक बेहतर तरीका है, खासकर यदि आप एक स्क्रिप्ट में कमांड डाल रहे हैं। साथ sudo -bआप नहीं मिलता है काम पर नियंत्रण है, लेकिन एक खोल स्क्रिप्ट काम पर नियंत्रण में डिफ़ॉल्ट रूप से अक्षम है और आप आम तौर पर यह प्रयोग नहीं करना चाहिए

जैसा कि man sudoबताते हैं:

     -b, --background
                 Run the given command in the background.  Note that it is not
                 possible to use shell job control to manipulate background
                 processes started by sudo.  Most interactive commands will
                 fail to work properly in background mode.

यह काम करता है क्योंकि पृष्ठभूमि में कुछ भी नहीं चल रहा है जब तक कि सूडो ने आपके पासवर्ड (यदि आवश्यक हो) को हटा दिया है और निर्धारित किया है कि आपको कमांड चलाने की अनुमति है।

रास्ता 3: लेकिन इसके लिए openvpn, आपको शायद इसे बस चलाना चाहिए --daemon

openvpnयदि आप इसे --daemonविकल्प के साथ चलाते हैं, तो पृष्ठभूमि में स्वचालित रूप से चलेगा :

sudo openvpn ~/my_connection.ovpn --daemon

पहले के बजाय --daemonआपके .opvnफ़ाइल नाम के बाद पास ; निम्नलिखित तर्क --daemon, यदि कोई हो, के नाम के रूप में व्याख्या की जाती है जिसे डीमॉनेटाइज़्ड openvpnप्रक्रिया का उपयोग करना चाहिए। ( अपेंड भी करें &।)

यह उचित है या नहीं यह इस बात पर निर्भर करता है कि openvpnचलने के बाद कोई बातचीत होनी चाहिए या नहीं, लेकिन इससे पहले कि यह निष्क्रिय हो जाए। और जो निर्भर करता है, भाग में, जो स्थापित किया गया है उस पर ~/my_connection.ovpn। लेकिन अगर openvpnतुरंत अवमानना ​​नहीं कर सकता है, तो तुरंत पृष्ठभूमि में इसे चलाने के अन्य सभी तरीके टूट जाएंगे, भी

इसलिए, किसी भी स्थिति जहाँ आप जानते हैं आप चाहते हैं openvpnकरने के लिए शुरू पृष्ठभूमि में चल रहा है, और आप जानते हैं कि आप इसे अग्रभूमि में वापस लाना चाहते हैं नहीं होगा, तो आप दृढ़ता से साथ यह लागू करने की विधि पर विचार करना चाहिए --daemonविकल्प। यह विशिष्ट है - openvpnअंतिम कार्यक्रम एक --daemonविकल्प का समर्थन नहीं करते हैं , हालांकि कई सर्वर कार्यक्रमों में कुछ ऐसे विकल्प होते हैं। (नाम और वाक्य-विन्यास अलग-अलग होते हैं, हालांकि)

इस विकल्प का उपयोग करने या न करने का निर्णय लेने के लिए (और आप इसे कैसे उपयोग करना चाहते हैं), मैं आपको मैनुअल पेज को पढ़ने कीopenvpn सलाह देता हूं , विशेष रूप से अनुभाग में --daemon। इसकी बहुत सारी उपयोगी जानकारी है, और मैं केवल पहले पैराग्राफ को यहाँ उद्धृत कर रहा हूँ:

       --daemon [progname]
              Become  a  daemon  after  all   initialization   functions   are
              completed.   This option will cause all message and error output
              to be sent to  the  syslog  file  (such  as  /var/log/messages),
              except  for  the  output of scripts and ifconfig commands, which
              will go to /dev/null unless otherwise  redirected.   The  syslog
              redirection  occurs  immediately  at  the point that --daemon is
              parsed on the command line even though the  daemonization  point
              occurs  later.   If one of the --log options is present, it will
              supercede syslog redirection.

              The optional progname parameter [...]

तरीका 4 : कभी-कभी पूरी स्क्रिप्ट को रूट के रूप में चलाना उचित है।

यदि आपके पास एक स्क्रिप्ट है जो कई क्रियाओं को जड़ के रूप में करती है, तो इसकी कोई महत्वपूर्ण गतिविधि नहीं है, जो यथोचित रूप से रूट के रूप में नहीं चलेगी , और स्क्रिप्ट को गैर-रूट उपयोगकर्ता के रूप में चलाने के लिए उपयोगी कुछ भी नहीं है, फिर स्क्रिप्ट के उपयोगकर्ता को संभवतः इसे रूट के रूप में चलाना चाहिए।

यदि यह मामला है, तो आपको sudoस्क्रिप्ट में कमांड से हटा देना चाहिए । जब स्क्रिप्ट रूट के रूप में चलती है, तो इसकी कोई आवश्यकता नहीं है sudo। (हालांकि जड़ उपयोगकर्ता कर सकते हैं, डिफ़ॉल्ट रूप से, किसी भी उपयोगकर्ता के रूप में किसी भी आदेश के साथ ही सहित चलाने sudoऔर ऐसा करने के लिए एक पासवर्ड की जरूरत नहीं है। तो अगर आप कर की छुट्टी उदाहरणों sudoलिपि में तो यह होगा शायद अभी भी काम करते हैं।)

यदि आपके पास sudoस्क्रिप्ट में कोई उदाहरण है जो वास्तव में रूट (के साथ ) के बजाय कुछ अन्य उपयोगकर्ता के रूप में कमांड चलाने के लिए उपयोग किया जाता है , तो आपको अभी भी उन उदाहरणों को रखना चाहिए ।-u user

यदि पूरी स्क्रिप्ट को रूट के रूप में चलाया जा रहा है, तो पृष्ठभूमि में चलने वाले कमांड बनाने के अधिकांश विशिष्ट तरीके लागू होते हैं, जिसमें &आवश्यकता होती है, और जहां आवश्यक हो, nohup(जिसके बारे में आप पहले से जानते हैं) का उपयोग करें। हालांकि, इसके लिए, आपको अभी भी विकल्प के openvpnसाथ दृढ़ता से विचार करना चाहिए --daemon


एक अजीब व्यापक और विचारशील जवाब। बहुत बढ़िया।
gwideman

2

TL; DR इसे डेमन मोड में चलाएँ:openvpn --config Windscribe-Japan.ovpn --daemon

कॉन्फ़िगरेशन (.ovpn) फ़ाइलनाम को पास करने के लिए openvpnकमांड केवल तभी काम करता है जब कोई अन्य विकल्प निर्दिष्ट नहीं किया जाता है। यदि मैं --daemonविकल्प निर्दिष्ट करता हूं, तो Openvpn फ़ाइल नाम को विकल्प पैरामीटर के रूप में पार्स करने की कोशिश करता है और विकल्प त्रुटि को फेंकता है : मैं "Windscribe.ovpn" को एक गोद लेने के पैरामीटर के रूप में पार्स करने की कोशिश कर रहा हूं, लेकिन मुझे एक अग्रणी नहीं दिख रहा है - ''

उत्तर:

इससे बचने के लिए, फ़ाइल नाम को --configविकल्प के साथ निर्दिष्ट करना होगा । उदाहरण के लिए, openvpn --config Windscribe.ovpn --daemon। फिर tail -f /var/log/syslogआगे के निरीक्षण के लिए, के साथ सिसलॉग को पूंछें ।

curl ifconfig.coवीपीएन कनेक्ट है यह सुनिश्चित करने के लिए आप इस कर्ल कमांड के आउटपुट से पहले और बाद में भी देख सकते हैं ।

नोट: यह SSH सत्र से लॉगआउट करने के बाद भी डेमन को चालू रखेगा।


0

आप बस अपनी कॉपी कर सकते हैं

.conf फ़ाइल में / etc / openvpn /

फिर आपके लिए सभी डीमॉनेटाइज़िंग और सुडोल को संभालने के लिए 'सर्विस ओपनवीप @ कन्फेम स्टार्ट' से पूछें।

Https://unix.stackexchange.com/a/366680/198666 देखें

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