Bash

如何使用 sftp 或 ftp 使 tar 將存檔保存在遠端機器上?

  • November 3, 2021

我想在遠端機器上備份一些非常重要的數據。

目前我只是使用以下命令將它保存到我的本地機器:tar -cvjf ~/backups/Backup.tar.bz2 ~/importantfiles/*

我不希望使用另一個命令將其傳輸到遠端機器,這意味著我只想升級此命令,以便它可以將數據傳輸到遠端機器。

這被設計為稍後在一個腳本中,該腳本應該自行執行,這意味著任何類型的所需使用者輸入都會完全搞砸它!

就像是

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

將會是完美的!(沒有管道(等),只有一個命令!)

對於 SSH:

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

對於 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

另一個 SFTP:

outfile=/tmp/test.tar.gz
sftp -b /dev/stdin remote >/dev/null 2>&1 << EOF
cd /tmp
get $outfile
bye
EOF
echo $?
0

Tar 不會說 ftp 或 sftp。那不是它的工作。你不能單獨使用 tar 來做到這一點。為每項工作使用適當的工具並將它們與 shell 結合是在 unix 系統上做事的正常方式。

最明顯的解決方案是在本地創建存檔,然後將其複製到遠端電腦。

如果你不想在本地創建存檔,因為你沒有足夠的空間,你可以創建一個命名管道,讓 tar 寫入這個管道,然後找到一個可以從管道讀取的 (s)ftp 客戶端。不幸的是,sftp 拒絕put管道。一些 FTP 客戶端可以工作,例如 lftp:

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

將您的 FTP 密碼放入~/.netrc.

或者,有一種方法可以讓您的 tar 命令直接保存到遠端伺服器,但您需要事先進行一些設置。通過SSHFScurlftpfs掛載遠端伺服器。

mkdir -p ~/net/host
sshfs host: ~/net/host
tar -cvjf ~/net/host/Backup.tar.bz2 ~/importantfiles/*
fusermount -u ~/net/host

引用自:https://unix.stackexchange.com/questions/95993