scpコマンドは、SSHの仕組みを使ってローカルとリモートの間でファイルを安全に転送できる定番ツールです。
LinuxやmacOSだけでなく、Windowsのターミナル環境でも利用されることが多く、サーバ運用や開発現場ではほぼ必須の存在と言えます。
一方で、scpコマンドの構文やオプションをしっかり押さえていないと、転送元と転送先を逆にしてしまったり、権限エラーでつまずいてしまうことがあります。
この記事では、scpコマンドの基本構文と代表的な使い方5パターンから、よく使うオプションやエラー対処のコツまで、実務で困らないレベルを丁寧に整理します。
これからscpコマンドを使い始める人はもちろん、なんとなく使ってきた人が理解を深めるのにも役立つ内容を目指します。
scpコマンドの基本構文と使い方5パターン
このセクションでは、scpコマンドの基本構文を押さえつつ、現場でよく使う5つの典型パターンを具体例とともに整理します。
どのパターンも「転送元」と「転送先」の書き方が分かれば理解しやすく、応用も効きます。
最初に構文の型をしっかり頭に入れておくことで、コピペに頼らずに自分でコマンドを組み立てられるようになります。
ここで紹介する5パターンを押さえれば、日常的なファイル転送のほとんどはscpコマンドだけでこなせるはずです。
ローカルからリモートへコピー
もっとも基本的な使い方は、手元のローカル環境からリモートサーバへファイルをアップロードするパターンです。
構文は「scp 転送元パス ユーザー名@ホスト名:転送先パス」という形になり、コロンの右側がリモート側のパスになります。
例えば「scp local.txt user@example.com:/home/user/」のように書くと、カレントディレクトリのlocal.txtがリモートの指定ディレクトリにコピーされます。
ポート番号や鍵ファイルを特に指定しなければ、SSHのデフォルトポート22番と、標準のSSH設定で定義された鍵が使われます。
まずはこの「ローカルからリモートへ」の基本形を起点に、他のパターンとの違いを理解していくと分かりやすいです。
リモートからローカルへコピー
次に頻繁に使うのが、リモートサーバからローカル環境へファイルをダウンロードするパターンです。
構文の形は同じですが、今度は転送元として「ユーザー名@ホスト名:パス」を書き、転送先にローカルのパスを指定する点がポイントです。
例えば「scp user@example.com:/home/user/log.txt ./」とすれば、サーバ上のlog.txtをカレントディレクトリにコピーできます。
誤って転送方向を逆にするとリモート上のファイルを上書きしてしまうことがあるため、どちら側が転送元かを落ち着いて確認する習慣が大切です。
特に本番サーバの重要ファイルを扱うときは、実行前に一度声に出して方向を確認するくらい慎重でもよいでしょう。
リモート同士でコピー
scpコマンドは、ローカルを経由しながらもリモート同士のコピーを1回のコマンドで実行できるのが便利な特徴です。
構文としては「scp ユーザー名1@ホスト1:パス ユーザー名2@ホスト2:パス」となり、両方ともリモートパスの形式で指定します。
このとき、実際にはローカルから両サーバへSSH接続して転送を仲介するイメージですが、ユーザーから見るとリモート間コピーとして扱えます。
バックアップサーバやステージング環境へのコピーなど、サーバ間で同じデータを揃えたいときに重宝する使い方です。
ただしネットワーク帯域の使われ方やセキュリティポリシーの観点から、運用ルールに沿って使うことを意識しておきましょう。
ディレクトリを再帰的にコピー
ファイル単体ではなくディレクトリ全体をコピーしたい場合は、scpコマンドに「ディレクトリを再帰的にコピーする」ためのオプションを付けます。
一般的には「scp -r ディレクトリ ユーザー名@ホスト名:転送先パス」のように「-r」を指定し、階層ごとまるごと転送する形になります。
例えば「scp -r public_html user@example.com:/var/www/」とすれば、public_html以下のファイルやサブディレクトリがすべてコピーされます。
ディレクトリ構造ごとコピーすると転送量が大きくなりがちなので、不要なログやキャッシュを事前に削除しておくと転送時間を短縮できます。
「とりあえず全部」という感覚で多用するとトラブルの元になるため、対象ディレクトリの中身を一度見直すことをおすすめします。
ポートや鍵を指定してコピー
運用環境ではSSHのポート番号がデフォルトの22番以外になっていたり、接続に秘密鍵ファイルを使うことが一般的です。
scpコマンドでは「-P」でSSHポート番号、「-i」で秘密鍵ファイルを指定でき、SSHクライアントと同じ感覚でセキュアな接続を確立できます。
例えば「scp -P 2222 -i ~/.ssh/id_rsa sample.txt user@example.com:/home/user/」のように書くと、ポート2222と指定鍵で安全に転送できます。
これらのオプションを組み合わせることで、本番環境でもセキュリティポリシーに沿ったファイル転送が可能になります。
よく使う接続先については、SSHの設定ファイルにホスト定義を書いておき、scpコマンドは短いホスト名だけで済むようにしておくと日々の運用が楽になります。
scpコマンドで転送できる範囲と仕組み
ここからは、scpコマンドが内部でどのように動いているのかと、どの範囲まで転送できるのかを整理します。
仕組みを押さえておくと、セキュリティ上の安心感が増し、なぜ暗号化されるのか、どこまで信頼してよいのかを説明できるようになります。
また、「どのホスト同士なら転送できるのか」「どのユーザー権限なら成功するのか」といった運用上の疑問にも答えられるようになります。
scpコマンドの特徴を理解することは、単なるコマンドの丸暗記から一歩進んだ活用につながります。
scpの役割と特徴
scpは「Secure Copy」の略で、その名の通りSSHを用いてファイルを安全にコピーするためのコマンドです。
通信経路はSSHによって暗号化されるため、ネットワーク経由でも盗聴されにくく、パスワードやファイル内容が平文で流れることはありません。
古いrcpコマンドに似た構文を持ちながら、現代的なセキュリティ要件に応えられる点が長年にわたり支持されている理由です。
シンプルな構文でローカルからリモート、リモートからローカル、リモート同士のコピーまでこなせるのが実務上の大きな強みです。
ただし転送中の再開や詳細な同期などには弱みもあるため、必要に応じてrsyncなどと使い分けるのが現実的です。
SSH接続との違いと共通点
scpコマンドはSSHの仕組みを内部で使っているため、認証方式や暗号化方式はSSHクライアントと共通です。
例えばパスワード認証、公開鍵認証、多要素認証など、SSHサーバで許可されている方式をそのまま利用できます。
一方で、sshコマンドが対話的なログインシェルの起動を目的としているのに対し、scpはファイルを転送して終了することに特化しています。
ポート番号や鍵ファイルの指定方法などもほぼ同じなので、sshコマンドに慣れている人はscpコマンドも違和感なく扱えるはずです。
逆に言えば、SSHの設定やアクセス制御に問題があるとscpも一緒に失敗するため、両者の関係をセットで意識しておくことが重要です。
scpで指定できる宛先の形式
scpコマンドで使える宛先の書き方を整理しておくと、「この書き方で合っているかな」という不安を減らせます。
パスの前に「ユーザー名@ホスト名:」が付いているかどうかで、ローカルかリモートかを判定していることを理解しておきましょう。
よく使う形式を一覧にすると、次のようなパターンに整理できます。
- localfile
- user@remotehost:/path/to/file
- remotehost:/path/to/file
- user@192.168.0.10:/path/to/dir
- ./relative/path
- /absolute/path
どの形式でも、コロンの左側にホスト指定があればリモート、なければローカルというルールさえ覚えておけば迷いにくくなります。
scp転送の基本パラメータ
scpコマンドは、内部的にはいくつかの重要なパラメータを組み合わせて転送を実現しています。
これらの要素を分解して考えることで、「どの部分を誤るとどんなエラーになるのか」をイメージしやすくなります。
代表的なパラメータを表形式で整理すると、次のようになります。
| 要素 | 役割の概要 |
|---|---|
| ホスト名 | 接続先サーバの識別 |
| ユーザー名 | 接続に利用するアカウント |
| ポート番号 | SSH接続に使うポート |
| 鍵ファイル | 公開鍵認証に使う秘密鍵 |
| ファイルパス | 転送元と転送先の場所 |
| オプション | 圧縮や再帰コピーなどの指定 |
コマンドがうまく動かないときは、この表の要素を一つずつ確認していくと原因を切り分けやすくなります。
scpコマンドのオプション活用テクニック
scpコマンドには、単純なコピーだけでなく転送を最適化したり制御したりするためのオプションが多数用意されています。
オプションを適切に組み合わせることで、ネットワーク帯域を守りながら安全にファイルを送ることができます。
ここでは、日常的によく使われるオプションと、それらをどのように組み合わせると便利かという観点で整理します。
暗記するというよりは、「こういう用途のときにこのオプションを思い出せるかどうか」が大切です。
ディレクトリ転送と再帰コピー
ディレクトリをそのまま転送したいときに欠かせないのが「-r」オプションで、scpコマンドに再帰コピーの挙動を指示します。
「scp -r srcdir user@example.com:/home/user/」のように実行すると、ディレクトリ構造ごとサーバ側に複製されます。
ただし不要なファイルまでそのまま送ってしまうと転送時間が伸び、ディスク容量も圧迫されるため、事前に整理しておくことが重要です。
とくに大量のログやキャッシュファイルが混ざっているディレクトリは、転送対象をサブディレクトリ単位で細かく分けるなどの工夫が有効です。
再帰コピーは強力なぶん破壊力も大きいため、本番環境への適用前にテスト環境で挙動を確認しておくと安心です。
通信を圧縮して高速化する
ネットワーク帯域が限られている環境や、大きなファイルをまとめて転送したい場面では、scpコマンドの圧縮オプションが役立ちます。
一般的には「-C」オプションを付けることで、SSHの圧縮機能が有効になり、回線状況によっては転送時間を短縮できます。
テキストファイルやログのように圧縮効率が高いデータほど、圧縮の効果を感じやすくなります。
逆に、動画や画像のようにすでに圧縮されているデータでは、CPU負荷だけ増えて速度がほとんど変わらないこともあります。
圧縮オプションを使うべきか判断するための観点を整理すると、次のようになります。
- 回線速度が遅い環境かどうか
- ファイルがテキスト中心かどうか
- サーバのCPUに余裕があるかどうか
- 転送の頻度と一度あたりの容量
- 他のトラフィックへの影響の有無
これらを踏まえつつ、テストしながら最適な設定を見つけていくのが現実的なアプローチです。
ポート番号と鍵ファイルの指定方法
本番環境では、SSHのポート番号を標準の22番から変更しているケースや、必ず秘密鍵で認証しなければならないケースが一般的です。
scpコマンドでポート番号を変えたいときは「-P 2222」のように大文字のPで指定し、SSHと同じポートに合わせます。
また秘密鍵ファイルを指定するには「-i ~/.ssh/id_rsa」のようにして、接続に使う鍵をscpコマンド側にも明示します。
これらのオプションは組み合わせて使えるため、「scp -P 2222 -i ~/.ssh/id_rsa file user@example.com:/home/user/」のような形が実務ではよく登場します。
よくアクセスする環境であれば、SSHの設定ファイルにHostエントリを定義し、scpコマンドでは短いホスト名と最小限のオプションだけで済むようにしておくと効率的です。
転送品質を調整するオプション一覧
scpコマンドには、ログの出力や帯域の制限など、転送品質を調整するためのオプションもいくつか用意されています。
運用状況に応じてこれらを使い分けることで、他のサービスに負荷をかけすぎない穏やかな転送が可能です。
代表的なオプションと役割を表にまとめると、次のようになります。
| オプション | 主な用途 |
|---|---|
| -v | 詳細なログ出力 |
| -l | 帯域の上限設定 |
| -p | タイムスタンプ保持 |
| -q | 進行表示の抑制 |
| -4 | IPv4強制 |
| -6 | IPv6強制 |
どのオプションも使いどころを理解しておけば、scpコマンドをより周囲に優しい形で運用できるようになります。
scpコマンドでよくあるエラーと対処法
scpコマンドはシンプルな構文の一方で、環境や権限の違いからさまざまなエラーに遭遇することがあります。
エラーの多くは、ホスト名の誤りやポート番号の不一致、権限不足、パスの指定ミスなど、基本的な要因に起因しています。
ここでは、実務でよく見かけるエラーをテーマごとに整理し、原因と対処の考え方をまとめます。
エラー文を眺めるだけで焦らずに、落ち着いて切り分けができるようになることを目標にしましょう。
ホストに接続できないとき
「Connection timed out」や「Name or service not known」といったエラーは、そもそも接続先ホストに到達できていないことを示します。
この場合はネットワークレベルの問題が多いため、scpコマンドだけを見直しても解決しないことがあります。
切り分けの観点としては、次のようなチェックポイントを順番に確認していくと効率的です。
- ホスト名やIPアドレスのタイプミスの有無
- DNSでホスト名が正しく引けているかどうか
- SSHポートがファイアウォールで許可されているか
- VPNやプロキシ経由が必要なネットワークかどうか
- サーバ自体が稼働しているかどうか
どの段階で問題が起きているかを切り分けることで、ネットワーク担当者への相談もしやすくなります。
Permission deniedが出るとき
「Permission denied」エラーは、認証に失敗している場合と、ファイルやディレクトリの権限が不足している場合の両方で発生します。
まずはユーザー名や鍵ファイルが正しいかを確認し、同じユーザーでsshコマンドによるログインができるかどうかを試すと切り分けやすいです。
SSHログインができるにもかかわらずscpだけ失敗する場合は、転送先ディレクトリに書き込み権限がない可能性が高くなります。
サーバ側で「ls -ld /path/to/dir」のようにパーミッションを確認し、必要であれば所有者や権限設定を見直します。
本番環境では安易に権限を緩めるのではなく、最小限の変更で目的を達成できるように慎重に調整することが重要です。
タイムアウトや途中で止まるとき
大きなファイルを転送しているときに途中で止まったり、タイムアウトしてしまう問題は、ネットワーク品質やサーバ負荷に起因することが多いです。
同じ環境で小さなファイルなら成功する場合は、帯域制限や回線の瞬断、セッションタイムアウトなどの可能性を疑います。
scpコマンド自体には途中から再開する機能がないため、重要なファイルについては分割して送るか、必要に応じてrsyncなどの別ツールを検討するのも現実的です。
また、同一ネットワーク内で無理に圧縮オプションを使ってCPU負荷を高めてしまうと、結果としてタイムアウトしやすくなるケースもあります。
何度も同じ問題が起きる場合は、ネットワーク構成やSSHサーバの設定も含めて広い視野で見直すことが大切です。
エラーと原因の対応関係
よくあるエラーメッセージとその原因をあらかじめ対応付けておくと、実際に問題が起きたときに焦らず対処できます。
すべてを暗記する必要はありませんが、代表的なパターンを頭に入れておくと原因のあたりを付けやすくなります。
代表的なエラーと主な原因をまとめると、次のようになります。
| エラー例 | 主な原因 |
|---|---|
| Connection timed out | ネットワーク不達 |
| Name or service not known | ホスト名解決失敗 |
| Permission denied | 認証失敗や権限不足 |
| No such file or directory | パス指定の誤り |
| Network is unreachable | ルーティングやVPN設定 |
| Connection refused | ポート未開放やSSH停止 |
実際のメッセージは環境によって多少異なりますが、この表を軸にして原因の候補を絞り込んでいくと、問題解決がスムーズになります。
scpコマンドを日常運用に生かすポイント
scpコマンドは、構文自体はシンプルでも、実運用で安全かつ効率的に使うためにはいくつかのコツがあります。
まずは「転送元と転送先のどちらがリモートなのか」を毎回意識して確認し、誤上書きを防ぐ習慣を身に付けることが重要です。
次に、-rや-C、-P、-i、-lなどの代表的なオプションを自分の現場に合わせて選び、テンプレート化しておくと作業が安定します。
よく使う接続先については、SSHの設定ファイルにホスト定義をまとめ、scpコマンドでは短いホスト名とシンプルな構文で済むように整えると効率が上がります。
また、エラーに遭遇したときには、ネットワーク、認証、権限、パスという基本要素に分解しながら原因を絞り込んでいく姿勢が大切です。
scpコマンドの得意な領域と苦手な領域を理解し、場合によってはrsyncやSFTPなど別のツールと組み合わせて使う柔軟さも持っておきたいところです。
この記事で整理した構文パターンとオプション、エラー対処の視点を押さえておけば、日々のサーバ運用や開発作業でscpコマンドを安心して活用できるようになるでしょう。
少しずつ手を動かしながら、自分の環境に合ったscpコマンドの使い方を育てていってください。

