【问题标题】:Python piramiko, Connection Timed Out Error While Establishing SSH ConnectionPython piramiko,建立SSH连接时连接超时错误
【发布时间】:2017-04-10 23:05:07
【问题描述】:

我正在使用 Python 开发一个项目,该项目将创建一个 Amazon ec2 实例,并建立 SSH 和 SFTP 连接 以传输文件以及我的机器和 ec2 实例之间的命令。

于是我开始编写代码,我编写了使用 boto3 库创建 ec2 实例的函数。

# creating a file named sefa.pem that will store the private key
outfile = open('sefa.pem', 'w')
keypair = ec2.meta.client.create_key_pair(KeyName='sefakeypair')  # creates key pair
keyout= str(keypair['KeyMaterial'])  # reads the key material
outfile.write(keyout)  # writes the key material in sefa.pem

# creates the instance finally
response = ec2.create_instances(ImageId='ami-34913254', MinCount=1, MaxCount=1, InstanceType='t2.micro')

之后,我应该在我的机器和 ec2 实例之间建立一个 SSH 连接来发送命令,我还应该在我的机器和 ec2 实例之间传输和带回文件。

经过研究,我发现有一个名为 piramiko 的 Python 库用于在我的计算机和 ec2 实例之间建立 SSH 连接和 SFTP 连接

我尝试在我的计算机和 ec2 实例之间建立 SSH 连接,但我已经面对 “[Errrno 110]Connection Timed Out Error” 一天了。我已经在互联网上搜索了几个小时,但找不到任何有用的东西。 这是出现“连接超时错误”的代码:

    con = paramiko.SSHClient()  # ssh client using paramiko library
    con.set_missing_host_key_policy(paramiko.AutoAddPolicy())  # this is needed because of adding policy automautically
    k = paramiko.RSAKey.from_private_key_file("sefa.pem")  # k reads sefa.pem and stores private key
    time.sleep(30)  # added this because ec2 should do 2/2 checks  before connecting
    print("connecting")
    con.connect(hostname=PUB_DNS, username="ubuntu", pkey=k, look_for_keys=True)  # HERE IS THE ERROR, I CAN'T CONNECT
    print("connected")
    stdin, stdout, stderr = con.exec_command('echo "TEST"')
    print(stdout.readlines())
    con.close()

如果不在我的机器和 ec2 实例之间建立连接,我将无法继续前进。

  • 您对解决这个问题有什么建议吗?
  • 是否有任何替代 piramiko 的库?

【问题讨论】:

  • 乍一看,我有两个想法。一个是您的time.sleep() 可能是罪魁祸首,导致 ssh 会话超时,因为它似乎阻止了连接,并且您尝试连接的服务器可能会在那时断开连接。另一个想法是:您是否尝试过手动运行命令,它们成功了吗?您的connect() 呼叫可能无效。
  • 我使用了time.sleep(),因为 ssh 连接需要等到 ec2 实例的状态正在运行并检查 2/2。而且我也无法手动连接到 ec2 实例,ssh 给出了相同的连接超时错误。
  • 没有更好的检测方法吗?为什么不尝试连接而不睡眠,如果连接失败,则睡眠一段时间。 x 秒后重试连接并重复,直到连接成功。 30 秒似乎相当随意。
  • 这里的问题是我无法连接到ec2实例,这不是因为睡眠,因为当我尝试使用ssh -i /filepath/sefa.pem ubuntu@public_dns连接到实例时,它出现了相同的连接超时错误。当然除了 sleep 之外还有其他更方便的方式,但是我会在建立 ssh 连接后介绍。
  • 如果你在使用基本的 shell 命令连接时遇到错误,这不是 paramiko 库的错。我对 ec2 不熟悉,所以我建议通过亚马逊的支持找出连接超时的原因。最后一种可能性:ssh 守护进程是否在 ec2 实例上运行?

标签: python linux amazon-web-services amazon-ec2 boto3


【解决方案1】:

我设法解决了这个问题。问题是我的 ec2 实例。这些解决了这个问题:

  • 确保该实例的安全组具有 ssh 守护程序并允许您连接。
  • 确保您拥有在创建实例时创建的密钥对。
  • 确保执行chmod 400 keypair.pem

【讨论】:

  • 很高兴听到您想通了! +1 调试技能
  • 在我的情况下,我有 pem 文件,我可以从终端进行 ssh 但不使用 paramiko,知道谁是罪魁祸首吗?
【解决方案2】:

我遇到了同样的错误,我是这样解决的:-

  1. 在您的客户端虚拟机上安装 openssh-client,在您的服务器虚拟机上安装 openssh-server

  2. 不要执行 ssh@ip address 因为这会让你登录到你的主机 vm 然后你的客户端和服务器上的 IP 将是相同的,这是错误的主要原因.

3.改为使用

ssh-keyscan ip_address >> ~/.ssh/known_hosts

所以知道主机密钥在已知主机中,原始 IP 仍然存在。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-24
    • 2011-07-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多