tar
とssh
を組み合わせることで、一時ファイルを作成せずに、sudo権限が必要なファイルを別のサーバーへ転送できます。
転送元サーバの容量が足りない時に実施しましたので、メモします。
基本的な手順 #
-
転送元サーバーで以下のコマンドを実行:
Terminal sudo tar czvf - /path/to/source/file | ssh username@targetserver 'cat > /path/to/destination/file.tar.gz'
sudo tar
でファイルをアーカイブし、そのままssh
を使って別サーバーに転送します。 -
転送先のサーバーで以下のコマンドを実行:
Terminal sudo tar xzvf /path/to/destination/file.tar.gz -C /final/path/to/destination
tar
を使ってアーカイブを展開し、元のファイルを復元します。
ワンライナーで実行 #
以下のワンライナーを使うことで、ファイルの圧縮、転送、展開を1つのコマンドで実行できます。
sudo tar czvf - /path/to/source/file | ssh username@targetserver 'sudo tar xzvf - -C /final/path/to/destination'
この方法では転送先のサーバー上でsudo
を使ってtar
を展開するため、sudoパスワードの入力が求められる可能性があります。
自動化を検討している場合は、パスワードなしのsudo
設定を一時的にする等行います。
注意点 #
tar展開時の権限 #
tar
でアーカイブを展開する際にsudo
が必要かどうかは、展開先のディレクトリのパーミッションに依存します。
- 一般ユーザーに書き込み権限があるディレクトリなら
sudo
は不要 - ルートユーザーや特定のグループのみが書き込み可能なディレクトリなら
sudo
が必要
また、元のファイルの所有者がroot
であり、それを保持したい場合や、システムディレクトリ(例:/etc
や /var
)に展開する場合もsudo
が必要になります。
tar
の-p
オプションについて
#
tar
の-p
(--preserve-permissions
)オプションを使うと、元のファイルやディレクトリのパーミッション(所有者情報やアクセス権)を保持したまま展開可能です。
もし、ファイルやディレクトリのオーナー、グループ、アクセス権をそのまま維持したい場合は、-p
オプションを付けて展開してください。
この方法を使うことで、意図しないパーミッションの変更を防ぐことができます。