jak potokować dane do połączenia sftp?


9

ftp obsługuje put "|..." "remote-file.name"polecenie przesyłania danych do połączenia ftp. Czy jest coś podobnego do sftp?

W sftp pojawia się następujący błąd:

sftp 'jmw@backupsrv:/uploads'
sftp> put "| tar -cx /storage" "backup-2012-06-19--17-51.tgz"
stat | tar -cv /storage: No such file or directory

jak powyżej, klient sftp oczywiście nie wykonuje polecenia.

Chcę użyć polecenia potoku, aby bezpośrednio przekierować strumień plików do sftp. (ponieważ nie ma wystarczającej ilości miejsca, aby utworzyć plik kopii zapasowej na tym samym dysku przed przesłaniem go na serwer sftp).


1
Myślałem o użyciu do tego FIFO, ale ani SFTP, ani SCP nie będą czytać z FIFO.
Tom Anderson

1
również dobry pomysł, to jest moje: qxs.ch/2012/07/05/sftp-upload-tool
JMW

Odpowiedzi:


4

Miałem dużo zabawy, szukając rozwiązania tego problemu. Wymaga narzędzia nc (netcat) na obu komputerach i SSH (SFTP nie jest potrzebne).

W tym przykładzie wywołam maszynę, która ma dane, dla której należy wykonać kopię zapasową linux-a, i maszynę, która musi otrzymać kopię zapasową linux-b.

Na linux-a, niech netcat nasłuchuje na porcie (wziąłem 2000) i przekierowuje go do pliku. To po prostu usiądzie i zaczeka, aż coś przejdzie przez ten port.

[kenny@linux-b /var/backups]$ nc -l 2000 > backup.tgz

Na linux-b otwórz tunel ssh na linux-a, ponownie użyłem portu 2000. Spowoduje to przekierowanie wszystkiego, co rzucisz na port 2000 TCP na localhost do portu TCP 2000 na Linux-a, gdzie nasłuchuje netcat.

[kenny@linux-a /var/data]$ ssh -L 2000:localhost:2000 -CfN linux-b

Teraz utwórz archiwum tar, ale wyślij dane wyjściowe na standardowe wyjście (używając -) i potokuj je do gzip w celu uzyskania kompresji. Teraz potokuj to do innego netcata, który wysyła go do hosta lokalnego w TCP na porcie 2000.

[kenny@linux-a /var/data]$ tar cf - important-data | gzip -fc | nc localhost 2000

Skończyliśmy! Na linux-b netcat nie nasłuchuje i tworzony jest nowy plik. Najlepsze jest to, że archiwum tar nigdy nie było umieszczane na twardym dysku Linux-a.

[kenny@linux-b /var/backups]$ file backup.tgz 
backup.tgz: gzip compressed data, from Unix, last modified: Thu Jul  5 13:48:03 2012

Wiem, że nie jest to dokładnie to, o co prosiłeś w pytaniu, ale jeśli masz dostępny netcat, jest to realne rozwiązanie dla twojego rodzaju problemu.

Edycja: Zapomniałem o jednej rzeczy: jeśli zastosujesz się do tych instrukcji, nadal będziesz mieć tunel SSH unoszący się na Linuksie. Dowiedz się, jaki jest identyfikator procesu i zabij go.

[kenny@linux-a /var/data]$ ps -ef | grep "ssh -L"
kenny     5741     1  0 13:40 ?        00:00:00 ssh -L 2000:localhost:2000 -CfN linux-b
kenny     5940  3360  0 14:13 pts/1    00:00:00 grep --color=auto ssh -L
[kenny@linux-a /var/data]$ kill 5741

3
podoba mi się, ale są 2 problemy: użytkownicy sftponly zwykle nie mogą korzystać z przekierowania portów, a użytkownicy sftponly nie mogą uzyskać dostępu do nc na serwerze sftp (pamiętaj, że nie mają dostępu ssh)
JMW

1
To całkowicie uzasadniona krytyka.
Kenny Rasschaert

