scpコマンド:使い方とオプション、フォルダーのコピーとポート指定

テスト環境RHEL系AlmaLinux 9.8OpenSSH 9.9p1受信側 Debian 12 · OpenSSH 9.2p1rootアカウント2026-10-28 確認

SSHで接続するサーバーとファイルをやり取りするときに使うコピーツールがscpです。scpコマンドでファイルを送るときは、cpと同じようにコピー元を先に、コピー先を後に書きます。AlmaLinux 9サーバーからDebian 12サーバーへファイルとフォルダーを送り、受け取った結果、転送はSFTPプロトコルで行われ、20MBのファイル1つが1秒以内に届きました。

以下の出力はすべて、送信側のrootアカウントでOpenSSH 9.9のscpを実行した結果そのままです。サーバーのアドレスとアカウント名だけを例の値に置き換えました。

1️⃣ scpの使い方とリモートパス

リモートサーバー側のパスの前には[アカウント@サーバーアドレス:]を付けます。コロンのないパスはコマンドを実行したサーバー内のパスとして認識されるため、コロンが付いている側によって送信か受信かが決まります。

🧭 scpのコピー方向とリモートパス
解説ダイアグラム
↔️ コピー方向
$ scp report.txt user@203.0.113.10:~/scp-test/user@203.0.113.10:~/scp-test/report.txt ./downloads/-3 user@203.0.113.10:~/scp-test/report.txt user@198.51.100.20:~/scp-test/
コピー元💻 コマンドを実行したサーバーreport.txt
➜
コピー先🖥️ リモートサーバー203.0.113.10:~/scp-test/
コピー元🖥️ リモートサーバー203.0.113.10:~/scp-test/report.txt
➜
コピー先💻 コマンドを実行したサーバー./downloads/
コピー元🖥️ リモートサーバーA203.0.113.10:~/scp-test/report.txt
➜
中継💻 コマンドを実行したサーバー-3
➜
コピー先🖥️ リモートサーバーB198.51.100.20:~/scp-test/
🧩 リモートパスの形
user 接続するアカウント、 203.0.113.10 サーバーのアドレスまたはドメイン、 :~/scp-test/ コロンの後はそのサーバーのパス(チルダはホームフォルダー)
ローカルファイルを前に、リモートパスを後に書くと送信です。コロンの後のパスがスラッシュで終わると、そのフォルダーの中に同じ名前で保存します。
リモートパスを前に書くと受信です。受け取ったファイルは後に書いたローカルパスに残ります。
コピー元とコピー先がどちらもリモートサーバーの場合、OpenSSH 8.7からはデータがコマンドを実行したサーバーを経由します。-3を付けたときと同じ方式です。

今のフォルダーのreport.txtを、リモートサーバーのホームの下にあるscp-testフォルダーへ送ります。

scp report.txt user@203.0.113.10:~/scp-test/
report.txt                                    100%   14     5.1KB/s   00:00

転送が終わると、ファイル名と進捗、サイズ、速度、所要時間が1行で表示されます。この進捗表示はターミナルで実行したときだけ現れます。そのため、出力をファイルにリダイレクトして実行すると、ファイルには何も残りません。

受信するときは、リモートパスを前に、保存先のローカルパスを後に書きます。

scp user@203.0.113.10:~/scp-test/report.txt ./downloads/
report.txt                                    100%   14     2.7KB/s   00:00

コピー先のパスをフォルダーではなくファイル名で終えると、その名前で保存されます。以下のコマンドで送った後、受信側のフォルダーにはreport.txtがreport-1028.txtという名前で残っていました。

scp report.txt user@203.0.113.10:~/scp-test/report-1028.txt
report.txt                                    100%   14     4.6KB/s   00:00

🔲 scpコマンドシミュレーター

以下のシミュレーターで、送信と受信、フォルダーコピーのコマンドを実際に入力し、オプションごとの出力を確認できます。

scpコマンドシミュレーターOpenSSH 9.9
[root@server work]#
ブラウザーの中だけで動作します。左の一覧でリモート側のファイルを確認し、↑↓で前に使ったコマンドを呼び出せます。

2️⃣ scpコマンドのオプション

オプションはscpのすぐ後、コピー元の前に書きます。ポートを指定する-Pは大文字で、小文字の-pは時刻と権限を保持するオプションなので、大文字と小文字を間違えると別の動作になります。

-lは転送速度の上限をKbit/s単位で指定します。オプションなしで20MBのファイルを送ったときは、1秒以内に転送が終わりました。

