tar を使ってフォルダをそのまま転送したい。
tar を使って表示出入力を使ってファイルを転送したい。
tar cfh - /etc/letsencrypt/live/ | ssh root@srv4 'tar xvf - -C /mnt/hdd '
転送の前後でディレクトリを移動する
tar cfh - -C /etc/letsencrypt/ live | ssh root@srv4 'tar xvf - -C /etc/letsencrypt/'
よくある失敗
tar がややこしくて、ついついrsync を利用しますが、落ち着いてオプションの引数の順番を見直しましょう。
この記事の目的の「圧縮しながら転送し、転送先で展開する」をパイプでまとめてやるとき、-C
オプションと -
の指定位置が混乱しがち。
展開時のよくある間違い。
-C
の記述位置が間違い
tar xvf - -C /mnt/hdd #正しい tar xvf -C /mnt/hdd - # 間違い tar -C /mnt/hdd xvf - # 間違い
アーカイブ格納時のよくある間違い
-
の位置がだめ
tar cfh - /etc/ | cat -
|
パイプ忘れ(パイプつけないと、 - が解釈されない?)
tar cfh - /etc/
f
忘れ
tar zch - /etc/ | cat - > out.tar
格納時の-C
の場所が悪い
tar cfh - -C /etc/letsencrypt/ live ## 正しい tar cfh - live -C /etc/letsencrypt/ ## 間違い tar -C /etc/letsencrypt/ cfh - live ## 間違い
転送先の設定
転送先サーバーのAuthorizedKeysを工夫すれば、SSHコマンドを省略して、指定コマンドだけが実行される。
これを使うと、Root権限で転送をかけても、少しだけ(気持ちだけ)安全がある。
厳密にやると、ディレクトリトラバーサル脆弱性、上位ディレクトリへのシンボリックリンクを転送など、面倒なことが多いので気休め程度になる。
自動化するときにオペレーションミスの事故を防止するには効果的。
~/.ssh/authorized_keys
command="tar xvf - -C /etc/letsencrypt/live/" ssh-rsa AAAAB3NzaC1yc...QW1YfiMs= root@only-tar-letsencrypt
接続と転送
公開鍵にコマンドを指定したので、コマンドは不要になる。
tar cfh - -C /etc/letsencrypt/ live | ssh root@srv4
ポエム
rsync を使えばいいだろうと思う?rsync は何でもできてしまうので、シビアでセンシティブ情報を転送するときは、rsyncを使いたくない。SSHを開けたくない。
たとえば、つぎのように、機能限定の公開鍵を作って、バックアップを定期的に行いたい。 sshの公開鍵 authorized_keys ファイルの制限機能について調べてみたら楽しかった.(実行コマンド制限など) - それマグで!