2013-01-09 18 views
11

मुझे एक पायथन प्रोग्राम की आवश्यकता है जिसका उपयोग मैं एसएसएच कनेक्टिविटी के लिए रिमोट सर्वर को मतदान करने के लिए कर रहा हूं और यह उपलब्ध होने पर सूचित करता है। मैं वर्तमान में paramiko का उपयोग कर ऐसा कर रहा हूँ; कनेक्ट करने का प्रयास करें, अगर विफलता, सफलता या अधिकतम रिट्री तक प्रतीक्षा करें और पुनः प्रयास करें। यह काम करता है, लेकिन यह थोड़ा उलझन में है। इसके अलावा paramiko या तो एक त्रुटि को जोड़ने या फेंकने लगता है, इसलिए एकमात्र तरीका यह है कि मैं ऐसा करने के लिए देख सकता था एक कोशिश/ब्लॉक को छोड़कर, बुरा, बुरा, बुरा। यहां विधि है:एसएसएच उपलब्धता का परीक्षण करने के लिए सुरुचिपूर्ण तरीका

def check_ssh(self, ip, user, key_file, initial_wait=0, interval=0, retries=1): 
    ssh = paramiko.SSHClient() 
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 

    sleep(initial_wait) 

    for x in range(retries): 
     try: 
      ssh.connect(ip, username=user, key_filename=key_file) 
      return True 
     except Exception, e: 
      print e 
      sleep(interval) 
    return False 

इससे कहीं अधिक सुरुचिपूर्ण समाधान होना चाहिए। परमिको मेरी एसएसएच लाइब्रेरी पसंद है लेकिन यहां किसी भी सुझाव के लिए खुला हूं।

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

+7

'ऐसा करने का एकमात्र तरीका मैं कोशिश कर रहा था/ब्लॉक को छोड़कर बुरा, बुरा, बुरा' बुरा क्यों है? –

+9

आप निश्चित रूप से सही हैं कि 'अपवाद' को पकड़ना बुरा है। हालांकि, paramiko द्वारा फेंक दिया विशिष्ट अपवाद पकड़ना बुरा नहीं है। –

+0

वास्तव में, लेकिन कार्यक्रम प्रवाह के साधन के रूप में अपवाद हैंडलिंग का उपयोग करना आम तौर पर खराब है: http://google-styleguide.googlecode.com/svn/trunk/pyguide.html#Exceptions – nightowl

उत्तर

12

के रूप में के रूप में वास्तविक त्रुटियों को पकड़ने के लिए इस्तेमाल किया जाना चाहिए एफबीबी द्वारा टिप्पणी में उल्लिखित, try ... except ब्लॉक एक विशिष्ट सेवा की उपलब्धता का परीक्षण करने के लिए एक अच्छा तरीका है। हालांकि आपको "कैच-ऑल" except ब्लॉक का उपयोग नहीं करना चाहिए, लेकिन सेवा अनुपलब्ध होने पर होने वाले विशिष्ट अपवादों तक सीमित रहें।

प्रलेखन के अनुसार, paramiko.SSHClient.connect कनेक्ट होने के दौरान हुई समस्या के आधार पर विभिन्न अपवादों को फेंक सकता है। आप उन सभी को पकड़ने के लिए चाहते हैं, अपने try ... except ब्लॉक इस प्रकार दिखाई देगा:

try: 
    ssh.connect(ip, username=user, key_filename=key_file) 
    return True 
except (BadHostKeyException, AuthenticationException, 
     SSHException, socket.error) as e: 
    print e 
    sleep(interval) 

, तो बस इन अपवादों में से एक सबसेट अपने मामले के लिए प्रासंगिक है, except के बाद टपल में केवल उन डाल दिया।

+0

मेरे लक्स कोड पर उचित बिंदु केवल एक सामान्य अपवाद निर्दिष्ट करने के लिए: पी मुझे एक आवश्यकता है कोशिश करें/पकड़ें मुझे खराब मेजबान कुंजी जैसी चीजों के लिए लगता है क्योंकि ये वास्तविक त्रुटियां हैं "सर्वर अभी तक नहीं है" - बिंदु यह है कि मैं इंतजार नहीं करना चाहता/ब्लॉक को प्रतीक्षा लूप को नियंत्रित करने के लिए (यानी सामान्य प्रवाह कोड का)। – nightowl

संबंधित मुद्दे