scp backup.tar.gz user@203.0.113.10:~/scp-test/
backup.tar.gz                                 100%   20MB  53.6MB/s   00:00

-l 8000は毎秒約1,000KBに相当します。同じファイルを-l 8000で送ってみると、進捗表示の速度は996.5KB/sとなり、転送には20秒かかりました。

scp -l 8000 backup.tar.gz user@203.0.113.10:~/scp-test/backup-l.tar.gz
backup.tar.gz                                 100%   20MB 996.5KB/s   00:20

-CはSSH接続でデータをgzipと同じ方式で圧縮します。同じ文章を繰り返した19MBのログファイルを3回ずつ送った結果、このサーバー2台の間では-Cを付けた側が少し遅くなりました。

コマンドファイル実行時間進捗表示の速度
scp backup.tar.gz20MB0.68秒53.6MB/s
scp -l 8000 backup.tar.gz20MB20.82秒996.5KB/s
scp access.log(3回)19MB0.79~0.89秒—
scp -C access.log(3回)19MB0.84~0.97秒—

実行時間は、コマンドを開始して接続し、転送を終えるまでの時間です。sshのマニュアルでも、圧縮は低速な回線で効果があり、高速なネットワークでは転送を遅くすると説明しています。

-vは接続から転送までの過程をdebug1の行で出力するため、接続できないときや認証で止まるときに原因を探すのに使います。出力が長いので、grepで認証と転送の行だけを選びました。

scp -v report.txt user@203.0.113.10:~/scp-test/ 2>&1 | grep -E 'Authenticated|Sending|Transferred'
Authenticated to 203.0.113.10 ([203.0.113.10]:22) using "publickey".
debug1: Sending subsystem: sftp
Transferred: sent 2536, received 3248 bytes, in 0.1 seconds

[Sending subsystem: sftp]の行は、scpがSFTPプロトコルでファイルを送ったという意味です。OpenSSH 9.0からscpはSFTPを既定で使います。-Oを付けると古いSCPプロトコルで転送し、同じ場所に[Sending command: scp -v -t]が表示されます。

scp -O -v report.txt user@203.0.113.10:~/scp-test/ 2>&1 | grep -E 'Authenticated|Sending|Transferred'
Authenticated to 203.0.113.10 ([203.0.113.10]:22) using "publickey".
debug1: Sending command: scp -v -t ~/scp-test/
Sending file modes: C0600 14 report.txt
Transferred: sent 2328, received 3036 bytes, in 0.1 seconds

📌 主なオプション: この記事で実行した結果

オプション作業この記事で確認した結果
-PSSH接続ポートを指定ポート22はreport.txtの転送完了、開いていないポート2222は[Connection timed out]で終了
-i公開鍵認証に使う秘密鍵ファイルを指定~/.ssh/id_ed25519を指定してreport.txtの転送完了
-rフォルダー内のファイルとサブフォルダーまでコピー受信側にcssとimagesのフォルダーが元の構造のまま残る、外すと[not a regular file]エラーで転送されない
-pコピー元の更新時刻とアクセス時刻、権限を保持更新時刻は保持、この記事の受信側では権限600は-O -pで送ったファイルだけ保持
-CSSH接続でデータを圧縮この記事のサーバー2台の間の19MBのログでは、付けた側が少し遅い
-l転送速度の上限をKbit/s単位で指定-l 8000で20MBが996.5KB/s、20.82秒
-v接続から転送までの過程をdebug1の行で出力[Sending subsystem: sftp]の行でSFTP転送を確認
-3リモートサーバー2台の間のデータをコマンドを実行したサーバー経由で転送(OpenSSH 8.7からの既定の方式)同じサーバーの2つのフォルダーをコピー元とコピー先にしてreport.txtの転送完了
-O古いSCPプロトコルで転送-vの出力に[Sending command: scp -v -t]が表示される、空白を含むパスはバックスラッシュがさらに必要
-ossh_config形式のオプションをsshに渡すConnectTimeout=10で待ち時間を10秒にして[Connection timed out]を確認

📎 その他のオプション: 公式マニュアルより

オプション作業
-q進捗表示とsshの警告、診断メッセージをオフにする
-Jジャンプホストに先に接続し、そこから最終的な宛先までTCP転送を設定(ProxyJump設定の省略指定、複数のホップはカンマで区切る)
-Fsshのユーザー別設定ファイルを別のファイルに指定(sshにそのまま渡す)
-4IPv4アドレスだけを使うよう強制
-6IPv6アドレスだけを使うよう強制

