2026年6月2日

2026年6月2日

scpでサーバー間のファイルを転送する方法|基本構文・主なオプション・リモート間コピーの注意点

scp は、SSHの接続を使ってファイルをコピーするコマンドです。WordPressの設定ファイルをサーバーに送る、バックアップファイルを手元に取ってくる、ログを集めるなど、サーバー運用でよく使います。SSHでログインできるサーバーであれば、追加のソフトなしで使えます。

この記事では、scpの基本構文、ローカルとリモートの間の転送、ディレクトリの転送、リモートどうしの転送、主なオプション、よくあるエラーを順に解説します。オプションの説明は、OpenSSHの公式マニュアル(2026年11月時点)に基づいています。

基本構文

scp [オプション] コピー元 コピー先

リモートのファイルは ユーザー名@ホスト名:パス の形で書きます。コロン(:)のあとのパスが相対パスの場合は、リモートのユーザーのホームディレクトリが起点になります。

書き方 意味
file.txt ローカルのファイル
user@example.com:/tmp/ リモートの /tmp/ ディレクトリ
user@example.com:backup/ リモートのホームディレクトリの下の backup/
scp://user@example.com:2222/tmp/ URI形式(ポート番号も書ける)

~/.ssh/config に接続先を登録している場合は、ユーザー名@ホスト名 の代わりに登録した名前(Host)を使えます。ポートや鍵ファイルの設定も自動で使われます。

ローカルからリモートへ送る

# 単一のファイルを送る
scp localfile.txt user@example.com:/tmp/

# 名前を変えて送る
scp localfile.txt user@example.com:/tmp/renamed.txt

# SSHのポートが22以外の場合(大文字の -P)
scp -P 2222 backup.tar.gz user@example.com:~/backup/

# 鍵ファイルを指定する
scp -i ~/.ssh/id_ed25519 wp-config.php user@example.com:/var/www/html/

ポートの指定は大文字の -P です。小文字の -p は別のオプション(時刻と権限の保持)なので注意してください。ssh コマンドのポート指定は小文字の -p のため、取り違えやすいところです。

リモートからローカルへ取ってくる

# 単一のファイルをカレントディレクトリに取ってくる
scp user@example.com:/var/log/nginx/access.log ./

# 複数のファイルをワイルドカードで取ってくる(引用符で囲む)
scp 'user@example.com:/var/log/nginx/*.log' ./logs/

ワイルドカード(*)を含むリモートのパスは、引用符で囲みます。囲まないと、手元のシェルが先に * を展開しようとして、意図しない動きになることがあります。

ディレクトリを転送する

ディレクトリは -r を付けて再帰的にコピーします。

# ローカルのディレクトリをリモートへ
scp -r ./mytheme user@example.com:/var/www/html/wp-content/themes/

# リモートのディレクトリをローカルへ
scp -r user@example.com:/etc/nginx ./nginx-backup

コピー先の扱いは次のとおりです。

  • コピー先のディレクトリがすでにある場合は、その中にコピー元と同じ名前のディレクトリが作られます(上の1つ目の例では themes/mytheme ができます)
  • コピー先のディレクトリがない場合は、その名前でディレクトリが作られ、中身がコピーされます(2つ目の例で ./nginx-backup がなければ、nginx-backup の中に /etc/nginx の中身が入ります)

-r は、たどった先にあるシンボリックリンクをリンクのままではなく、リンク先の実体としてコピーします。シンボリックリンクを多く含むディレクトリでは、rsync か tar を使うほうが安全です。

主なオプション

オプション 意味
-P ポート 接続先のSSHのポートを指定する
-i 鍵ファイル 公開鍵認証に使う秘密鍵を指定する
-r ディレクトリを再帰的にコピーする
-p 元のファイルの更新時刻・アクセス時刻・権限を保持する
-C 圧縮を有効にする(遅い回線で効果がある場合がある)
-l 帯域 使う帯域を Kbit/s 単位で制限する(-l 8000 で約 1MB/s)
-q 進捗表示と、SSHの警告・診断メッセージを表示しない
-v 接続の詳しいデバッグ情報を表示する(接続や認証の問題の調査用)
-J 中継ホスト 踏み台サーバーを経由して接続する
-3 リモートどうしのコピーを、手元のマシンを経由して行う(現在は既定の動作)
-R リモートどうしのコピーを、コピー元のサーバーから直接行う
-O SFTPではなく、従来のSCPプロトコルで転送する

