Pamiętaj, że nie mogę najpierw zapisać pliku lokalnie - jest za duży.
Ta (nieznośna) strona (przewiń do samego dołu) wydaje się dawać odpowiedź, ale mam problem z rozplątywaniem części specyficznej dla napędów taśmowych:
Aby to bardziej konkretne, oto jak można by pomyśleć, że może pracować:
Na komputerze lokalnym:
% echo "pretend this string is a huge amt of data" | scp - remote.com:big.txt
(Wykorzystuje to konwencję - której scp w rzeczywistości nie obsługuje - zastępując myślnik plikiem źródłowym, aby zamiast tego pobierał go ze standardowego wejścia).
Odpowiedzi:
Możesz wykonać potok do ssh i uruchomić zdalne polecenie. W takim przypadku zdalne polecenie
cat > big.txt
kopiuje standardowe wejście dobig.txt
pliku.Jest to łatwe i proste, o ile można użyć ssh do połączenia się ze zdalnym końcem.
Możesz także użyć
nc
(NetCat) do przesłania danych. Na komputerze odbierającym (np. Host.example.com):Spowoduje to skonfigurowanie
nc
nasłuchiwania portu 1234 i skopiowanie wszystkiego, co zostanie wysłane do tego portu, dobig.txt
pliku. Następnie na urządzeniu wysyłającym:To polecenie powie
nc
stronie wysyłającej, aby połączyć się z portem 1234 w odbiorniku i skopiować dane ze standardowego wejścia przez sieć.Jednak
nc
rozwiązanie ma kilka wad:ssh
.ssh
rozwiązaniu możesz zainicjować transfer tylko z jednego z punktów końcowych.źródło
tar -cvzf >(ssh destination 'cat > file') huge_directory_tree
nc
tym oferuje również domyślnie szyfrowanie i kompresję danych, a co ważniejsze: wykrywanie błędów. Miałem sytuacje, w których korzystałemnc
z wadliwego sterownika sieciowego, a uszkodzone dane zostały przesłane niewykryte. SSH zawiedzie w takiej sytuacji, ponieważ nie może odszyfrować / zdekompresować wadliwych danych.Za pomocą ssh:
źródło
Użyj nc (Net Cat), który nie musi zapisywać pliku lokalnie.
źródło
nc
do tego. Kiedyś zrzuciłem surowy obraz dysku z jednej maszyny na drugą, aby dowiedzieć się znacznie później, że mój sterownik sieciowy był wadliwy i przesłałem wadliwe bity. Stosowaniescp
,ssh
lub cokolwiek innego, co powie, gdy pojawia się błąd transmisji.Użyj rury FIFO:
źródło
scp
narzekał, że mypipe nie jest zwykłym plikiem.mkfifo
fajki).scp <(ls) destination
Dzięki Denis Scherbakov!
Kiedy próbowałem twojego skryptu w chmurze Hetznera, dostałem
Ale utworzono tylko plik bez zawartości. Ponieważ rzeczywista treść jest już zaszyfrowana za pomocą openssl, tak naprawdę nie potrzebujemy scp. Wbudowany linux
ftp
ma również świetne możliwości potokowania. Oto moje (wciąż dość ręczne) rozwiązanie:źródło
Oto alternatywne rozwiązanie:
Wszystkie powyższe przykłady sugerujące, że ssh + cat zakłada, że „cat” jest dostępny w systemie docelowym.
W moim przypadku system (kopia zapasowa Hetznera) miał bardzo restrykcyjny zestaw narzędzi oferujących sftp, ale nie pełną powłokę. Dlatego użycie ssh + cat nie było możliwe. Wymyśliłem rozwiązanie, które wykorzystuje nieudokumentowaną flagę „scp -t”. Pełny skrypt można znaleźć poniżej.
Aktualizacja 2019.05.08:
Zgodnie z życzeniem poniżej jest o wiele prostsza i krótsza wersja.
źródło
scp -t
? W tej chwili masz kompletny skrypt, który jest wysoce niestandardowy / zlokalizowany w twoim środowisku. Dobra rzecz dla wiki Hetznera, ale nie dla superużytkownika, gdzie większość ludzi po prostu szuka sposobu przesyłania danych wejściowych przez scp.