स्क्रिप्ट में टाइमआउट के साथ ssh कैसे करें?


173

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

यह कैसे करना है पर कोई विचार?



यदि आप केवल "अपने sshसत्र में अधिक समय रहने के लिए " यहां पुनर्निर्देशित करते हैं (प्रश्न "एसएसएच कनेक्शन समय-सीमा कैसे बढ़ाएं?"), यह गलत जगह है । उत्तर इस कड़ी में ssh-timeout के बारे में है
पीटर क्रूस

जवाबों:


288
ssh -o ConnectTimeout=10  <hostName>

जहां 10 सेकंड में समय है। यह टाइमआउट केवल कनेक्शन के निर्माण पर लागू होता है।


4
कनेक्ट टाइमआउट केवल कनेक्शन सेटअप पर एक टाइमआउट सेट करता है, है ना?
औरेलियन ओम्स

10
यह वास्तव में "रिमोट होस्ट को चलाने के लिए एक अनंत समय ले रहा है" के लिए काम नहीं करता है: "ssh -o ConnectTimeout = 5 होस्ट 'स्लीप 10'" 10 सेकंड के लिए इंतजार कर रहा है, न कि 5.
फेरी बेंडर

109

का उपयोग करें -o ConnectTimeoutऔर -o BatchMode=yes -o StrictHostKeyChecking=no

ConnectTimeout स्क्रिप्ट को लटकाए रखता है , बैचमैड इसे होस्ट अनजान के साथ लटकाए रखता है , ज्ञात_हो में जोड़ने के लिए YES, और StrictHostKeyChecking फिंगरप्रिंट को स्वचालित रूप से जोड़ता है।

**** नोट **** "StrictHostKeyChecking" केवल आंतरिक नेटवर्क के लिए अभिप्रेत था जहां आप मेजबान पर भरोसा करते हैं। SSH क्लाइंट के संस्करण के आधार पर, "क्या आप सुनिश्चित हैं कि आप अपना फिंगरप्रिंट जोड़ना चाहते हैं" ग्राहक को अनिश्चित काल के लिए लटका सकता है (मुख्य रूप से AIX पर चलने वाले पुराने संस्करण)। अधिकांश आधुनिक संस्करण इस समस्या से ग्रस्त नहीं हैं। यदि आपको कई मेजबानों के साथ उंगलियों के निशान से निपटना है, तो मैं कुछ प्रकार के कॉन्फ़िगरेशन प्रबंधन उपकरण जैसे कठपुतली / ansible / शेफ / नमक / आदि के साथ ज्ञात_होस्ट फ़ाइल को बनाए रखने की सलाह देता हूं।


11
न केवल -o StrictHostKeyChecking=noप्रश्न को संबोधित करता है , लेकिन अगर आप सुरक्षा के बारे में परवाह करते हैं, तो यह एक भयानक विचार है, यही कारण हो सकता है कि आप पहले स्थान पर एसएसएच का उपयोग कर रहे हों।
डॉल्फ

9
-O StrictHostKeyChecking = no के संभावित सुरक्षा निहितार्थों को इंगित करना अच्छा है। हालांकि, यह स्क्रिप्ट को निष्पादन के दौरान लटकने से रोक देगा।
डग

2
चेतावनी !!!! जैसा कि @ डॉल्फ ने लिखा है, StrictHostKeyChecking=noअगर आप सुरक्षा का ध्यान रखते हैं तो इसका इस्तेमाल न करें । @ डग: स्क्रिप्ट नहीं लटकेगी - यह केवल इस बात पर जोर देगा कि आप दूरस्थ होस्ट को पहली बार मैन्युअल रूप से भेजते हैं, इसलिए यह होस्ट को पता चलता है। लेकिन यह MITM हमलों के खिलाफ आपकी रक्षा करेगा। कृपया इसे दर्शाने के लिए इस उत्तर को संपादित करें क्योंकि यह एक बहुत ही खतरनाक सलाह है क्योंकि यह खड़ा है। और यह भी नहीं पूछा गया था।
जॉन्डोडो

