Linux入門:コマンド操作のきほん

scp でファイル転送

生田 陸人
LuaGate エンジニア / 現役エンジニア
編集 LuaGate編集部

scp でファイル転送 とは

離れたサーバへ安全にファイルを転送するscpコマンドを、ターミナルで実際に操作して習得します。本レッスンでは、scp でファイル転送 の基本から実際の使いどころまでを整理し、現場で迷わず使える形に落とし込みます。

scp とは

scp (Secure Copy) は SSH の上に乗ったファイル転送ツールで、リモートホストとの間でファイルやディレクトリを安全にコピーします。cp のリモート版と考えると分かりやすく、シェルから 1 行で完結する手軽さが魅力です。

本コースの実行環境ではリモート接続を行うことができないため、本レッスンでは構文・典型例・落とし穴を学び、ローカルでの代替手段として cp -r を使う方法を示します。

基本構文

ターミナル

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

「リモート」を指定する書き方は ユーザー@ホスト:パス です。コピー元・先のどちらでもリモート指定できます。

ターミナル

# ローカル → リモート (アップロード) scp local.txt deploy@example.com:/tmp/ # リモート → ローカル (ダウンロード) scp deploy@example.com:/var/log/app.log ./ # リモート → 別のリモート (デフォルトはローカル経由で中継。直接転送は -R) scp alice@host1:/data/a.txt bob@host2:/data/

主要オプション

オプション役割
-rディレクトリを再帰的にコピー
-P ポートSSH ポート指定 (大文字 P)
-i 秘密鍵秘密鍵を指定
-p元のタイムスタンプと権限を保持
-v詳細表示
-l 帯域転送速度制限 (Kbit/s)

ssh-p (小文字) はポート、scp-P (大文字) もポートですが、文字種が違うので注意。

図解 scp の流れ

diagram (will load when visible)

内部的には SSH の認証を再利用しているので、ssh deploy@example.com で繋がる相手なら scp も同じ鍵・同じユーザー名でそのまま動きます。

ディレクトリの転送

ターミナル

# dist ディレクトリごと丸ごとアップロード scp -r dist/ deploy@example.com:/var/www/myapp/ # ログディレクトリを丸ごとダウンロード scp -r deploy@example.com:/var/log/myapp/ ./logs/

-r を忘れるとディレクトリは無視されてエラーになります。

ポートを指定する

本番サーバーが SSH を非標準ポートで運用しているケースは多いです。

ターミナル

scp -P 2222 -i ~/.ssh/id_ed25519 local.txt deploy@example.com:/tmp/

これを覚えておかないと、Permission deniedConnection refused で時間を浪費します。

~/.ssh/config を使う

前レッスンで触れた ~/.ssh/configscp でも有効です。

プレーンテキスト

Host prod HostName prod.example.com User deploy Port 2222 IdentityFile ~/.ssh/id_ed25519

この設定があれば scp file.tar.gz prod:/tmp/ のように短く書けます。

大きなディレクトリやファイル数の多い転送には scp ではなく rsync を使うのがベターです。scp は転送のたびに毎回ファイル全体を送りますが、rsync は差分転送で大幅に高速化できます。次のレッスンで扱います。

よくあるエラー

  • Permission denied (publickey): 鍵が登録されていない / -i 指定が間違っている
  • No such file or directory: 相手側のパスが間違い、または書き込み権限がない
  • scp: ...: Is a directory: -r 忘れ
  • Host key verification failed: 相手のホスト鍵が変わった。中間者攻撃の可能性、または再構築されたサーバー

sftp との違い

sftp は SSH 上の対話的ファイル転送ツールで、get/put/ls などの FTP 風コマンドを使います。インタラクティブに何度もやり取りしたい場合や、ディレクトリブラウズしながら選んで転送したい場合は sftp が向きます。1 ショット転送なら scp の方が早いです。

ローカル代替例

本コースの executor ではリモート接続不可なので、コンセプトを確認するなら cp で十分です。

ターミナル

# scp の代わり ローカル内でディレクトリごとコピー mkdir -p /tmp/src /tmp/dst echo "hello" > /tmp/src/a.txt echo "world" > /tmp/src/b.txt cp -r /tmp/src/. /tmp/dst/ ls /tmp/dst/ # a.txt b.txt

リモート相手の代わりにディレクトリで dst を用意しただけで、構造はそっくりです。手元の Linux 環境では ssh localhostscp を使って自分自身を相手に練習することもできます。

ファイル転送は本番運用で頻繁に発生します。scp の構文を毎回検索せずに口で言えるようになると、それだけで現場での印象がだいぶ変わります。

大容量転送のコツ

大きなファイルを scp する場合、まずローカルで tar + gzip してから 1 ファイルにまとめて送るのが定番です。たくさんの小ファイルを 1 つずつ転送するよりも、ハンドシェイクが減って圧倒的に速くなります。

ターミナル

# ローカルで圧縮 → 転送 → リモートで展開 tar czf logs.tar.gz logs/ scp logs.tar.gz deploy@example.com:/tmp/ ssh deploy@example.com 'cd /tmp && tar xzf logs.tar.gz'

まとめ

  • scp は SSH 上のファイル転送ツール。cp のリモート版
  • リモート指定は ユーザー@ホスト:パス
  • ディレクトリは -r、ポートは -P (大文字)
  • 差分転送なら rsync、対話なら sftp が向く
  • ローカルでは cp -r で似た構造を練習できる
  • 大容量は tar + gzip で 1 ファイルにまとめてから送る

次のレッスン

次は rsync で効率的に同期 で、離れたサーバへ安全にファイルを転送するscpコマンドを、ターミナルで実際に操作して習得します を学びます。

事前確認 — 進む前に次の 3 つができることを確認しましょう。

  1. scp の要点を自分の言葉で説明できる
  2. このレッスンの最小コード (または操作手順) を見ずに書ける
  3. 練習問題やクイズで間違えた箇所を読み直して理解した

理解度チェック (30 秒)

Q. scp とは何か、1 文で説明してください。

この章のポイント

A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。

関連レッスン

参考リンク