3️⃣ scpでのフォルダーコピーと時刻の保持

フォルダーをオプションなしで指定すると、scpは通常のファイルではないというエラーを出力し、転送を行いません。

scp site-files user@203.0.113.10:~/scp-test/
scp: local "site-files" is not a regular file
scp: failed to upload file site-files to ~/scp-test/

-rを付けると、フォルダー内のファイルとサブフォルダーまでコピーします。

scp -r site-files user@203.0.113.10:~/scp-test/
logo.png                                      100%   48KB   4.7MB/s   00:00
style.css                                     100%   15     5.0KB/s   00:00
index.html                                    100%   15     5.2KB/s   00:00

出力にはファイル名だけが表示されます。受信側のfindの出力には、site-filesの下にcssとimagesのフォルダーが元の構造のまま入っていました。

ssh user@203.0.113.10 'cd ~/scp-test && find site-files'
site-files
site-files/images
site-files/images/logo.png
site-files/index.html
site-files/css
site-files/css/style.css

-rはフォルダー内のシンボリックリンクをたどって元のファイルをコピーするため、リンクをリンクのまま移す必要があるフォルダーにはrsync -aが適しています。

-pはコピー元の更新時刻とアクセス時刻、権限を保持します。元のreport.txtは更新時刻を2026年10月1日 00:00(UTC)、権限を600に合わせてから送りました。受信側サーバーのタイムゾーンがUTCなので、送信側のlsもTZ=UTCで出力しました。

TZ=UTC ls -l report.txt
-rw------- 1 root root 14 Oct  1 00:00 report.txt
scp -p report.txt user@203.0.113.10:~/scp-test/report-p.txt
report.txt                                    100%   14     4.7KB/s   00:00
scp -O -p report.txt user@203.0.113.10:~/scp-test/report-Op.txt
report.txt                                    100%   14     4.2KB/s   00:00
ssh user@203.0.113.10 'ls -l ~/scp-test/report.txt ~/scp-test/report-p.txt ~/scp-test/report-Op.txt'
-rw------- 1 user user 14 Oct  1 00:00 /home/user/scp-test/report-Op.txt
-rw-rw-r-- 1 user user 14 Oct  1 00:00 /home/user/scp-test/report-p.txt
-rw-rw-r-- 1 user user 14 Oct 28 06:17 /home/user/scp-test/report.txt

-pで送ったreport-p.txtと-O -pで送ったreport-Op.txtは元の時刻が保持され、オプションなしで送ったreport.txtは送った時刻で保存されました。受信側サーバーでは、SFTPで送ったファイルの権限は-pを付けても664で保存され、古いSCPプロトコル(-O)で送ったファイルだけ600が保持されました。

そのため、権限までコピー元と同じにする必要があるファイルは、送った後に受信側でls -lで権限を確認します。

4️⃣ scpでのポートとキーファイルの指定

既定のポート22と既定のキーで接続できないサーバーは、送る前にポートとキーを直接指定します。-PはSSH接続ポートを、-iは公開鍵認証に使う秘密鍵ファイルを指定します。

以下はポート22とキーファイルを直接指定した例です。ポートを変更したサーバーなら、22の代わりにその番号を書きます。

scp -P 22 -i ~/.ssh/id_ed25519 report.txt user@203.0.113.10:~/scp-test/
report.txt                                    100%   14     5.3KB/s   00:00

-iなしで実行すると、sshと同じように~/.sshの下にある既定の名前のキー(id_rsa、id_ecdsa、id_ed25519など)を順に使います。

同じサーバーへよく送るなら、~/.ssh/configに別名を書いておき、scpでは別名だけを入力します。

Host myserver
    HostName 203.0.113.10
    User user
    Port 22
    IdentityFile ~/.ssh/id_ed25519

Hostの行の名前が別名になり、その下の4行がサーバーのアドレスとアカウント、ポート、キーファイルの代わりになります。別名だけを書いたコマンドも、アドレスとキーをすべて書いたときと同じ1行の結果で終わりました。

scp report.txt myserver:~/scp-test/
report.txt                                    100%   14     4.2KB/s   00:00

-Pと-i、別名はいずれもssh接続の設定をそのまま使うため、キーを作成してサーバーに登録する手順も SSHコマンドで接続するときと同じです。

5️⃣ scpでのサーバー間コピー

コピー元とコピー先がどちらもリモートサーバーでも、scp 1行でコピーできます。OpenSSH 8.7からはデータがコマンドを実行したサーバーを経由して転送され、この方式が-3です。公式リリースノートは、コピー元サーバーにコピー先サーバーの認証情報を置かなくて済むことを、既定の方式に変えた理由に挙げています。

