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つの値を返さずに解決できますか?
あなたはGCが犯人である疑いがある場合、帰国 'SSH、sftp'を試してみて、それが生きていることを続けている場合参照してください。 – user590028