Handling Paramiko SSHException - Server connection dropped - python

I am trying to copy files from remote server to my local directory.
I am using Python paramiko's sftp get to copy the files.
sftp.get(remote_pate, local_path)
After copying very few files, I get the following exception.
SSHException('Server connection dropped')
Establishing connection using,
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(host, username=username, password=password)
sftp = ssh.open_sftp()
Why does the connection get dropped? How can I handle this? Thanks in advance.

This would arise (as mentioned in the source, line no 667, http://www.lag.net/paramiko/docs/paramiko.sftp_client-pysrc.html) when there is any error reading the packet or when there is EOFError

Related

Getting TimeoutError [WinError 10060] while trying to connect to another system using Paramiko in Python

host = "<IP Address>"
port = 22
username = "<some random username>"
password = "<password>"
command = "ls"
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(host, port, username, password)
stdin, stdout, stderr = ssh. exec_command(command)
lines = stdout.readlines()
print(lines)
That was my code to just try and connect to another system using SSH in Python (Jupyter Notebook). But I always get this error message "TimeoutError: [WinError 10060] A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond".
My intention is to connect to another machine and extract some files from the machine (trying to create a data pipeline). But I'm unsure as to how to get past this error.

How to use Paramiko with host definition in ~/.ssh/config?

For my SSH connections, I use this ~/.ssh/config:
Host gwhost
Hostname gw.hostname.com
User user
IdentityFile /home/user/.ssh/priv_key
ControlMaster auto
ControlPath ~/.ssh/%h-%p-%r.sock
ControlPersist 120
Host *.my-example.com
User user
IdentityFile /home/user/.ssh/priv_key
StrictHostKeyChecking no
ProxyCommand ssh -q 'gwhost' -W %h:22
From the terminal I can connect to the host like this:
ssh one.my-example.com
I want to execute some commands on a remote host using Paramiko.
I tried to do it like this:
host = 'one.my-example.com'
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
user_config_file = os.path.expanduser("~/.ssh/config")
config = SSHConfig.from_path(user_config_file)
ssh.connect(hostname=host)
stdin, stdout, stderr = ssh.exec_command('ls')
lines = stdout.readlines()
print(lines)
After starting I got this error
in <lambda>
retry_on_signal(lambda: sock.connect(addr))
TimeoutError: [Errno 110] Connection timed out
So how can I use ~/.ssh/config or maybe I shouldn't ~/.ssh/config?
Paramiko has only very limited support for OpenSSH ssh_config configuration file.
If definitely won't use ssh_config automatically, as OpenSSH ssh does.
You would have to instantiate SSHConfig class using SSHConfig.from_path. And then use SSHConfig.lookup to lookup configuration for your hostname. And then use the returned dictionary to feed the arguments of SSHClient.connect.
Obligatory warning: Do not use AutoAddPolicy – You are losing a protection against MITM attacks by doing so. For a correct solution, see Paramiko "Unknown Server".

Paramiko SSH connection error: socket.gaierror: [Errno 8] nodename nor servname provided, or not known

I have some problems with Python and Paramiko. I want to connect to a SSH Server to automatically read some information from different systems.
I tried some Tips I found here but nothing works. I checked the hosts file, reinstall Python using brew, update/upgrade Python and Paramiko, used the ssh-server on my localhost to test. Also running pip to update paramiko and python.
I am very confused. Please let me ask you.
This is my working environment:
MacOS Sierra 10.12.6
Python 2.7
Eclipse
SSH Library: Paramiko (paramiko-2.2.1-py2.py3-none-any.whl)
The Script: Basic Paramiko SSH Connection
'''
Created on 16.09.2017
'''
import sys
import telnetlib
import paramiko
host = '213.000.000.123' #
user = "user"
password = "password"
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(host, user, password)
Running the Script on Eclipse results with this output:
Traceback (most recent call last):
File "/Users/tschaefer/Documents/workspace/PythonCMTSLibs/basicSSHSessionModule.py", line 17, in <module>
ssh.connect(host, user, password)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/paramiko/client.py", line 301, in connect
to_try = list(self._families_and_addresses(hostname, port))
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/paramiko/client.py", line 199, in _families_and_addresses
hostname, port, socket.AF_UNSPEC, socket.SOCK_STREAM)
socket.gaierror: [Errno 8] nodename nor servname provided, or not known
Ok, I find out gai=getaddrinfo, also getaddrbyname and so on. So I think there is a problem resolving the host-string to an IP Address. But it doesn't make sense resolving an IP Address to an IP Address. I used explicit IP.
Using the "ssh 213.000.000.123" command directly on CLI works fine.
I also tried to connect to "localhost" or "127.0.0.1" or "google.com" or other. The hosts-file-entry is not commented so it's active. Result: the same situation.
NSLOOKUP works correct, so the DNS Lookup works and a DNS server is available.
It seems Python could find the paramiko Library starting in Eclipse, but there is a problem in the Library.
Can anyone help me the see what my eye doesn't see.
Thank a lot!
Greetings
The error message is very misleading. It actually has nothing to do with DNS error.
Apparently the default port that paramiko uses is something other than 22. Once I specified a port, the problem goes away.
port = 22
k = paramiko.RSAKey.from_private_key_file(key_filename)
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
hostname = os.environ['DOCKER_EE_MANAGER_NODE']
username = os.environ['UCP_USER']
ssh.connect(hostname, port, username, pkey = k)
Works! Enjoy!
In the Paramiko documentation you can see that the second positional argument to connect is port
connect(hostname, port=22, username=None, password=None, pkey=None, key_filename=None, timeout=None, allow_agent=True, look_for_keys=True, compress=False, sock=None, gss_auth=False, gss_kex=False, gss_deleg_creds=True, gss_host=None, banner_timeout=None, auth_timeout=None, gss_trust_dns=True, passphrase=None, disabled_algorithms=None)
You are passing user as the second argument, but connect tries to interpret it as port causing the connection to fail. Here is how you can fix the call to connect using keyword arguments.
ssh.connect(host, username=user, password=password)

