如何使 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 客户端。

相关内容