Python piramiko,建立SSH连接时连接超时错误
我正在用Python开发一个项目,该项目将创建一个Amazon ec2实例,并建立一个SSH和SFTP连接,以便在我的机器和ec2实例之间传输文件和命令 所以我开始编码,我编码了使用boto3库创建ec2实例的函数 在那之后,我应该在我的机器和ec2实例之间建立一个SSH连接来发送命令,并且我还应该在我的机器和ec2实例之间传输和带回文件 经过研究,我发现有一个名为piramiko的Python库,用于在我的计算机和ec2实例之间建立SSH连接和SFTP连接 我试图在我的计算机和ec2实例之间建立SSH连接,但一天来我一直面临着“[Errrno 110]连接超时错误”。我在互联网上搜索了几个小时,但找不到任何有用的东西。 下面是出现“连接超时错误”的代码: 如果不在我的机器和ec2实例之间建立连接,我就不能再进一步了。Python piramiko,建立SSH连接时连接超时错误,python,linux,amazon-web-services,amazon-ec2,boto3,Python,Linux,Amazon Web Services,Amazon Ec2,Boto3,我正在用Python开发一个项目,该项目将创建一个Amazon ec2实例,并建立一个SSH和SFTP连接,以便在我的机器和ec2实例之间传输文件和命令 所以我开始编码,我编码了使用boto3库创建ec2实例的函数 在那之后,我应该在我的机器和ec2实例之间建立一个SSH连接来发送命令,并且我还应该在我的机器和ec2实例之间传输和带回文件 经过研究,我发现有一个名为piramiko的Python库,用于在我的计算机和ec2实例之间建立SSH连接和SFTP连接 我试图在我的计算机和ec2实例之间建
- 您对解决这个问题有什么建议吗?
- 皮拉米科还有其他图书馆吗?
- 确保实例的安全组具有ssh deamon并允许您连接
- 确保您拥有在创建实例时创建的密钥对
- 确保执行
chmod 400 keypair.pem
- 确保实例的安全组具有ssh deamon并允许您连接
- 确保您拥有在创建实例时创建的密钥对
- 确保执行
chmod 400 keypair.pem
- 在客户端VM上安装openssh客户端,在服务器VM上安装openssh服务器
- 不要执行ssh@ip地址由于这将使您登录到主机vm,然后客户端和服务器上的IP都将相同,这是导致错误的主要原因 3.改用 ssh密钥扫描ip_地址>>~/.ssh/known_主机
- 在客户端VM上安装openssh客户端,在服务器VM上安装openssh服务器
- 不要执行ssh@ip地址由于这将使您登录到主机vm,然后客户端和服务器上的IP都将相同,这是导致错误的主要原因 3.改用 ssh密钥扫描ip_地址>>~/.ssh/known_主机
- 我设法解决了这个问题。问题是我的ec2实例。这些措施解决了问题:
- 我设法解决了这个问题。问题是我的ec2实例。这些措施解决了问题:
因此,已知主机密钥位于已知主机中,原始IP保留。我遇到了相同的错误,下面是我如何解决它的:-
所以知道主机密钥在已知主机中,原始IP保留。乍一看,我有两个想法。一个是您的
time.sleep()
可能是罪魁祸首,它导致ssh会话超时,因为它似乎会阻止连接,并且您尝试连接的服务器可能会在该点之前断开连接。另一个想法是:您是否尝试过手动运行这些命令,它们是否成功?您的connect()
调用可能无效。我使用了time.sleep()
,因为ssh连接需要等待ec2实例的状态正在运行并检查了2/2。而且我也不能手动连接到ec2实例,ssh会给出相同的连接超时错误。难道没有更好的方法来检测吗?为什么不尝试在没有睡眠的情况下连接呢?如果连接失败,那么就睡眠一段时间。在x秒后重试连接,并重复,直到成功连接。30秒似乎相当随意。这里的问题是我无法连接到ec2实例,这不是因为睡眠,因为当我尝试使用ssh-I/filepath/sefa.pem连接到实例时ubuntu@public_dns出现了相同的连接超时错误。当然,除了睡眠之外,还有其他更方便的方法,但我将在建立ssh连接后介绍这一点。如果使用基本shell命令连接时出现错误,那不是paramiko库的错误。我不熟悉ec2,所以我建议通过亚马逊的支持来找出连接超时的原因。最后一种可能性:ssh守护进程是否在ec2实例上运行?乍一看,我有两个想法。一个是您的time.sleep()
可能是罪魁祸首,它导致ssh会话超时,因为它似乎会阻止连接,并且您尝试连接的服务器可能会在该点之前断开连接。另一个想法是:您是否尝试过手动运行这些命令,它们是否成功?您的connect()
调用可能无效。我使用了time.sleep()
,因为ssh连接需要等待ec2实例的状态正在运行并检查了2/2。而且我也不能手动连接到ec2实例,ssh会给出相同的连接超时错误。难道没有更好的方法来检测吗?为什么不尝试在没有睡眠的情况下连接呢?如果连接失败,那么就睡眠一段时间。在x秒后重试连接,并重复,直到成功连接。30秒似乎相当随意。这里的问题是我无法连接到ec2实例,这不是因为睡眠,因为当我尝试使用ssh-I/filepath/sefa.pem连接到实例时ubuntu@public_dns出现了相同的连接超时错误。当然还有比睡眠更方便的方法,但我会在建立ssh连接后介绍
# 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')
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()