कैसे एक ऑटो सुरंग को रोकने / मारने के लिए?


17

अब जब मेरे पास एक ऑटो सुरंग है, तो इसे रोकने का सही तरीका क्या है?

ऐसा करने का कोई आसान तरीका नहीं है। इस भाग पर दस्तावेज़ीकरण स्पष्ट नहीं है।

मशीन को रिबूट करने का आसान तरीका लगता है? क्या ये सही है?

जवाबों:


21

नहीं, मारने autosshका उचित तरीका केवल प्रक्रिया को मारना है autossh, और कुछ नहीं।

कारण यह है की

# file $(which autossh)
/usr/bin/autossh: POSIX shell script, ASCII text executable

कि autosshबस एक खोल स्क्रिप्ट, नहीं एक है सेवा । यह एक नया कार्यक्रम शुरू करता है, इसकी अंतिम पंक्ति में,

exec /usr/lib/autossh/autossh "$@"

फिर से सेवा नहीं। जैसा कि exec(आप बैश हैकर्स की विकी में इसे डबल-चेक कर सकते हैं ), यह एक शेल-बिल्टिन कमांड है, जो /usr/lib/autossh/autossh "$@"नई प्रक्रिया शुरू किए बिना वर्तमान कमांड ( इस मामले में) के साथ वर्तमान शेल को बदल देता है। इसलिए, रोकने का एकमात्र तरीका autosshउदाहरण के लिए, कॉलिंग स्क्रिप्ट को मारना है

pkill -3 autossh

( -3 ध्वज का उपयोग करने के महत्व को इंगित करने के लिए डीवीलोज़ेन का धन्यवाद , नीचे देखें)। संयोग से, कनेक्शन को मारने से काम नहीं चलेगा, क्योंकि कॉलिंग कमांड ( यानी , ऊपर वाला) बस एक नया कनेक्शन शुरू करेगा जैसे ही यह पता चलता है कि पुराने को हटा दिया गया है। ssh


1
वास्तव में आपको -9 के बिना ऑटोस को मारना चाहिए। यदि सुरंग के माध्यम से एक कनेक्शन पहले से ही बनाया गया है, तो इसे संभालने के लिए एक बच्चे के sshd प्रक्रिया को जन्म दिया होगा। -9 के साथ माता-पिता के ऑटो को मारना sshd प्रक्रिया को पीछे छोड़ देगा। सुरंग तब भी काम करेगी जब तक sshd प्रक्रिया समय से बाहर नहीं हो जाती। यदि आप किल पर डिफ़ॉल्ट सिग्नल (-3) का उपयोग करते हैं तो यह इनायत से बंद हो जाएगा और इसके साथ स्पॉन्स्ड sshd प्रक्रिया को ले जाएगा।
डीवीलोज़ेन

हाय -3 के रूप में डिफॉल्ट किल सिग्नल है, आपको वास्तव में -3 ​​पास करने की आवश्यकता नहीं है, आप इसे छोड़ सकते हैं
एन्ड्रेस अल्केराज़

@ AndrésAlcarraz क्या आप वाकई इसके बारे में निश्चित हैं? SIGTERMडिफ़ॉल्ट है, और वह एक है 15SIGQUITहै 3, को देखने के superuser.com/questions/352147/what-does-kill-3-mean और en.wikipedia.org/wiki/Kill_(command) - इसके अलावा, Fwiw, मैं बस की जाँच की और -15इसे बंद नीचे नहीं करता है, इसलिए SIGTERMउपयोग नहीं किया जा सकता है।
डेनियल एफ

और pkillबिना किसी सिग्नल (= default) के उपयोग से भी समाप्ति नहीं होती है autossh
डैनियल एफ

@DanielF तुम सही हो, मैं उलझन में था "डिफ़ॉल्ट संकेत (-3)" dvijoen टिप्पणी से
Andrés Alcarraz

5

के साथ ऑटो ssh चलाएं:

AUTOSSH_PIDFILE=/var/run/tunnel.pid autossh

इसे मार डालो:

kill pid

BTW

pkill -9 autossh गलत है

-9सुनिश्चित करें कि प्रक्रिया इनायत से बाहर नहीं निकल रही है, इसलिए प्रक्रिया की मौत sshहोने पर भी autosshप्रक्रिया जारी है