Nie na temat, ale dlaczego w tym poście znajduje się zrzut ekranu „Prestiżu”?
Rilindo,

4

Ponieważ jest to pierwszy wynik znaleziony przez Google w przypadku tego pytania i o którym jeszcze nie wspomniano, dodam również rozwiązanie, które znalazłem tutaj:

możesz do tego użyć implementacji curls sftp. Ponieważ curl jest już prawdopodobnie zainstalowany na wielu systemach, może to być lepsze niż rozwiązanie z wykorzystaniem niestandardowych klientów.

przykładowe użycie:

pg_dump -d database | pigz -1 | curl -u username -T - sftp://sftpserver/folder/dbbackup.sql.gz

curlużywa .ssh/known_hostspliku do weryfikacji klucza. Może się to nie powieść, jeśli Twój klient ssh używa nowszych standardów szyfrowania nieobsługiwanych przez bibliotekę używaną w curl

aby to naprawić, możesz dodać inne typy kluczy do znanego pliku hosts, używając następującego polecenia:

ssh-keyscan sftpserver >> ~/.ssh/known_hosts

lub możesz wyłączyć weryfikację klucza za pomocą -kflagi (nie poleciłbym tego)


2

output-stream-generating-command | ssh user@remotehost 'input-stream-accepting-command' jest opcją, jeśli zdalny użytkownik ma prawidłową powłokę.


5
To NIE jest sftp!
jirib

3
@JiriXichtkniha Nie, nie jest, jednak SFTP jest prawie zawsze implementowane jako podsystem twojego serwera SSH i jest to najbliższy odpowiednik funkcjonalności, o której widzę, że jestem proszony o pytanie (dane potokowe przez SFTP są obsługiwane przez program na drugim końcu). Czasami odpowiedź brzmi: „Używasz niewłaściwego narzędzia - rób thiszamiast tego”. - uderza mnie to jako jeden z tych czasów.
voretaq7

2
sftp to protol i różni się od zwykłego sipowania przez ssh, to wszystko! Twoja sugestia nie zadziała, jeśli zdalna część będzie tylko SFTP.
jirib

1
nie mogę się zalogować jako użytkownik ssh
JMW

1
@JMW w tym przypadku, o ile wiem, że jesteś tutaj całkiem spieprzony - nigdy nie widziałem wersji sftp, która obsługuje przesyłanie potoków do polecenia w systemie zdalnym (prawdopodobnie dlatego, że pozwoliłby to pokonać Secure, wpuszczając kogoś do środka) twoja sytuacja, która i tak nie ma programów uruchamianych przez powłokę). Mogę się jednak mylić - w większości znam funkcjonalność SFTP w OpenSSH i zastrzeżony serwer SSH, który Sun użył do wysyłki ...
voretaq7

1

voretaq7 wskazał, że klient sftp nie obsługuje przesyłania danych w potoku dla użytkowników, którzy mogą używać sftp tylko do łączenia się z serwerem.

na szczęście istnieje libssh2, który obsługuje sftp. więc potrzebujemy tylko 2 innych klientów korzystających z libssh2, które nazwałem:

  • sftp_stdin_upload (aby przesłać na serwer sftp)
  • sftp_stdout_download (do pobrania z serwera sftp)

kod źródłowy można znaleźć pod następującym adresem URL: http://www.qxs.ch/2012/07/05/sftp-upload-tool/


ponieważ nie mam doświadczenia w programowaniu libssh2, cieszę się z wszelkich opinii na temat kodu źródłowego.


Nie działa dla mnie :-( / usr / bin / ld: libssh2-1.4.2 / src / .libs / libssh2.a (knownhost.o): niezdefiniowane odniesienie do symbolu „EVP_sha1” / usr / lib / libcrypto. so.1.0.0: błąd podczas dodawania symboli: brak DSO w wierszu poleceń collect2: błąd: ld zwrócił 1 status wyjścia
tobixen

Ten kod ma tylko status POC. Możesz to naprawić samodzielnie. :-)
JMW
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.