【发布时间】: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