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).
Odpowiedzi:
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.
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.
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.
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.
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.
źródło
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:
curl
używa.ssh/known_hosts
pliku 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 curlaby to naprawić, możesz dodać inne typy kluczy do znanego pliku hosts, używając następującego polecenia:
lub możesz wyłączyć weryfikację klucza za pomocą
-k
flagi (nie poleciłbym tego)źródło
output-stream-generating-command | ssh user@remotehost 'input-stream-accepting-command'
jest opcją, jeśli zdalny użytkownik ma prawidłową powłokę.źródło
this
zamiast tego”. - uderza mnie to jako jeden z tych czasów.S
ecure, 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 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:
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.
źródło