以下の実測は、コピー元とコピー先を同じサーバーの2つのフォルダーにして実行しました。コピー先のサーバーが異なる場合は、後ろのアカウントとアドレスだけを変えます。

scp -3 user@203.0.113.10:~/scp-test/report.txt user@203.0.113.10:~/scp-test/copy3/
report.txt                                    100%   14     2.5KB/s   00:00

支店2か所の間の書類を本社が受け取って送り直すのと同じです。

コピー元サーバーがコピー先サーバーへ直接送っていた以前の方式は-Rで指定します。この方式では、コピー元サーバーからコピー先サーバーへパスワードなしで接続できる必要があります。OpenSSH 10.6からは-Rを使うと非推奨の警告が表示され、以降のバージョンではこのオプションを無視して-3の方式でコピーする予定です。

6️⃣ scpとrsyncの比較

ファイルを数個1回送るだけならscpで十分で、同じフォルダーを繰り返し同期したり、途切れた転送を再開したりする作業には rsyncコマンドが適しています。scpは実行のたびに指定したファイル全体を送り直し、rsyncはコピー元とコピー先を比較して変更されたファイルだけを転送します。

項目scprsync
転送範囲実行のたびに指定したファイル全体コピー元と比較して変更されたファイルのみ
途中まで受信したファイルの保持(--partial)❌✅
コピー元にないファイルの削除(--delete)❌✅
シンボリックリンクたどって元のファイルをコピー-aでリンクのまま
受信側に必要なものSSH接続とSFTPサーバー両側ともrsyncをインストール

7️⃣ scpコマンドのエラーメッセージと対処

scpが失敗すると、原因は出力の1行目にそのまま表示されます。存在しないファイル、書き込み権限、誤ったポートで意図的にエラーを起こした3つのケースすべてで1行目に原因が表示され、終了コードもすべて0ではありませんでした。

🔲 No such file or directory

リモート側に存在しないファイルを受信しようとすると、パスとともに[No such file or directory]が出力されます。

scp user@203.0.113.10:~/scp-test/nofile.txt ./downloads/
scp: ~/scp-test/nofile.txt: No such file or directory

送信時にコピー先のフォルダーがなくても同じエラーになります。scpは存在しないフォルダーを作成しないため、sshでmkdir -pを先に実行してフォルダーを作成します。

scp report.txt user@203.0.113.10:~/scp-test/nodir/sub/
scp: dest open "scp-test/nodir/sub/": No such file or directory
scp: failed to upload file report.txt to ~/scp-test/nodir/sub/

🔲 Permission denied

受信側のフォルダーに書き込み権限がないと、[dest open]の後に[Permission denied]が続きます。以下は権限を555にしたreadonlyフォルダーへ送った結果です。

scp report.txt user@203.0.113.10:~/scp-test/readonly/
scp: dest open "scp-test/readonly/report.txt": Permission denied
scp: failed to upload file report.txt to ~/scp-test/readonly/

[Permission denied]の前に[アカウント@サーバーアドレス:]が付き、かっこ内にpublickeyのような認証方式が入っている場合は、接続の認証段階で拒否されたケースです。この文言はsshプログラムが認証に失敗したときに出す形式なので、-iで指定したキーファイルとサーバーに登録した公開鍵から確認します。

🔲 Connection timed out

ポート番号が間違っているか、ファイアウォールがそのポートをブロックしていて応答がないと、接続を待った末に[Connection timed out]で終わります。以下は待ち時間を10秒にして、開いていないポート2222へ送った結果です。

scp -P 2222 -o ConnectTimeout=10 report.txt user@203.0.113.10:~/scp-test/
ssh: connect to host 203.0.113.10 port 2222: Connection timed out
scp: Connection closed

このエラーが出たら、-Pに書いた番号がサーバーのSSHポートと同じかどうかから確認します。

🔲 パスの空白とチルダ(~)

SFTPで転送する現在のscpは、空白を含むリモートパスをシングルクォートで1回囲むだけで済みます。

scp report.txt 'user@203.0.113.10:~/scp-test/my files/'
report.txt                                    100%   14     4.7KB/s   00:00

同じコマンドに-Oを付けて古いSCPプロトコルで送ってみると、[ambiguous target]で失敗しました。古いSCPプロトコルではリモートシェルがパスをもう一度解釈するためです。

scp -O report.txt 'user@203.0.113.10:~/scp-test/my files/'
scp: ambiguous target

