scpが通用しないサーバ間のファイルコピーネタ2つ
えらい地味なネタですが、忘れそうなのでメモしときます。
まずはローカル(fukui)→リモート(ibaraki)の場合。
- ローカルのファイル(例: tempura)を、リモートのサーバ(例: ibaraki)にコピーしたい
- コピー先のファイルは他人(例: japan)のものとして作りたい or すでに他人のもので、自分では変更できない(つまり scp できない)
- 自分は rch850 ユーザ
- ibaraki には japan ユーザではログインできない
- ibaraki に入れば sudo -u japan できる
この場合、まずはリモートの /tmp にでも scp して、それを sudo -u japan cp すればできますが、なんか手数が多いし、一時的にファイルを置く必要もあります。それをなんとかするのがこのスクリプト。
ssh ibaraki 'sudo -u japan sh -c "cat /var/japan/tempura"' < /var/japan/tempura
ここで、japan ユーザ、japan グループでファイルが作られます or 上書きされます。シングルクオート無し、つまり
ssh ibaraki sudo -u japan sh -c "cat /var/japan/tempura" < /var/japan/tempura
としてしまうと、リモートサーバ上での操作が rch850 名義で行われてしまい、ファイルの所有者が rch850 になったり、書き込みを拒否されたりします。要シングルクオートです。ダブルクオートでくくって、内側のダブルクオートをバックスラッシュでエスケープしても構いません。
次はリモート(ibaraki)→リモート(ishikawa)の場合。
- リモート(例: ibaraki)のファイル(例: tempura)を、別のリモート(例: ishikawa)にコピーしたい
- コピー先のファイルは他人(例: japan)のものとして作りたい or すでに他人のもので、自分では変更できない(つまり scp できない)
- ishikawa には japan でログインできない
- ishikawa に入れば sudo -u japan できる
この場合も、ibaraki から scp してきて ishikawa の /tmp に scp して……でやることもできるんですが、以下のスクリプトでもなんとかなります。
ssh ibaraki cat /var/japan/tempura | ssh ishikawa 'sudo -u japan sh -c "cat > /var/japan/tempura"'
リモートで cat して、別のリモートでも cat。cat 様々です。ちなみに書き込み側は tee /var/japan/tempura >/dev/null で代用することもできるかと思います。