2
मेरे उत्तर को अपडेट किया। मेरे अनुभव से, यह कुछ ग्राहकों को लटका सकता है।
डग

50

इसे इस्तेमाल करे:

timeout 5 ssh user@ip

टाइमआउट ssh कमांड निष्पादित करता है (args के साथ) और SIGTERM भेजता है यदि ssh 5 सेकंड के बाद वापस नहीं आता है। टाइमआउट के बारे में अधिक जानकारी के लिए, इस दस्तावेज़ को पढ़ें 7 http://man7.org/linux/man-pages/man1/timeout.html.html

या आप ssh के परम का उपयोग कर सकते हैं:

ssh -o ConnectTimeout=3 user@ip

4
यदि आप मैक पर इस कमांड को देख रहे हैं, brew install coreutilsतो कोशिश करें और फिर उपयोग करें gtimeout (स्रोत: stackoverflow.com/questions/3504945/timeout-command-on-mac-os-x )।
लार्कर

3
यह वह नहीं कर सकता जो आप चाहते हैं। कमांड पर विचार करें timeout 3s ssh user@server 'sleep 5; echo blarg >> /tmp/blarg' यह SSH क्लाइंट साइड पर प्रक्रिया को मारता है, लेकिन / tmp / blarg अभी भी रिमोट सर्वर पर संशोधित हो जाता है। इसका मतलब है कि यदि आप रिमोट सर्वर पर एक भगोड़ा सीपीयू-गहन कार्य चला रहे हैं, तो आप प्रक्रियाओं को लीक कर देंगे।
जेमी डेविस

1
@JamieDavis ssh यूजर के बारे में @ सर्वर 'टाइमआउट 5 एस स्लीप 10'?
फिलिप

18

आप ध्वज के साथ भी जुड़ सकते हैं

-o ServerAliveInterval = <secs>
इसलिए SSH क्लाइंट प्रत्येक <secs>सेकंड में सर्वर को एक शून्य पैकेट भेजेगा , बस कनेक्शन को जीवित रखने के लिए। लिनक्स में यह विश्व स्तर पर /etc/ssh/ssh_configया प्रति-उपयोगकर्ता में भी सेट किया जा सकता है ~/.ssh/config


4
यह सवाल क्या अनुरोध के विपरीत लगता है।
डबरन क्यूब्रिक

1

यदि अन्य सभी विफल होते हैं ( timeoutकमांड नहीं होने पर ) इस शेल स्क्रिप्ट में अवधारणा काम करेगी:

 #!/bin/bash
 set -u
 ssh $1 "sleep 10 ; uptime" > /tmp/outputfile 2>&1 & PIDssh=$!
 Count=0
 while test $Count -lt 5 && ps -p $PIDssh > /dev/null
 do
    echo -n .
    sleep 1
    Count=$((Count+1))
 done
 echo ""

 if ps -p $PIDssh > /dev/null
 then
    echo "ssh still running, killing it"
    kill -HUP $PIDssh
 else
    echo "Exited"
 fi

0

खैर, आप 'नॉन-ब्लॉकिंग मोड' पर जो कुछ भी चला रहे हैं, उसे चलाने के लिए आप नोह का उपयोग कर सकते हैं। तो आप बस जाँच कर सकते हैं कि जो कुछ भी इसे चलाने, दौड़ने, अन्यथा बाहर निकलने के लिए चाहिए था।

nohup ./my-script-that-may-take-long-to-finish.sh &
./check-if-previous-script-ran-or-exit.sh
इको "स्क्रिप्ट 15 फरवरी, 2011, 9:20 पूर्वाह्न"> /tmp/done.txt पर समाप्त हुई

तो दूसरे में आप सिर्फ जाँच करें कि क्या फ़ाइल मौजूद है।


समझ में आता है। लेकिन, जो स्क्रिप्ट चल रही है, वह मुझे कुछ आउटपुट देती है, जो कंसोल पर प्रदर्शित होती है .. कैसे जांचें कि मेरी पिछली स्क्रिप्ट चली या बाहर निकली? $? या फिर कुछ और ?
user57421

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