Using Paramiko to ssh into ftp servers in Python

I'm using the code below to ssh into the ftp servers:
ssh = paramiko.SSHClient()
ssh.connect(server, username=username, password=password)
ssh_stdin, ssh_stdout, ssh_stderr = ssh.exec_command("locate my_file.txt")
print ssh_stdout
However, I'm using multiple servers so I replace the server argument a lot. On the main ftp server I'm trying to connect to, I get this error:
socket.error: [Errno 60] Operation timed out
Whenever I try to use other servers though, I usually get this error:
paramiko.ssh_exception.S SHException:
Server 'ftp.server.org' not found in known_hosts
Does anyone know of any possible solutions to solve either one or both of these problems?
To fix your 2nd error, you can tell Paramiko to auto-add new servers:
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
Take a look at the docs.
For your second problem, you need to add the following line after ssh = paramiko.SSHClient():
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
This will allow paramiko to auto-accept unknown keys (and should allow you to SSH into those other servers)

Getting "socket.error: [Errno 61] Connection refused" python paramiko

Getting error connection refused error when trying to connect to the host to copy a local file to the host server. Don't have any issue connecting to the server remotely though.
host = "9.29.22.222"
username = "XXX"
password = "XXX"
local_path = "/Users/samuelhii/Desktop/file.txt"
remote_path = "C:\Program Files (x86)\file.txt"
s = paramiko.SSHClient()
s.set_missing_host_key_policy(paramiko.AutoAddPolicy())
s.connect(host,22,username,password)
sftp = s.open_sftp()
sftp.put(local_path,remote_path)
The connection was refused by the server. This can be caused by several reasons not related to Python programming:
a firewall
the SSH service is configure not to take requests from your IP
bad host ip
… (many more)
Check if you can use the normal SSH client to connect with this host/user/password combination.

Categories

Resources