InfraAcademy

InfraAcademy Blog

scpコマンドでファイルを送信する方法【linuxコマンドを現役エンジニアが解説】

著者: ryu | #Linux #Linux初心者 #コマンド
Linuxをブラウザで試してみる

Linux・ネットワーク・AWSを、環境構築なしで実践学習できます

この記事を共有

こんにちは、InfraAcademyを運営しているryuです。

今回は、scpコマンドを使ってLinux間でファイルを転送する方法を初心者向けに解説します。

Linuxサーバーを使っていると、手元のファイルをサーバーへ送りたい場面や、サーバー上のログを自分のPCへ持ってきたい場面があります。そんなときに、1コマンドでファイルをコピーできるのが scp です。

私自身、エンジニアとして10年以上Linuxやサーバーに触れてきましたが、SSH接続とscpは今でもよく使う基本操作です。特にトラブル時は、まず ssh で接続できるか確認してから scp を試すだけで、原因をかなり切り分けやすくなります。

この記事では、scpの基本文法から、送信・受信、ディレクトリ転送、秘密鍵、ポート指定、エラー対処まで順番に解説します。

scpコマンドとは?

scpは、ネットワーク越しにファイルやディレクトリをコピーするためのOpenSSHのコマンドです。

見た目はLinuxの cp コマンドに似ていますが、コピー先やコピー元に user@host: を付けることで、別のサーバーとの間でファイルを転送できます。

現在のscpはSFTPを使う

古い記事では、scpはSCPプロトコルでファイルを転送すると説明されることがあります。

現在のOpenSSHでは、OpenSSH 9.0以降、scpコマンドは標準でSFTPプロトコルを使って転送します。SSH接続上で認証・暗号化される点は変わりませんが、内部の転送方式は以前と同じではありません。

古いSCPプロトコルを使う必要がある特殊な環境では -O オプションがあります。ただし、通常の新しい環境で意識して使う必要はありません。

scpを使う前にSSH接続を確認する

scpはSSHの認証や接続設定を利用します。

そのため、転送先のサーバーへSSH接続できない状態では、scpも基本的に成功しません。

UbuntuでSSHサーバーを用意する場合は、転送先でOpenSSH Serverをインストールします。

sudo apt update
sudo apt install openssh-server

サービスが動いているか確認します。

sudo systemctl status ssh

続いて、転送元からSSH接続できるか試します。

ssh user@192.168.1.100

ここで正常にログインできれば、scpを使う準備はできています。

SSHサーバーの設定を詳しく知りたい場合は、こちらの記事も参考にしてください。

【関連記事】LinuxでSSH接続する方法|OpenSSHの設定を初心者向けに解説

scpコマンドの基本文法

scpの基本はとてもシンプルです。

ローカル同士のコピーと同じように、コピー元とコピー先を指定します。

scp コピー元 コピー先

リモートサーバーを指定する場合は、次の形式を使います。

user@192.168.1.100:/path/to/file

user がSSHでログインするユーザー名、192.168.1.100 が接続先、コロン以降がリモート側のパスです。

ローカルからサーバーへファイルを送る

まずは、自分のPCにある test.txt をリモートサーバーへ送ってみましょう。

次のコマンドでは、test.txt を192.168.1.100の /home/user/ へコピーします。

scp test.txt user@192.168.1.100:/home/user/

パスワード認証を使っている場合は、SSHと同じようにパスワード入力を求められます。

転送が終わったら、SSHで接続してファイルを確認します。

ssh user@192.168.1.100
ls -l /home/user/test.txt

このように、scpだけを実行して終わるのではなく、実際にコピーされたことまで確認すると操作を覚えやすくなります。

SSHサーバーの構築

サーバーから自分のPCへファイルをコピーする

今度は逆方向です。

リモートサーバーにある /home/user/test.txt を、現在のディレクトリへコピーします。

scp user@192.168.1.100:/home/user/test.txt ./

最後の ./ は、現在いるディレクトリを表します。

例えば障害調査でサーバーのログを手元へ持ってきたい場合も、同じ考え方です。

scp user@192.168.1.100:/var/log/app/error.log ./

ただし、読み取り権限がないファイルはコピーできません。必要な場合は、サーバー側で適切な権限を持つ場所へ一度コピーするなど、権限を確認してから実行します。

Linuxで実際にscpを試す

練習用に空のファイルを作り、転送してみると理解しやすいです。

まず touch でファイルを作成します。

touch test.txt

内容も入れてみましょう。

echo "scp test" > test.txt

続いてリモートサーバーへ送ります。

scp test.txt user@192.168.1.100:/home/user/

scpコマンドの実行結果

転送後はリモート側で cat を使って中身を確認します。

cat /home/user/test.txt

Linuxコマンドは説明だけ読むより、自分で小さなファイルを作って結果を見る方が圧倒的に覚えやすいです。

scpでよく使うオプション

scpには多くのオプションがありますが、初心者が最初に使うものはそれほど多くありません。

よく使うものを表で整理します。

オプション 用途
-r ディレクトリを再帰的にコピー
-P SSHのポート番号を指定
-i 秘密鍵ファイルを指定
-p 更新時刻やパーミッションを維持
-C 転送時に圧縮
-O 古いSCPプロトコルを明示的に使用

ここから、実際に使う場面が多いものだけ見ていきます。

ディレクトリをまとめて転送する

ディレクトリをコピーするときは -r を付けます。

