2016-05-11 1 views
3

IP、ユーザー名、およびパスワードを取得し、そのサーバーへのSFTP接続を返すメソッドを記述したいと思います。ここでparamikoを使用して、私が持っているコードです:paramiko: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 

私はPythonシェルで直接このコードを実行した場合、それが正常に動作します:

>>> 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 

をしかし、私は機能にそれを置くと、関数を呼び出すとき関数が戻ってきたときに私は考えることができる

>>> 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にローカルに格納されている、01:、SFTP接続が切断戻ってきますがガベージコレクトされ、接続が終了するため、SFTPClientがまだ存在する間に、基礎となる接続は現在停止しています。

その場合、どうすれば解決できますか?そうでない場合は、実際に何が起こっていますか?

編集sftp, sshを返すように関数を変更しましたが、接続は開いたままです。だから、ガーベッジコレクターが原因です。これは2つの値を返さずに解決できますか?

+0

あなたはGCが犯人である疑いがある場合、帰国 'SSH、sftp'を試してみて、それが生きていることを続けている場合参照してください。 – user590028

答えて

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() 
+0

これは実際に2つの値を返さずに達成できますか? – ewok

+0

はい、しかし、関数の外でsftp接続を開く必要があります... ssh = open_sftp_connection(ip、user、passwd) sftp = ssh.open_sftp() – Craneum

+0

このようにip、ユーザーとパスワードを取得し、開いているsftp接続のみを返すのは不可能ですか? – ewok

関連する問題