ファイルの転送中は、端末に進捗(割合・転送量・速度・残り時間)が表示されます。-v は進捗を詳しくするものではなく、SSHの接続処理のデバッグ情報を出すオプションです。

# 帯域を約1MB/sに抑えて大きなファイルを送る
scp -l 8000 large.zip user@example.com:/tmp/

# 踏み台サーバー bastion.example.com を経由して送る
scp -J user@bastion.example.com file.txt user@internal.example.com:/tmp/

リモートどうしの転送

コピー元とコピー先の両方にリモートを書くと、サーバーAからサーバーBへコピーできます。

# 手元のマシンを経由してコピーする(既定)
scp user1@host1:/data/file.txt user2@host2:/backup/

# host1 から host2 へ直接コピーする
scp -R user1@host1:/data/file.txt user2@host2:/backup/

現在のOpenSSHでは、リモートどうしのコピーは手元のマシンを経由して行われます(以前は -3 を付けたときの動作でした)。手元のマシンから両方のサーバーに接続できればよく、サーバーどうしが直接通信できなくても使えますが、データは手元の回線を往復します。

-R を付けると、コピー元のサーバー(host1)から、コピー先のサーバー(host2)へ直接接続してコピーします。この場合、host1 がパスワードなしで host2 に認証できる必要があります。

OpenSSH 9.0以降の変更点

OpenSSH 9.0から、scp は内部の転送にSFTPプロトコルを使うようになりました。OpenSSHのプロジェクトは、古いSCPプロトコルは時代遅れで修正が難しいとして、sftp や rsync の利用を勧めています。ただし、scp コマンド自体は今も使えます。使い方はほぼ変わりませんが、次の点に注意します。

  • 接続先でSFTPが無効になっている場合: 転送に失敗します。-O を付けると従来のSCPプロトコルで転送できます
  • リモートのパスの ~: 古いSFTPサーバーでは、~ を使ったパスが展開されないことがあります。その場合は /home/user/backup/ のように / から始まるパスで書くか、-O を使います

手元のOpenSSHのバージョンは次のコマンドで確認できます。

ssh -V

よくあるエラー

メッセージ 主な原因と対処
Permission denied (publickey) 鍵が違う、またはサーバーに公開鍵が登録されていない。-i で鍵を指定するか、ssh で同じ接続先にログインできるかを先に確認する
scp: /var/www/html/file.txt: Permission denied 接続したユーザーにコピー先への書き込み権限がない。書き込めるディレクトリ(ホームなど)に送ってから、サーバー上で sudo を使って移動する
Host key verification failed. 接続先のホスト鍵が、以前に記録したものと違う。サーバーの再構築などで正当に変わった場合だけ、ssh-keygen -R ホスト名 で古い記録を削除する
not a regular file ディレクトリを -r なしでコピーしようとしている

接続や認証で失敗する場合は、まず ssh で同じ接続先にログインできるかを確認すると、原因を切り分けやすくなります。SSH接続の基本は SSHで別のサーバーに接続する方法、鍵の設定は OpenSSHの鍵ペア生成と公開鍵認証の設定手順 で解説しています。

scp以外を選ぶ場面

  • 差分だけを転送したい、途中で切れた転送をやり直したい: rsync が向いています。2回目以降は変更のあったファイルだけを送れます
  • 小さなファイルが大量にある: tar でまとめてからSSHで送ると、ファイルごとのやり取りが減ります
# /var/www/html の中身をまとめてリモートに保存する
tar -czf - -C /var/www/html . | ssh user@example.com 'cat > /backup/html.tar.gz'

rsyncでのバックアップは rsyncでリモートバックアップする方法、SFTPの安全な設定は scp・sftp接続の安全な設定方法 を参照してください。

まとめ

  • 構文は scp コピー元 コピー先 で、リモートは ユーザー名@ホスト名:パス と書きます
  • ポートは大文字の -P、ディレクトリは -r、時刻と権限の保持は小文字の -p です
  • リモートのワイルドカードは引用符で囲みます
  • リモートどうしのコピーは既定で手元を経由し、-R でサーバー間の直接転送になります
  • OpenSSH 9.0以降は内部でSFTPを使います。SFTPが使えない接続先では -O を付けます
  • 差分の転送や再開が必要なら rsync を使います

お気軽にご相談ください

お見積りへ お問い合わせへ
▲