बिना -9अभी भी खराब है, अगर आपके पास कई सुरंगें चल रही हैं, pkillतो उन सभी को मार देगा

सही तरीका यह है कि केवल AUTOSSH_PIDFILEएनवी var सेट करना हैkill


सुपर उपयोगकर्ता में आपका स्वागत है। ऐसा प्रतीत होता है कि आपका अंतिम पैराग्राफ आपका वास्तविक उत्तर है, जबकि आपका शेष प्रश्न किसी अन्य उत्तर पर टिप्पणी है । इस साइट की प्रकृति और प्रकृति को देखते हुए, यह आपके उत्तर में पर्याप्त विवरण जोड़ने में मदद करेगा ताकि यह अपने आप खड़ा हो सके। योगदान के लिए धन्यवाद और दौरे की जांच करना न भूलें ।
मैं कहता हूं कि मोनिका

4

प्रक्रिया के लिए खोजें:

ps aux | grep ssh

Secon कॉलम Pnnumber है

पीआईडी ​​द्वारा मार डालो प्रक्रिया :)

किल -9 पिडनंबर

यदि आपके पास रूट विशेषाधिकार नहीं हैं तो sudo का उपयोग करें ।


1

मुझे पता है कि यह उत्तर दिया गया है, लेकिन उपरोक्त टिप्पणियों के विपरीत, pkill -3 autosshमेरे लिए sshd चाइल्ड प्रक्रियाओं को नहीं मारता है।

मैं अपनी .bashrcफ़ाइल में इस फ़ंक्शन का उपयोग करता हूं ।
मूल रूप से, यह --killआटोश में एक तर्क जोड़ने जैसा है।

  if [ "$1" = "--kill" ]; then
    ps aux | 
    grep -P "(/usr/bin/ssh|/usr/lib/autossh/autossh)\s.*$2" |
    awk '{print $2}' |
    xargs -r kill
  else
    $(which autossh) "$@"
    echo "" # prevents line wrapping when you kill the ssh process
  fi

आप चला सकते हैं which sshऔर which autosshअपने सिस्टम पर रास्तों की जाँच करने के।

जब तक पहला तर्क नहीं है --kill, तब तक यह ऑटो के साथ आर्ग्स को पार करता है।

यह स्क्रिप्ट ऑटोश और ssh उदाहरणों को मारती है। यह महत्वपूर्ण है यदि आप पोर्ट फ़ॉरवर्डिंग का उपयोग कर रहे हैं क्योंकि, केवल ऑटोसोश उदाहरण को मारने से सुरंग को नहीं मारता है, यह सिर्फ इसे फिर से कनेक्ट करने से रोकता है अगर / जब यह अंत में डिस्कनेक्ट करता है।

आप केवल विशिष्ट सुरंगों को मारने के लिए खोज शब्द (होस्ट नाम) भी निर्दिष्ट कर सकते हैं।

autossh --kill dbserver1dbserver1 करने के लिए सिर्फ कनेक्शन को मारता है
autossh --kill dbserverdbserver1, dbserver2, आदि मार डालेगा
autossh --kill dbserverमार डालेगा सभी autossh कनेक्शन

स्पष्ट करने के लिए, यह ऑटोह द्वारा शुरू किए गए केवल SSH सत्रों को मारता है।

यदि आप ps aux | grep sshऑटोसोश और ssh सत्र चलाते हुए चलते हैं, तो आप देखेंगे कि autossh द्वारा शुरू किए गए पूर्ण पथ (/ usr / bin / ssh और / usr / lib / autossh / autossh) का उपयोग करते हैं।
यह स्क्रिप्ट केवल speicifc पथ के साथ आरंभ की गई प्रक्रियाओं से मेल खाती है। मैंने ऐसा इसलिए किया क्योंकि मैं (और मैं ज्यादातर लोगों को मानता हूं) आमतौर पर sshपूर्ण पथ टाइप करते हैं, न कि मेरे सामान्य सत्रों को मारने से।

आशा है कि यह दूसरों की मदद करेगा।


$(which autossh)बस के बजाय के लिए कोई विशेष कारण autossh?
MestreLion
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.