Am o mașină A.
Din el, pot SSH la mașina B.
Mașina B poate FTP la mașina C.
Vreau să descarc fișiere din C, pe A.
Nu am acces direct de la A la C.
Portul 20 și 21
âââââ âââââ Control FTP ââââââ âââââââââââââ
â â SSH â ââââââââââââ†ââââºâ â
â A ââââââºâ B â â C - cu fișiere â
â â â ââââââââââââ†ââââºâ vreau â
âââââ âââââ Date FTP â â
Porturi aleatorii âââââââââââââââââââââââââ âââ
Știu că există un milion de întrebări pe acest site despre SFTP.
Din cate pot sa spun, acesta nu este același lucru cu SFTP.
Cu SFTP se pare că serverul SSH trebuie să fie același server care are fișierele de descărcat, ceea ce nu este problema aici.
Este corect? Sau există vreo modalitate de a face acest lucru cu o simplă comandă SFTP și câteva argumente suplimentare?
Există modalități ușoare de a face acest lucru?
Fișierele sunt mari, iar discul și memoria de pe B sunt mici, așa că, dacă este posibil, aș dori să transmit datele direct. (Comparativ cu descărcarea FTP în doi pași pe discul lui B.)
În general, SSH poate tunel orice. Dar se pare că FTP folosește mai mult decât porturile 20 și 21. Folosește o grămadă de porturi aleatorii și imprevizibile, altele noi pentru fiecare operațiune de fișier. Gama posibilă a unor astfel de porturi FTP este atât de mare încât, cu un client pe care l-am încercat, nu am reușit să port-forward întreaga gamă cu SSH.
(Rețineți că încerc pasiv FTP, unde toate conexiunile de rețea sunt inițiate de la client-server. Spre deosebire de activ FTP unde C ar iniția o conexiune înapoi la B, ceea ce nu este posibil din cauza unui NAT între ei.)
Am încercat să scriu un script în python, piratand împreună Bibliotecă standard FTP și o terță parte Biblioteca tunel SSH. Este o soluție destul de complicată și neplăcută, care are ca rezultat deschiderea unui nou port pentru fiecare fișier nou, dar niciodată să nu-l închid. De asemenea, o actualizare recentă la o bibliotecă a rupt unele dependențe, așa că acum scriptul nu funcționează cu cea mai recentă versiune a acestor biblioteci. Sunt tentat să rescriu soluția cu subiacentul Paramiko bibliotecă. Dar mă tem că este o groapă adâncă. Chestiile astea sunt cu adevărat neplăcute. (Anunțați-mă dacă trebuie să vedeți încercarea mea. Încerc să o omit pentru a evita problema X/Y.)
Există o modalitate mai simplă de a face acest tunel?
Aș prefera o soluție cu Python, dar în acest moment sunt suficient de disperat să folosesc orice instrument.