Skocz do zawartości
borzole

[Python] Połączenie Sftp Zwraca "Eoferror"

Rekomendowane odpowiedzi

Mam na fedorce odpalony server ssh

z wpisem w ssh_config

"Subsystem sftp /usr/libexec/openssh/sftp-server"

i z WinSCP (odpalony na M$ Windows) moge dostac sie do niego uzywajac zarówno "file protocol" SCP jak i SFTP.

Czy ktos jest w stanie wyjasnic co to tak naprawde oznacza w tym WinSCP, skoro odpowiada za to ta sama usluga na fedorce?

Pytam sie, bo w zaden sposób nie moge dostac sie do zasobów z poziomu skryptu pytona (odpalony na tej samej maszynie co winscp) uzywajac modulu ftplib.

Ale ten sam skrypt bez problem laczy sie z FTP (freesshd.com) na W7 lub SFTP na HP-UX.

 

from ftplib import FTP

ftp = FTP()
ftp.set_debuglevel(2)
ftp.connect('192.168.1.12','2222')
ftp.login('lucas','1234')
print
ftp.getwelcome()
print ftp.pwd()
print
print ftp.dir()
print ftp.retrlines('LIST')
ftp.quit()

odpowiedz:

*get* 'SSH-2.0-OpenSSH_5.5\r\n'

tu nastepuje zawieszenie na ~1minute potem reszta

*get* ''
Traceback (most recent call last):
 File "ftpium.py", line 48, in <module>
ftp = getFtp(True)
 File "ftpium.py", line 13, in getFtp
ftp.connect('192.168.1.12','2222')
 File "C:\usr\share\Python27\lib\ftplib.py", line 135, in connect
self.welcome = self.getresp()
 File "C:\usr\share\Python27\lib\ftplib.py", line 210, in getresp
resp = self.getmultiline()
 File "C:\usr\share\Python27\lib\ftplib.py", line 200, in getmultiline
nextline = self.getline()
 File "C:\usr\share\Python27\lib\ftplib.py", line 186, in getline
if not line: raise EOFError
EOFError

 

to wyglada tak, jakby nie uzyskal odpowiedzi i stad zwraca blad "koniec pliku/nadawania"

Dokladnie to samo sie dzieje, gdy uruchomie skrypt lokalnie na fedorce

 

*get* 'SSH-2.0-OpenSSH_5.5\r\n'
*get* ''
Traceback (most recent call last):
 File "silnik.py", line 12, in <module>
ftp.connect('127.0.0.1','2222')
 File "/usr/lib/python2.7/ftplib.py", line 135, in connect
self.welcome = self.getresp()
 File "/usr/lib/python2.7/ftplib.py", line 210, in getresp
resp = self.getmultiline()
 File "/usr/lib/python2.7/ftplib.py", line 200, in getmultiline
nextline = self.getline()
 File "/usr/lib/python2.7/ftplib.py", line 186, in getline
if not line: raise EOFError
EOFError

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Jakieś różnice istnieją na pewno, to nie przypadek iż w smartfonach można znaleźć aplikacje właśnie do komunikacji SSH a nie FTP

Powypisuję różnice, które mi przyjdą na myśl, zapewne są oczywiste ale może coś Cię natchnie

 

- Port (FTP 21 ;; SSH 22)

- Szyfrowanie (FTP z tego co pamiętam nie używa kluczy ;; SSH używa kluczy RSA bodajże jako odcisk czy coś)

- Podtrzymywanie połączenia (przy FTP nie słyszałem o czymś takim ;; w SSH możliwe jest podtrzymywanie połączenia w przypadku bezczynności)

- Logowanie (FTP umożliwia per anonymous ;; SSH chyba nie pozwala na zabawę anonymousem, musi być login i hasło konkretne)

- Wykonywanie poleceń (FTP pozwoli tylko na polecenia FTP'kowe ;; SSH pozwala na niemalże pełną zdalną kontrolę "ofiarą" ;])

- Podsłuch (FTP idzie podsłuchać ;; SSH już nie tak łatwo podsłuchać przy odpowiednich zabezpieczeniach)

 

Jeszcze tutaj jest jakaś rozpiska protokołów, może coś więcej jeszcze rozjaśni

http://zagrodzki.net/~sebek/security.html

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Modułem ftplib na pewno się nie dostaniesz, bo to nie ten protokół (jak zauwazył wyżej Subaru, są różnice między ftp i sftp).

Do połaczeń ssh i sftp w pythonie, możesz wykorzystać paramiko. Jest też w repo, jako python-paramiko. W dokumentacji jest przykład z sftp, /usr/share/doc/python-paramiko-*/demos/demo_sftp.py.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Najwyraźniej w pracy mam postawiony obok siebie FTP i SFTP z tym samym userem i hasłem co wiele wyjaśnia.

Prawdę mówiąc logika była mniej więcej taka:

- w pracy:

- WinSCP przez SFTP - OK

- zróbmy skrypt z użyciem ftplib - OK

wniosek: ftplib działa z SFTP :)

- w domu:

- WinSCP przez SFTP - OK

- ftplib - ERROR

wniosek: wtf ?

 

Natomiast mylące pozostaje, dlaczego wysyłane jest:

*get* 'SSH-2.0-OpenSSH_5.5\r\n'

co automatycznie sugeruje SSH.

 

Dobra dzięki,

potrzebowałem potrenować użycie ftplib więc postawię ftp.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się

×