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.