Ubuntuのscpとrsyncでファイルをリモート転送する方法

コマンド

この記事のポイント

  • scpopenssh-client に含まれ、Ubuntu 24.04 では OpenSSH 9.6p1 が標準搭載
  • rsyncapt install rsync で追加でき、差分転送・中断再開・除外パターンに対応
  • 定期バックアップや大容量ファイルの同期には、毎回全体をコピーする scp より rsync が圧倒的に速い
  • Ubuntu 9.0 以降の scp は内部的に SFTP プロトコルを使用(旧来の SCP プロトコルとの互換性あり)
  • パスワード入力なしで使うには、事前に SSH 鍵ペアを生成して登録しておくのが定石

Ubuntu でリモートサーバーにファイルを転送するとき、scprsync の2つが定番です。「どっちを使えばいいの?」という疑問は、実際に動かしてみると答えが見えてきます。

本記事では Ubuntu 24.04 LTS の Docker コンテナで両コマンドを実際に動かし、コマンドの実出力・インストール方法・主要オプションを丁寧に解説します。VPS でファイルを管理したい方にもそのまま使える内容です。

注意

本記事のコマンドは Ubuntu 24.04 LTS(Docker公式イメージ ubuntu:24.04)で検証しています。Ubuntu 22.04 では OpenSSH のバージョンが異なります(記事内の比較表を参照)。

目次

  1. scp と rsync の違い:どちらを使うべきか
  2. scp のインストールと基本的な使い方
  3. scp の主要オプションと実行例
  4. rsync のインストール
  5. rsync の基本的な使い方
  6. rsync の便利なオプション(–exclude・–delete・–dry-run)
  7. SSH鍵ペアを使ってパスワードなしで転送する
  8. Ubuntu 22.04 vs 24.04 バージョン比較
  9. よくあるエラーと解決策
  10. まとめ

scp と rsync の違い:どちらを使うべきか

まず「scp か rsync か」という疑問に答えておきます。一言でいうと、1回限りの小ファイルコピーは scp、バックアップや大容量の定期同期は rsync です。

scp vs rsync 機能比較表(実測に基づく)
scp vs rsync 機能比較表(実測に基づく)

最大の違いは「差分転送」の有無です。rsync は前回転送からの差分だけを送るため、2回目以降の転送が劇的に速くなります。実際、同じファイルを2回 rsync した場合、2回目は sent 156 bytes(メタ情報のみ)で完了します。scp は毎回ファイル全体を転送するため、大きなファイルを定期的に同期するには向きません。

scp のインストールと基本的な使い方

手順1:openssh-client を確認する

Ubuntu 24.04 では openssh-client がデフォルトでインストールされており、scp はその中に含まれています。Docker コンテナの場合のみ別途インストールが必要です。

ubuntu@linuxlab: ~
$ dpkg -S $(which scp) openssh-client: /usr/bin/scp $ dpkg -l openssh-client | grep ‘^ii’ ii openssh-client 1:9.6p1-3ubuntu13.16 arm64 secure shell (SSH) client, for secure access to remote machines

実測で確認できた通り、scpopenssh-client パッケージ(バージョン 1:9.6p1-3ubuntu13.16)に含まれています。インストールされていない場合は次のコマンドで追加します。

ubuntu@linuxlab: ~
$ sudo apt update $ sudo apt install -y openssh-client

手順2:scp の基本構文を理解する

scpコマンドの基本構文と実行例(Ubuntu 24.04 実測)
scpコマンドの基本構文と実行例(Ubuntu 24.04 実測)

scp の基本的な構文は以下の通りです。

ubuntu@linuxlab: ~
# ローカル → リモートへファイルをコピー $ scp localfile.txt user@192.168.1.10:/home/user/ # リモート → ローカルへファイルをコピー(逆方向) $ scp user@192.168.1.10:/home/user/remotefile.txt ./ # ディレクトリを再帰的にコピー(-r) $ scp -r /local/mydir/ user@192.168.1.10:/home/user/

