ナチュラル @rch850

ナチュラル丼発祥の地、福井からお届けします。技術的な話題とか、雑談とか。

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 で代用することもできるかと思います。