web-dev-qa-db-ja.com

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つのコマンドだけ!)

10
BrainStone

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
15
jirib

Tarはftpやsftpを話しません。それはその仕事ではありません。 tarだけでこれを行うことはできません。各ジョブに適切なツールを使用し、それらをシェルと組み合わせることは、UNIXシステムでの通常の方法です。

最も明白な解決策は、アーカイブをローカルで作成し、それをリモートマシンにコピーすることです。

十分なスペースがないためにローカルでアーカイブを作成したくない場合は、名前付きパイプを作成し、このパイプにtarを書き込み、パイプから読み取ることができる(s)ftpクライアントを見つけることができます。残念ながら、sftpはパイプのputを拒否します。 lftpなど、一部のFTPクライアントは機能します。

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