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

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

我想在遠端電腦上備份一些非常重要的資料。
目前我只是使用以下命令將其保存到本地計算機: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/*

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

答案1

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

答案2

Tar 不支援 ftp 或 sftp。那不是它的工作。僅使用 tar 無法做到這一點。為每項工作使用適當的工具並將它們與 shell 結合起來是在 UNIX 系統上執行操作的正常方式。

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

如果因為沒有足夠的空間而不想在本地建立存檔,則可以建立命名管道,將 tar 寫入此管道,然後找到一個可以從管道讀取資料的 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 命令直接保存到遠端伺服器,但您需要事先進行一些設定。將遠端伺服器掛載到SSHFS或者捲曲檔案系統

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

答案3

一行解決方案:

tar Jcpvf - / | ftp -u ftp://user:[email protected]/full.backup.tar.xz -

它會建立一個流並將stdout其傳遞到 ftp 伺服器而不建立檔案。ftp是任何 *nix/BSD 系統上常用的 ftp 用戶端。

相關內容