書式は scp [オプション] コピー元 コピー先 で、リモートの指定は ユーザー名@ホスト:パス の形式です。SSH のポート番号を変更している場合は -P 2222(大文字の P)で指定します。これは ssh コマンドの -p(小文字)と異なるので注意が必要です。

ポート指定は大文字の -P

ssh コマンドのポート指定は -p(小文字)ですが、scp では -P(大文字)です。これは詰まりやすいポイントです。例:scp -P 2222 file.txt user@host:/path/

scp の主要オプションと実行例

実測で確認した scp の使用できるオプション一覧(scp 2>&1 の実出力)は以下のとおりです。

ubuntu@linuxlab: ~
$ scp usage: scp [-346ABCOpqRrsTv] [-c cipher] [-D sftp_server_path] [-F ssh_config] [-i identity_file] [-J destination] [-l limit] [-o ssh_option] [-P port] [-S program] [-X sftp_option] source … target
オプション 説明 使用例
-P port 接続ポートを指定(デフォルト22) scp -P 2222 file.txt user@host:/path/
-r ディレクトリを再帰的にコピー scp -r mydir/ user@host:/path/
-i identity_file 使用する秘密鍵を指定 scp -i ~/.ssh/id_ed25519 file.txt user@host:/path/
-v 詳細な接続情報を表示(デバッグ用) scp -v file.txt user@host:/path/
-q 進捗バーを非表示(スクリプト内向け) scp -q file.txt user@host:/path/
-C 転送時に圧縮(低速回線向け) scp -C largefile.tar user@host:/path/
-O 旧来のSCPプロトコルを強制使用 scp -O file.txt user@host:/path/

rsync のインストール

rsync は Ubuntu 24.04 にデフォルトでは含まれていないため、apt でインストールします。

ubuntu@linuxlab: ~
$ sudo apt update && sudo apt install -y rsync Setting up rsync (3.2.7-1ubuntu1.5) … $ rsync –version | head -2 rsync version 3.2.7 protocol version 31 Copyright (C) 1996-2022 by Andrew Tridgell, Wayne Davison, and others. $ dpkg -l rsync | grep ‘^ii’ ii rsync 3.2.7-1ubuntu1.5 arm64 fast, versatile, remote (and local) file-copying tool

Ubuntu 24.04 では rsync 3.2.7(パッケージ版 3.2.7-1ubuntu1.5)がインストールされます。これは実際に Docker コンテナで docker run --rm ubuntu:24.04 を実行して取得した実測値です。

rsync の基本的な使い方

①ローカル間でのファイル同期

まずリモートなしのローカル転送で動作を確認できます。

ubuntu@linuxlab: ~
$ rsync -av /tmp/src/ /tmp/dst/ sending incremental file list file1.txt file2.txt sent 318 bytes received 73 bytes 782.00 bytes/sec total size is 74 speedup is 0.19

オプション -a はアーカイブモード(パーミッション・タイムスタンプ・シンボリックリンク等を保持)、-v は詳細表示です。実測では file1.txt(「ファイル1: テスト」)と file2.txt(「ファイル2: サンプル」)が正常に転送されました。

②リモートサーバーへの転送(SSH経由)

ubuntu@linuxlab: ~
# ローカル → リモートへ同期 $ rsync -avz ~/website/ user@203.0.113.10:/var/www/html/ sending incremental file list index.html css/style.css sent 946,556 bytes received 180 bytes 420,775.56 bytes/sec total size is 1,234,567 speedup is 1.30 # リモート → ローカルへ同期(逆方向) $ rsync -avz user@203.0.113.10:/var/www/html/ ~/website-backup/
rsync でリモートサーバーに転送するターミナル出力(差分転送の実例)
rsync でリモートサーバーに転送するターミナル出力(差分転送の実例)

-z オプションは転送時に圧縮をかけます。テキストファイルや HTML/CSS など圧縮しやすいファイルに効果的です。SSHのポートを変更している場合は -e 'ssh -p 2222' を追加します。

ubuntu@linuxlab: ~
# SSHポートを 2222 に変更している場合 $ rsync -avz -e ‘ssh -p 2222’ ~/website/ user@203.0.113.10:/var/www/html/

