SSH
越しに.tar.gz
なファイルをリモートには作成しないでリモートからローカルに持ってくる。
きっかけ
これの350p辺りを読んでいて思い出した。あるディレクトリ階層をそのままローカルにもってくる例があったので、そういえばこういうことをやってなかったなあということでやった次第。
https://amzn.to/3APobdn
今までは、リモート内で圧縮ファイルを一時保存して圧縮ファイルをscp
コマンドで転送していたが、この回りくどい手順をだいぶ簡略化できたことになる。
要約
標準入出力を利用してそのまま保存する。ssh
で圧縮ファイルと標準出力に流し、ローカルのcat
で受け取り、そのままファイルに流す。
#!/bin/bash
readonly USER_HOST=someuser@example.com
readonly PORT=22222
SAVE_DIR=~
FILENAME=archive_UTC_$(date -u +%F).tar.gz
SAVE_FILEPATH=${SAVE_DIR}/${FILENAME}
if [ -e SAVE_FILEPATH ]; then
echo "The file to save (${SAVE_FILEPATH}) already exists." 1>&2
exit 1
fi
ssh -p ${PORT} ${USER_HOST} 'tar czf - $(command to find target files)' | cat > ${SAVE_FILEPATH}
おわり
備忘録として記録しておきたい。
以前はリモート側でいったん圧縮ファイルを保存したあとに、ローカルへコピーして元ファイルを削除するという手順を踏んでいたので、冗長さを感じていた。それもスクリプトを書いているときから感じていたので、もっと早めに何とかすべきだったと反省している。
標準出力の時に何が起こっているのかとかは、ストリームでなんやかんやしているだろうくらいの理解しかしていないので、そこをはっきりさせたい。