scp -r mydata user@192.168.1.100:/home/user/

mydata の中に複数のファイルやサブディレクトリがあっても、まとめて転送できます。

大量のデータや何度も差分同期する用途では、scpより rsync の方が向いている場合もあります。scpは単発のファイルコピーとして使うと分かりやすいです。

SSHのポート番号を指定する

SSHサーバーが22番以外のポートを使っている場合は、大文字の -P を指定します。

scp -P 2222 test.txt user@192.168.1.100:/home/user/

小文字の -p は別の意味なので注意してください。

-p は元ファイルの更新時刻やアクセスモードを維持するためのオプションです。

秘密鍵を指定する

SSHで公開鍵認証を使っている場合は、-i で秘密鍵を指定できます。

scp -i ~/.ssh/id_ed25519 test.txt \
  user@192.168.1.100:/home/user/

実務ではパスワード認証より公開鍵認証を使う場面が多いため、SSHを学ぶなら鍵認証まで触れておくと役立ちます。

公開鍵暗号の仕組みはこちらの記事で解説しています。

【関連記事】公開鍵暗号方式とは?初心者向けに仕組みを解説

scpでエラーが出たときの確認方法

scpで失敗したとき、いきなり再インストールする必要はありません。

私が確認するときは、まずSSH接続、次にパス、最後に権限を見ることが多いです。

Connection refusedになる場合

例えば次のようなエラーが出ることがあります。

ssh: connect to host 192.168.1.100 port 22: Connection refused
scp: Connection closed

この場合は、接続先でSSHサーバーが動いているか確認します。

sudo systemctl status ssh

IPアドレスやポート番号が正しいか、ファイアウォールでSSHが遮断されていないかも確認してください。

Permission deniedになる場合

接続自体はできているのに Permission denied になる場合は、認証またはファイル権限を確認します。

まず普通のSSHでログインできるか試します。

ssh user@192.168.1.100

ログインできるのに特定の保存先だけ失敗するなら、そのディレクトリへ書き込む権限があるか確認します。

ls -ld /path/to/directory

Linuxの権限がまだ分からない場合は、ファイル権限について先に整理するとエラーの原因を見つけやすくなります。

【関連記事】Linuxのファイル操作と権限を基礎から学ぶ

Windowsでもscpは使える

元記事では、Windowsからscpを使うためにWSLを用意する方法を紹介していました。

現在のWindows 10やWindows 11ではOpenSSHを利用できるため、scpを使うためだけにWSLを用意する必要はありません。

OpenSSH Clientが利用できる環境なら、PowerShellやWindows Terminalから次のように実行できます。

scp .\test.txt user@192.168.1.100:/home/user/

Windowsを転送先にしてSSHサーバーとして使う場合は、OpenSSH Serverを有効化してサービスを起動します。

WSLでLinuxそのものを学びたい場合は、もちろんWSLを使う方法も便利です。

scpはなぜ安全に転送できる?

scpはOpenSSHの仕組みを利用して通信します。

SSH接続では、通信内容が暗号化され、接続先のホスト確認やユーザー認証も行われます。そのため、FTPのように認証情報やデータを平文でやり取りする古い方式と比べて、安全にファイルを転送できます。

ただし、暗号化されているから何も考えなくてよいわけではありません。

初回接続時にはホスト鍵のフィンガープリントを確認し、秘密鍵を他人へ渡さず、サーバー側の権限も必要最小限にします。

scpを覚えるならSSHとLinuxの基礎も一緒に学ぶ

scpはコマンド自体は簡単ですが、エラーが出るとSSH、ネットワーク、Linux権限の知識が必要になります。

IPアドレスが違うのか、22番ポートへ接続できないのか、認証に失敗しているのか、保存先へ書き込めないのかを分けて考えることが大切です。

InfraAcademyでは、LinuxコマンドやSSH、ネットワークをブラウザ上で操作しながら学べます。

コマンドを暗記するだけではなく、実際にファイルを作って転送し、エラーが出たら原因を確認する流れまで経験すると、Linuxの理解が深まります。

InfraAcademyでLinuxを実践的に学ぶ

scpコマンドまとめ

scpは、LinuxやWindowsからリモートサーバーへファイルをコピーできる便利なコマンドです。

基本形は scp コピー元 コピー先 で、リモート側を指定するときは user@host:/path の形式を使います。

また、現在のOpenSSHではscpコマンドのデータ転送にSFTPが標準で使われています。古い記事にあるSCPプロトコル前提の説明とは、この点が変わっています。

最初はファイル1個の送信と受信を試し、慣れてきたら -r、-P、-i などを使ってみてください。

参考

Next Action

記事で読んだ内容を、講座で実装してみましょう

InfraAcademyでは、ブラウザ上でLinuxやネットワークの実践環境を使いながら学習できます。無料で始められる講座から、学習の流れを試せます。

この記事を書いた人

ryu

株式会社InfraAcademy 代表 / エンジニア

大手メーカーでインフラエンジニアとして勤務した後、ベンチャー企業・スタートアップでフルスタックエンジニアを経験。その後、起業し学習サービス「InfraAcademy」を運営しています。
保有資格:ネットワークスペシャリストなど 運営会社:株式会社InfraAcademy

Related

関連記事

ブログ一覧へ

Roadmap

まずはこの4講座から

ログインすれば無料で始められる講座です。気になったテーマから手を動かして学べます。

講座一覧を見る