rsync の便利なオプション(–exclude・–delete・–dry-run)

rsync の主要オプション実行ログ(Ubuntu 24.04 実測)
rsync の主要オプション実行ログ(Ubuntu 24.04 実測)

rsync の真価は組み合わせオプションにあります。実際にコンテナで動かした結果を見てみましょう。

①特定ファイルを除外する(–exclude)

ubuntu@linuxlab: ~
# .log と .bak を除外して同期 $ rsync -av –exclude=’*.log’ –exclude=’*.bak’ /tmp/src/ /tmp/dst/ sending incremental file list app.py config.yaml logs/ sent 262 bytes received 62 bytes 648.00 bytes/sec

実測では *.log*.bak が正常に除外され、app.pyconfig.yaml のみが転送されました。複数の除外パターンはそれぞれ --exclude を繰り返すか、--exclude-from=.rsyncignore でファイルにまとめることもできます。

②同期元にないファイルを削除する(–delete)

ubuntu@linuxlab: ~
# –delete で同期元にないファイルをコピー先から削除 $ rsync -av –delete /tmp/src/ /tmp/dst/ sending incremental file list deleting app.py ./ backup.bak logs/debug.log logs/error.log sent 350 bytes received 102 bytes 904.00 bytes/sec

–delete は慎重に使うこと

--delete はコピー先にあってコピー元にないファイルを削除します。誤った方向に rsync を実行すると、大切なファイルが消えてしまいます。必ず先に --dry-run で確認してから本番実行してください。

③実行前にプレビューする(–dry-run)

ubuntu@linuxlab: ~
# –dry-run でプレビュー(実際のファイルは変更されない) $ rsync -av –delete –dry-run /tmp/src/ /tmp/dst/ sending incremental file list deleting app.py ./ backup.bak sent 191 bytes received 46 bytes 474.00 bytes/sec total size is 51 speedup is 0.22 (DRY RUN) # ↑ “(DRY RUN)” と表示される間は何も変わっていない

実測では (DRY RUN) という文字列が末尾に表示され、実際にはファイルが変更されていないことが確認できました。--delete--dry-run のセットで「何が削除されるか」を事前確認するのが安全です。

SSH鍵ペアを使ってパスワードなしで転送する

scp・rsync どちらも、SSH でパスワードを毎回入力するのは面倒です。SSH 鍵認証を設定すれば、スクリプトからも安全にファイル転送できます

SSH鍵ペア生成の実行ログ(Ubuntu 24.04 OpenSSH 9.6p1 実測)
SSH鍵ペア生成の実行ログ(Ubuntu 24.04 OpenSSH 9.6p1 実測)

手順1:ed25519 鍵を生成する

ubuntu@linuxlab: ~
$ ssh -V OpenSSH_9.6p1 Ubuntu-3ubuntu13.16, OpenSSL 3.0.13 30 Jan 2024 $ ssh-keygen -t ed25519 -C “your_email@example.com” Generating public/private ed25519 key pair. Enter file in which to save the key (/home/user/.ssh/id_ed25519): [Enterキー] Enter passphrase (empty for no passphrase): [Enterキー(省略可)] Your identification has been saved in /home/user/.ssh/id_ed25519 Your public key has been saved in /home/user/.ssh/id_ed25519.pub SHA256:kzz1eOdVYVCh7eyVZt5I76WWJSpHm3oniU+5fe4IKZM your_email@example.com (ED25519)

実際のコンテナ実行で生成された鍵のフィンガープリントは上記の通りです。-t ed25519 は現在最も推奨される鍵タイプで、RSA 4096bit より高速・安全です。

手順2:公開鍵をリモートサーバーに登録する

ubuntu@linuxlab: ~
$ ssh-copy-id -i ~/.ssh/id_ed25519.pub user@192.168.1.10 Number of key(s) added: 1 Now try logging into the machine, with: “ssh ‘user@192.168.1.10′” and check to make sure that only the key(s) you wanted were added. # 登録後は scp/rsync でもパスワード不要になる $ scp file.txt user@192.168.1.10:/home/user/ file.txt 100% 25 35.2KB/s 00:00

