Jak zmusić tar do zapisania archiwum na zdalnym komputerze za pomocą sftp lub ftp?

10

Chciałbym wykonać kopię zapasową niektórych moich bardzo ważnych danych na zdalnym komputerze.
Obecnie po prostu zapisuję go na moim komputerze lokalnym za pomocą tego polecenia:tar -cvjf ~/backups/Backup.tar.bz2 ~/importantfiles/*

Wolałbym nie używać innego polecenia do przeniesienia go na komputer zdalny, co oznacza, że ​​chciałbym po prostu zaktualizować to polecenie, aby mogło przesyłać dane do komputera zdalnego.

Zostało to zaprojektowane w późniejszym skrypcie, który powinien działać samodzielnie, co oznacza, że ​​jakikolwiek typ danych wejściowych użytkownika całkowicie go zepsułby!

Coś jak

tar -cvjf sftp://user:pwassword@host/Backup.tar.bz2 ~/importantfiles/*
tar -cvjf  ftp://user:pwassword@host/Backup.tar.bz2 ~/importantfiles/*

Byłoby idealnie! (Bez rur (itp.), Tylko jedno polecenie!)

BrainStone
źródło
Czy to musi być ftp? Nie masz sshdostępu do tego komputera?
terdon
Nie mam dostępu ssh do komputera. To tylko serwer zapasowy, który wynajmuję. Więc tak to ma być FTP lub SFTP.
BrainStone
@BrainStone SFTP jest częścią SSH
kurtm
Wiem. Ale jest skonfigurowany w taki sposób, że każde połączenie ssh jest natychmiast zamykane. SFTP działa jednak. Wiem, że to dziwna konfiguracja, ale tak już jest.
BrainStone
1
SFTP jest dostępny, gdy SSH nie jest używany, jeśli używa wewnętrznego serwera sftp, a twoja powłoka jest ustawiona na / sbin / nologin.
Gregg Leventhal

Odpowiedzi:

15

W przypadku SSH:

tar czf - . | ssh remote "( cd /somewhere ; cat > file.tar.gz )"

W przypadku SFTP:

outfile=/tmp/test.tar.gz
tar cvf $outfile . && echo "put $outfile" | sftp remote:/tmp/
Connecting to remote...
Changing to: /tmp/
sftp> put /tmp/test.tar.gz
Uploading /tmp/test.tar.gz to /tmp/test.tar.gz
/tmp/test.tar.gz

Kolejny SFTP:

outfile=/tmp/test.tar.gz
sftp -b /dev/stdin remote >/dev/null 2>&1 << EOF
cd /tmp
get $outfile
bye
EOF
echo $?
0
jirib
źródło
Jak dokładnie miałbym tego użyć? Mam na myśli, jak mogę ustawić, które pliki powinny znajdować się w tarce. A gdzie mam umieścić hasło? Jak mam to skonfigurować, aby nie musiałem akceptować odcisku palca gospodarza?
BrainStone
Dowiedz się więcej o ssh, man ssh, man ssh-agent, man ssh_config odpowiedz na wszystkie twoje wątpliwości. Które pliki definiujesz lokalnie za pomocą argumentów tar, następnie są one przesyłane przez ssh do zdalnego hosta, a dane wyjściowe są przekierowywane do pliku.
jirib
Czy można to zrobić bez rury?
BrainStone
To również nie działa, ponieważ musi to być sftp ( bez dostępu do ssh ) lub ftp
BrainStone
Dla ftp, patrz man lftp. Jeśli potrzebujesz bardziej skomplikowanych scenariuszy, użyj „sftp -b” i plik z poleceniami lub użyj „tutaj dokumentów” (<< EOF).
jirib
3

Tar nie mówi ftp ani sftp. To nie jest jego praca. Nie możesz tego zrobić z samą smołą. Używanie odpowiednich narzędzi do każdego zadania i łączenie ich z powłoką to normalny sposób wykonywania zadań w systemach uniksowych.

Najbardziej oczywistym rozwiązaniem jest utworzenie archiwum lokalnie, a następnie skopiowanie go na komputer zdalny.

Jeśli nie chcesz tworzyć archiwum lokalnie, ponieważ nie masz wystarczającej ilości miejsca, możesz utworzyć nazwaną potok, zmusić tar do zapisu do tej potoki i znaleźć klienta ftp, który może czytać z potoków. Niestety, sftp odmawia putinstalacji. Niektóre klienty FTP działają, na przykład lftp:

mkfifo f
tar -cvjf f ~/importantfiles/* &
sleep 2
lftp -f - <<EOF
open user@host
put f Backup.tar.bz2
EOF
wait
rm f

Wprowadź swoje hasło FTP ~/.netrc.

Alternatywnie istnieje sposób, aby polecenie tar zapisało się bezpośrednio na zdalnym serwerze, ale potrzebujesz wcześniejszej konfiguracji. Zamontuj zdalny serwer na SSHFS lub curlftpfs .

mkdir -p ~/net/host
sshfs host: ~/net/host
tar -cvjf ~/net/host/Backup.tar.bz2 ~/importantfiles/*
fusermount -u ~/net/host
Gilles „SO- przestań być zły”
źródło