Paramiko SFTPClient socket closes after returning from function

Viewed 341

I'm trying to establish SFTP connection via Paramiko. This code returns a content of the remote directory:

#!/usr/bin/python2.7

import socket
import socks
import paramiko

sftp = {
    "proxy_host": "172.16.40.22",
    "proxy_port": 3128,
    "host": "172.16.40.21",
    "port": 22,
    "user": "user",
    "pass": "password",
}

proxy = paramiko.ProxyCommand("nc --proxy %s %s %d" % (sftp["proxy_host"], sftp["host"], sftp["port"]))

client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect(sock=proxy, hostname=sftp["host"], port=sftp["port"], username=sftp["user"], password=sftp["pass"])

sftp = paramiko.SFTPClient.from_transport(client.get_transport())

print(sftp.listdir())

If I wrap connection establishment into function, I get a Socket is closed error:

#!/usr/bin/python2.7

import socket
import socks
import paramiko

sftp = {
    "proxy_host": "172.16.40.22",
    "proxy_port": 3128,
    "host": "172.16.40.21",
    "port": 22,
    "user": "user",
    "pass": "password",
}

def connect_sftp():
  proxy = paramiko.ProxyCommand("nc --proxy %s %s %d" % (sftp["proxy_host"], sftp["host"], sftp["port"]))

  client = paramiko.SSHClient()
  client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
  client.connect(sock=proxy, hostname=sftp["host"], port=sftp["port"], username=sftp["user"], password=sftp["pass"])

  return paramiko.SFTPClient.from_transport(client.get_transport())

sftp = connect_sftp()
print(sftp.listdir())

Error:

Traceback (most recent call last):
  File "./sftp.py", line 26, in <module>
    print(sftp.listdir())
  File "/usr/lib/python2.7/site-packages/paramiko/sftp_client.py", line 172, in listdir
    return [f.filename for f in self.listdir_attr(path)]
  File "/usr/lib/python2.7/site-packages/paramiko/sftp_client.py", line 193, in listdir_attr
    t, msg = self._request(CMD_OPENDIR, path)
  File "/usr/lib/python2.7/site-packages/paramiko/sftp_client.py", line 729, in _request
    num = self._async_request(type(None), t, *arg)
  File "/usr/lib/python2.7/site-packages/paramiko/sftp_client.py", line 754, in _async_request
    self._send_packet(t, msg)
  File "/usr/lib/python2.7/site-packages/paramiko/sftp.py", line 170, in _send_packet
    self._write_all(out)
  File "/usr/lib/python2.7/site-packages/paramiko/sftp.py", line 133, in _write_all
    n = self.sock.send(out)
  File "/usr/lib/python2.7/site-packages/paramiko/channel.py", line 767, in send
    return self._send(s, m)
  File "/usr/lib/python2.7/site-packages/paramiko/channel.py", line 1133, in _send
    raise socket.error('Socket is closed')
socket.error: Socket is closed

At the same time this code works correctly on another Linux machine with the same Python version.

Please help to find the problem cause. Thanks in advance.

0 Answers
Related