2026 May 19.
2026 Mar. 24.
2026 Mar. 16.
(scpコマンドではなく)rsyncコマンドで、sshの鍵ファイルを利用してコピーする。
rsyncは、コピー元とコピー先が同じホスト(ローカル)ではsshが不要だが、異なるホスト間(リモート)でのコピーではsshを要する。
条件
SSHサーバーの/SRC/DIRディレクトリをクライアントの/DSTディレクトリの下にコピーするものとする。
SSHサーバーの/SRC/DIRディレクトリ内に存在しないが、クライアントの/DSTディレクトリ内に存在するファイルはそのまま残す。
クライアントの"/home/USER/.ssh/config"ファイルにサーバー接続設定が記述されている。
この記述がなければ、rsyncコマンドのオプションを適宜追加する。
【サーバー側で】
rsyncコマンドのパスを確認する
$ which rsync
出力:/usr/bin/rsync
パスワードなしでrsync コマンドを sudo で実行できるようにする。
$ sudo visudo
最下行に"USER ALL=(ALL) NOPASSWD: /usr/bin/rsync"を記述する。
(USERの部分は適宜変更すること)
【クライアント側で】
/home/USER/.ssh/config内のSSHサーバー定義の秘密鍵をフルパスで記述する
screen を起動する
$ screen -S my_rsync
ssh-agent を準備する
$ eval $(ssh-agent)
$ ssh-add ~/.ssh/秘密鍵ファイル ## パスフレーズを入力する
rsync を実行する
同名ファイルはすべて上書きする場合
$ sudo -E rsync -ahAXzP -e "ssh -F /home/USER/.ssh/config" --rsync-path="sudo rsync" SSHSERVER:/SRC/DIR /DST/ 1> /MY/DIR/STANDARD-OUT.txt 2> /MY/DIR/STANDARD-ERR.txt
同名ファイルはタイムスタンプが新しい方を残す場合
$ sudo -E rsync -ahAXzPu -e "ssh -F /home/USER/.ssh/config" --rsync-path="sudo rsync" SSHSERVER:/SRC/DIR /DST/ 1> /MY/DIR/STANDARD-OUT.txt 2> /MY/DIR/STANDARD-ERR.txt
rsyncコマンドを実行しているターミナルを閉じてもrsyncコマンドの実行を継続するには
- 別のターミナルを開き、/MY/DIR/STANDARD-OUT.txt、/MY/DIR/STANDARD-ERR.txtへの書き込み状況を確認する。
- screenのターミナルから抜ける。
キーボードで Ctrl + A を押した後、指を離して D を押す。(Dの押し下げはCtrlを押していても押していなくてもよい)
画面に [detached from xxxx.my_rsync] と出れば成功。
rsyncコマンドの末尾に"&"を付けず、フォアグラウンドで実行すること。
コピー終了後の処理
screenから出ていたならscreenに入る。 $ screen -r my_rsync screenを終了する。 $ exit
オプションについて
sudo -E:環境変数を引き継ぐ。ssh-agent と通信するための変数(SSH_AUTH_SOCK)をrsyncコマンドに渡すことができる。
rsyncオプション
-a (archive): オーナー、グループ、権限、タイムスタンプを可能な限り維持。
-h (human-readable):出力の数字を読みやすい単位(MB, GBなど)で表示。
-A (acls):ACL(アクセス制御リスト)を維持。
-X (xattrs):拡張属性を維持。
-z (compress):転送中にデータを圧縮して帯域を節約。
-P:--partial(中断した転送の再開)と --progress(進捗表示)の合わせ技。
-F /home/USER/.ssh/config:root 権限で動きつつも、設定ファイルだけは USER のものを使うよう指示。
--rsync-path="sudo rsync":SSHサーバー側でも sudo 権限で rsync を動かすよう指示。これにより、USER では読めないファイルもコピー可能になる。SSHサーバーの USER ユーザーが、パスワードなし(あるいはパスワード入力あり)で sudo を実行できる権限を持っている必要がある。
-uオプションなしでの上記オプションでコピー元とコピー先に同名のファイルが存在する場合、rsync は以下のステップで判断と処理を行う
- 同一かどうかの判定(クイックチェック)
デフォルトでは、rsync は以下の2点を確認する。
ファイルサイズ が同じか?
最終修正日時 (mtime) が同じか?
- 判定結果による動作の違い
A. サイズも修正日時も「同じ」場合
データ転送はスキップされる。これにより、ネットワーク帯域と時間を大幅に節約する。
ただし、-aAX オプションがついているため、属性(所有者、グループ、権限、ACL、拡張属性)のみが異なっている場合は、それらのメタデータだけを コピー先に上書きして一致させる。
- サイズまたは修正日時が「異なる」場合
ファイルを更新対象とみなす。
デルタ転送 (Delta Transfer): rsync はファイル全体を送り直すのではなく、新旧ファイルの「差分」のみを計算して転送し、コピー先側で既存のファイルをパッチするように更新する。
最終的に、PCB 側のファイルは PCA 側と全く同じ内容・属性に上書きされる。