この場合は空白の前にバックスラッシュを入れ、リモートシェルでも1つの単語として読まれるようにします。

scp -O report.txt 'user@203.0.113.10:~/scp-test/my\ files/'
report.txt                                    100%   14     4.5KB/s   00:00

コロンの後のパスをスラッシュやチルダなしで始めると、リモートアカウントのホームフォルダーを基準に処理されます。

scp report.txt user@203.0.113.10:scp-test/report-rel.txt
report.txt                                    100%   14     5.6KB/s   00:00

公式マニュアルは、古いSFTPサーバーがチルダで始まるパスをホームフォルダーに展開できないときに-Oを使うよう説明しています。この場合は、上のようにチルダなしでホーム基準のパスを書いても同じ場所に保存されます。

🔢 FAQ & おすすめコンテンツ

同じ名前のファイルがあると、確認なしで新しいファイルに上書きされます。同じreport.txtを同じフォルダーへ何度か送ったときも、確認なしで毎回転送されました。そのため、残す必要があるファイルは、コピー先パスの末尾に別の名前を書いて送ります。

リモートパスに*を入れてシングルクォートで囲むと、リモートサーバーで名前が一致するファイルをすべて受信します。リモートサーバーのreport-*.txtを受信した結果、名前が一致するファイル6つが順に転送されました。クォートは、コマンドを実行したサーバーのシェルが*を先に解釈しないようにするためのものです。

-Bを付けると、パスワードやパスフレーズを聞かないバッチモードで実行されます。公式マニュアルによると、このモードではパスワードを入力できないため、cronのような自動処理には先にキー認証を設定します。

🧭 ネットワークコマンドのおすすめコンテンツ 記事13・参照2
🗂️ ネットワークコマンド
📄 ipコマンド 📄 netstat・ifconfigコマンド 📄 nmtuiコマンド
📄 SSHコマンド 📄 rsyncコマンド 📄 wgetコマンド 📄 rz・szコマンド 📄 scpコマンド
📄 hostコマンド 📄 nslookupコマンド
📄 iptablesコマンド 📄 firewall-cmdコマンド 📄 certbotコマンド
Linux SSH(Secure Shell)
Linux · 接続
SSHコマンド:オプションと使い方
LinuxのSSH(Secure Shell)は、ネットワークを通じて別のシステムへ安全に接続できるようにするプロトコルです。
記事を見る →現在の記事
rsyncコマンド_ローカルからリモートへ送る
Linux · 転送
Linux rsyncコマンド: オプションと使用例
サーバー2台のフォルダーを揃えるために毎回全体をコピーし直すと、変わったファイルが1つでも転送量はフォルダー全体のままです。
記事を見る →現在の記事
Linux TOPコマンド:コマンドラインインターフェース(CLI-Command-Line Interface)
Linux · 転送
Linux wgetコマンド
wgetコマンドは、WebのダウンロードリンクをLinuxのコマンドラインから実行してダウンロードするコマンドです。
記事を見る →現在の記事
lrzszツールのインストール - Rocky Linux
Linux · 転送
Linux:lrzszツールのインストールとファイルのアップロード(rz)・ダウンロード(sz)
Linux OSでrzとszによるファイルのアップロードとダウンロードのコマンドを実行するには、サーバーにlrzszがインストールされている必要があります。
記事を見る →現在の記事
scpコマンドのコピー方向とリモートパスの説明図:サーバー2台の間のコピーはコマンドを実行したサーバーを経由して転送
Linux · 転送
scpコマンド:使い方とオプション、フォルダーのコピーとポート指定
SSHで接続するサーバーとファイルをやり取りするときに使うコピーツールがscpで、scpコマンドでファイルを送るときは、cpと同じようにコピー元を先に、コピー先を後に書きます。
記事を見る →現在の記事

ℹ️ 提携について
当サイトのコンテンツにはアフィリエイトリンクが含まれています。訪問者がこのリンクを通じて商品やサービスを購入すると、当サイトは販売元から手数料を受け取ります。この過程において、購入者が支払う金額(イベント割引適用で金額が下がります↓)は上昇しません。掲載されている価格・割引・在庫情報は作成時点のものであり、実際とは異なる場合がありますので、ご購入前に販売元にて最終確認をお願いいたします。商品の選定および評価は独自の基準に基づいて行われており、手数料の支払いの有無は紹介順や評価内容に影響を与えません。

コメントを残す

メールアドレスが公開されることはありません。 ※ が付いている欄は必須項目です

人間であることを証明してください: 9   +   6   =