sftp または ftp を使用して tar でアーカイブをリモート マシンに保存するにはどうすればよいですか?

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/*

完璧です! (パイプなどはなく、コマンドは 1 つだけです!)

答え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 の仕事ではありません。tar だけではこれを行うことはできません。それぞれの仕事に適切なツールを使用し、それらをシェルと組み合わせるのが、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またはカールFTP

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 クライアントです。

関連情報