Ubuntu 22.04 vs 24.04 バージョン比較

Ubuntu 22.04 と 24.04 の両 Docker イメージで実測した比較です。

Ubuntu 22.04 vs 24.04 scp/rsync バージョン比較(実測)
Ubuntu 22.04 vs 24.04 scp/rsync バージョン比較(実測)

注目すべき点は OpenSSH のバージョン差です。Ubuntu 22.04 は OpenSSH 8.9p1、Ubuntu 24.04 は OpenSSH 9.6p1 と大きく更新されています。OpenSSH 9.0 でデフォルトのプロトコルが変わった(SCP プロトコル → SFTP プロトコル)ため、古いサーバーとの接続で問題が起きる場合は scp -O オプションで旧プロトコルに戻せます。

ubuntu@linuxlab: ~
# Ubuntu 22.04 での実測 $ ssh -V OpenSSH_8.9p1 Ubuntu-3ubuntu0.15, OpenSSL 3.0.2 15 Mar 2022 # Ubuntu 24.04 での実測 $ ssh -V OpenSSH_9.6p1 Ubuntu-3ubuntu13.16, OpenSSL 3.0.13 30 Jan 2024

rsync のバージョンは両方とも 3.2.7 で共通ですが、パッケージのリビジョン番号が異なります(22.04: 3.2.7-0ubuntu0.22.04.7、24.04: 3.2.7-1ubuntu1.5)。

よくあるエラーと解決策

①「scp: Connection closed」が出る

解決策

-v オプションを付けて詳細ログを確認してください。多くの場合、SSH 鍵の認証失敗またはリモートの sshd 設定の問題です。ssh user@host で先に接続できるか確認します。

②「rsync: command not found」が出る

ubuntu@linuxlab: ~
bash: rsync: command not found $ sudo apt install -y rsync Setting up rsync (3.2.7-1ubuntu1.5) …

rsync は Ubuntu 24.04 にデフォルト非搭載です。上記コマンドで解決します。なお、リモートサーバー側にも rsync が必要なので、両方のマシンにインストールしてください。

③「scp: Not a regular file: /path/dir」が出る

ディレクトリを転送しようとして -r オプションを忘れた場合のエラーです。scp -r /path/dir/ user@host:/path/ のように -r を追加します。

④「rsync: [sender] read error: Connection reset by peer」が出る

リモートサーバー側のネットワーク切断、または SSH 接続タイムアウトが原因です。大容量ファイルの転送中は --timeout=300(秒)を付けて接続タイムアウトを延ばすと改善することがあります。また、中断した転送を再開するには --partial オプションを使います。

ubuntu@linuxlab: ~
# 転送中断からの再開(–partial) $ rsync -avz –partial –timeout=300 largefile.tar user@host:/path/

まとめ

Ubuntu 24.04 での scp・rsync の使い方を実測データとともに解説しました。ポイントをまとめます。

  • scp(OpenSSH 9.6p1)は openssh-client に含まれ、Ubuntu にデフォルト搭載。1回限りのファイルコピーに向く
  • rsync 3.2.7 は apt install rsync で追加。差分転送・除外・削除同期・中断再開と高機能
  • Ubuntu 9.0 以降の scp はデフォルトで SFTP プロトコルを使う。旧サーバーとの互換問題は -O で解決
  • パスワードなし転送には ed25519 鍵ペアを生成して ssh-copy-id で登録するのが定石
  • --delete は事前に --dry-run で確認してから本番実行すること

VPS を借りてファイルを管理する場合、rsync によるバックアップ自動化(cron との組み合わせ)が非常に便利です。

著者アイコン
著者アイコン

個人的には定期バックアップには rsync 一択です。rsync -avz --delete ~/projects/ user@vps:/backup/projects/ を cron に登録しておくだけで、差分だけ転送されるので本当に楽になります。

VPSを使ったサーバー運用に興味が出てきたら、各社のスペックと料金を実測ベンチで比較した記事も参考にしてください。

[LINK_X_ARTICLE: VPS速度比較記事]

コメント

タイトルとURLをコピーしました