我想编写一个获取IP,用户名和密码的方法,并返回到该服务器的开放SFTP连接。这是我的代码,使用paramiko
:
def open_sftp_connection(ip, user, passwd):
ssh = SSHClient()
ssh.load_system_host_keys()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(ip, 22, user, passwd)
assert ssh.get_transport().is_active(), 'Failed to connect to server'
sftp = ssh.open_sftp()
return sftp
如果我直接在python shell中执行此代码,它可以正常工作:
>>> ssh = SSHClient()
>>> ssh.load_system_host_keys()
>>> ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
>>> ssh.connect(ip, 22, user, passwd)
>>> assert ssh.get_transport().is_active(), 'Failed to connect to server'
>>> sftp = ssh.open_sftp()
>>> print sftp.get_channel().get_transport().is_active()
True
但是当我把它放在一个函数中并调用该函数时,sftp连接就会断开连接:
>>> def open_sftp_connection(ip, user, passwd):
... ssh = SSHClient()
... ssh.load_system_host_keys()
... ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
... ssh.connect(ip, 22, user, passwd)
... assert ssh.get_transport().is_active(), 'Failed to connect to server'
... sftp = ssh.open_sftp()
... return sftp
...
>>> sftp = open_sftp_connection(ip, user, passwd)
>>> print sftp.get_channel().get_transport().is_active()
False
我唯一能想到的是ssh连接存储在ssh
本地,然后当函数返回时,ssh
被垃圾收集,连接终止,所以SFTPClient
1}}仍然存在,底层连接现在已经死了。
如果是这样,我该如何解决?如果没有,实际发生了什么?
编辑:我修改了函数以返回sftp, ssh
,现在连接保持打开状态。因此,垃圾收集器是罪魁祸首。可以在不返回两个值的情况下解决这个问题吗?
答案 0 :(得分:2)
您需要访问ssh和sftp实例。
def open_sftp_connection(ip, user, passwd):
ssh = SSHClient()
ssh.load_system_host_keys()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(ip, 22, user, passwd)
assert ssh.get_transport().is_active(), 'Failed to connect to server'
return ssh, ssh.open_sftp()
ssh, sftp = open_sftp_connection(ip, user, passwd)
print sftp.get_channel().get_transport().is_active()