SFTP using ftplib - python

I need to download a file from a host using SFTP.
Do you know if is it possible to do that using Python ftplib?
I saw an example here, but when I try to connect I receive EOFError.
I tried this code:
import ftplib
ftp = ftplib.FTP()
ftp.connect( "1.2.3.4", "22" )
This method returns with an error after long time so I cannot perform a call to login.
I cannot try the constructor FTP([host[, user[, passwd[, acct[, timeout]]]]]) because
my port is 22 but ftplib default is 21.
If I follow the example
ftp = ftplib.FTP("1.2.3.4")
ftp = ftplib.FTP("1.2.3.4","22")
I receive a connection refused so I cannot enter any username password. Can you help me? Thank you very much

As the question you linked to states, ftplib doesn't support SFTP (which is a transfer protocol over SSH and has nothing to do with FTPS, FTP over SSL). Use the recommended Paramiko instead.

Related

connecting to a FTP server using ftplib with a proxy in Python

i am getting really confused on how to connect to an ftp server while using a proxy in python. Some previous examples have confused me a lot as i am new to Python. Below are the variables i believe that will be needed in the code sample (the proxy is only a example for security reasons as is the username and password).
can someone please show me how to connect to the ftp server and download a file
the end goal is to use python to download files from this ftp server
import ftplib
proxy = {'http': "auth-proxy.xxxx.com:232", 'https': "auth-proxy.xxx.com:232"}
ftp_site = 'https://data.ftse.com'
username = 'xxxxxx'
password = 'yyyyyy'
#file path where the file is on the ftp server is below
filepath = 'https://data.ftse.com/filedownloadservlet?filename=eerf1808.csv&phyName=nXVi8I4q5Boy8gBpdpDg3jNBqfAZy0vfydRBHC3zs3qt6YadMA6xa9LM3QaIgx-g'

Connecting to port 21 with Paramiko and got paramiko.ssh_exception.SSHException: Error reading SSH protocol banner

I'm trying to connect to am SFTP server through Paramiko. I don't have a host key. The following code is my attempt and it's giving me an error that says:
paramiko.ssh_exception.SSHException: Error reading SSH protocol banner
I notice that port is usually 22 in other given examples, but the SFTP port I was given is 21. And when I tried 22, it gave me another error saying
Unable to connect to port 22
Thank you in advance for your guidance and insight. Please let me know if I could provide more information.
from paramiko.client import SSHClient
from paramiko import AutoAddPolicy
client = SSHClient()
client.set_missing_host_key_policy(AutoAddPolicy())
client.connect(hostname="a_private_ip",
port=21,
username="user",
password="xxx")
sftp_handle = client.open_sftp()
Paramiko is an SFTP client. The SFTP uses port 22.
If you were given port 21, then it's most likely NOT SFTP. The port 21 is used by FTP. Encrypted variant of FTP, called also FTPS, uses 21 too. And people sometimes mistake it for SFTP.
For FTP use FTP class from ftplib. For FTPS use FTP_TLS class from ftplib.

FTP connection working on FileZilla and command line but not python ftplib

I have an ftp server deployed on aws. I can connect to it from FileZilla as well as from the command line. However, the python script I have gives me:
OSError: [Errno 101] Network is unreachable
I know that my script works since I can connect to other servers.
def test_connection():
server = ftplib.FTP()
server.connect('xx.xxx.xxx.xx')
server.login('xxxx', 'xxx')
print(server.dir())
server.quit()
if __name__ == "__main__":
test_connection()
Any clues what this could be ?
Many thanks :)
You may want to restructure your code so that credentials are initialized in the FTP constructor call.
import ftplib
server= ftplib.FTP('server.address.com','USERNAME','PASSWORD')
print(server.dir())
session.quit()
Use ftplib.FTP_TLS instead if you FTP host requires TLS.
What worked in the end:
I changed the vsftpd config:
listen=YES
listen_ipv6=NO
Not exactly sure though what the problem is

Python - ftplib.FTP_TLS Port

Can someone help me confirm the default port when using ftplib.FTP_TLS? We have opened port 990 and 21 but my script fails to connect.
import ftplib
session = ftplib.FTP_TLS('xxx.ftp.com','user','password')
file = open('Bkup.tar.gz','rb')
session.storbinary('STOR Bkup.tar.gz', file)
file.close()
session.quit()
Thank You!
You could try:
ftplib.FTP_TLS.port = 21
According to it's own documentation, as well as the spec, FTPS (or FTP over TLS) connects to port 21.
You appear to be missing a login clause to authenticate the session.
Try calling session.login() followed by session.prot_p() before attempting to store the binary.
This documentation can be found by using the help function or in the online documentation here.
I hope that helps.
Please don't modify the port directly. If you get a closer look at FTP_TLS super __init__ you can clearly see that if it's called with a host param connect gets automatically called with just the host as param so the port defaults to FTP_PORT which is 21.
A better approach would be to call FTP_TLS without any params and then manually call the connect method where you can specify host as well as port.
from ftplib import FTP_TLS
client = FTP_TLS()
client.connect(host="ftp.example.com", port=12121)
Oddly, the FTP_TLS object has no direct port parameter on the constructor like the FTP object does.
you can set the port prior to calling the constructor and that works.
ftplib.FTP_TLS.port=1234
ftplib.FTP_TLS( 'ftphost.domain.tld', 'user', 'password' )

Python module ftplib FTP_TLS - Error 530

I'm using Python 2.7 on ubuntu 11.10 distribution.
I have a problem with ftplib module and FTP_TLS connection.
On my ftp server there is vsftp
When try a connection I receive this error:
ftplib.error_perm: 530 Please login with USER and PASS.
This is my code:
from ftplib import FTP_TLS
ftp = FTP_TLS( '192.168.1.5' )
ftp.login( 'user' , 'password')
ftp.close()
Anyway if I use the simple FTP connection, ftp = FTP('192.168.1.5') , it works!
But I need FTP_TLS connection. I tried also to insert param ftp.auth() and ftp.prot_p() but nothing happens.
The FTP_TLS class doesn't seem to handle logins very well right now. Unfortunately, you have to explicitly send those commands to the server yourself.
from ftplib import FTP_TLS
# Do *not* specify the user and password in the FTP_TLS constructor arguments.
# Doing so will cause ftplib to try to login, resulting in the 530 error.
ftp = FTP_TLS('ftp.somewhere.com')
ftp.sendcmd('USER myusername') # '331 Please specify the password.'
ftp.sendcmd('PASS mypassword') # '230 Login successful.'
Try TLS Lite or M2Crypto both are FTP/TLS client and server.

Categories