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 を使います