ファイルをリモートには作成しないでリモートからローカルに転送する

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}

おわり

備忘録として記録しておきたい。

以前はリモート側でいったん圧縮ファイルを保存したあとに、ローカルへコピーして元ファイルを削除するという手順を踏んでいたので、冗長さを感じていた。それもスクリプトを書いているときから感じていたので、もっと早めに何とかすべきだったと反省している。

標準出力の時に何が起こっているのかとかは、ストリームでなんやかんやしているだろうくらいの理解しかしていないので、そこをはっきりさせたい。

タイトルとURLをコピーしました