Bash
如何使用 sftp 或 ftp 使 tar 將存檔保存在遠端機器上?
我想在遠端機器上備份一些非常重要的數據。
目前我只是使用以下命令將它保存到我的本地機器:
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 命令直接保存到遠端伺服器,但您需要事先進行一些設置。通過SSHFS或curlftpfs掛載遠端伺服器。
mkdir -p ~/net/host sshfs host: ~/net/host tar -cvjf ~/net/host/Backup.tar.bz2 ~/importantfiles/* fusermount -u ~/net/host