rokkonet

PC・Androidソフトウェア・アプリの開発・使い方に関するメモ

端末間のファイルのコピー(OpenSSH、rsync)

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 は以下のステップで判断と処理を行う

  1. 同一かどうかの判定(クイックチェック)
     デフォルトでは、rsync は以下の2点を確認する。
      ファイルサイズ が同じか?
      最終修正日時 (mtime) が同じか?

  2. 判定結果による動作の違い
     A. サイズも修正日時も「同じ」場合
      データ転送はスキップされる。これにより、ネットワーク帯域と時間を大幅に節約する。
      ただし、-aAX オプションがついているため、属性(所有者、グループ、権限、ACL、拡張属性)のみが異なっている場合は、それらのメタデータだけを コピー先に上書きして一致させる。

  3. サイズまたは修正日時が「異なる」場合
     ファイルを更新対象とみなす。
     デルタ転送 (Delta Transfer): rsync はファイル全体を送り直すのではなく、新旧ファイルの「差分」のみを計算して転送し、コピー先側で既存のファイルをパッチするように更新する。
     最終的に、PCB 側のファイルは PCA 側と全く同じ内容・属性に上書きされる。