python - 测试 SSH 可用性的优雅方式

标签 python ssh paramiko

我需要一个 Python 程序来轮询远程服务器的 SSH 连接并在它可用时发出通知。我目前正在使用 paramiko 进行此操作;尝试连接,如果失败,请等待并重试,直到成功或最大重试次数。这可行,但有点笨拙。 paramiko 似乎也连接或抛出错误,所以我能看到这样做的唯一方法是使用 try/except block ,这是坏的,坏的,坏的。方法如下:

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 作为控制代码执行的正常流程的手段 - 它应该用于捕获实际错误,例如错误的主机 key 、无效的用户等。

最佳答案

正如 frb 的评论中提到的,try ... except block 是测试特定服务可用性的好方法。不过,您不应该使用“包罗万象”的 except block ,而应将其限制在服务不可用时发生的特定异常。

根据文档,paramiko.SSHClient.connect可能会抛出不同的异常,具体取决于连接时发生的问题。如果你想捕获所有这些,你的 try ... except block 将如下所示:

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 之后的元组中。

关于python - 测试 SSH 可用性的优雅方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14236346/

相关文章:

python - 从先前终止的连接到数据库提交 SQLite 中的现有日志文件

python - 如何在 mac os x 10.7.2 Lion 上安装 PIL

使用 SSH 或 FTP 压缩远程目录的 Pythonic 方法

python - 使用 Fabric v2/paramiko 传输大文件时遇到困难

python - 使用 Python 的 Paramiko exec_command 使用 PowerShell Start-Process 启动的进程无法正常工作,尽管它在 SSH 终端上工作正常

python - 使用树莓派,Pi相机,Python和Open Cv进行人脸识别

python - uwsgi 使用什么 __name__ 字符串?

linux - bash 变量扩展通过管道传输到 ssh

python - 通过 ssh 使用 tkinter 没有显示名称和没有 $DISPLAY 环境变量

python - 如何在 Python Paramiko 中启动没有终端仿真的 shell?