我想在远程计算机上备份一些非常重要的数据。
目前我只是使用以下命令将其保存到本地计算机: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 客户端。