私はSSH接続のためにリモートサーバーをポーリングし、利用可能なときに通知するために使用しているPythonプログラムが必要です。私は現在paramikoを使ってこれをやっています。失敗した場合は接続を試行し、成功または最大再試行まで待機して再試行します。これはうまくいきますが、ちょっと大変です。またparamikoは接続するかエラーを投げるように見えるので、これを行うために私が見ることができる唯一の方法は、悪い、悪い、悪いtry/exceptブロックです。方法は次のとおりです。SSHの可用性をテストするうまい方法
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
これよりも洗練されたソリューションが必要です。 Paramikoは私の選択したSSHライブラリですが、ここには何の示唆もありません。明確にするために
、私はコード実行の通常の流れを制御する手段として除いて試して/使用しないようにしたい - それは、そのような悪いホストキーなど、実際のエラーをキャッチするために使用されるべきで、無効なユーザーなど
「これを行うために私が見ることができる唯一の方法は、悪い、悪い、悪い」try/exceptブロックであったのです。なぜそれは悪いですか? –
あなたは間違いなく「例外」を捕まえることが悪いことは間違いありません。しかし、paramikoによって投げられた特定の例外をキャッチすることはまったく悪くありません。 –
実際、プログラムフローの手段として例外処理を使用すると、一般的に悪くなります。http://google-styleguide.googlecode.com/svn/trunk/pyguide.html#Exceptions – nightowl