scpコマンドでLinuxサーバー間のファイル転送を安全に行う方法


図解60p「Linuxサーバー構築入門マニュアル」無料
登録10秒/自動返信でDL/合わなければ解除3秒
HOMELinux技術 リナックスマスター.JP(Linuxマスター.JP)Linuxコマンド, LinuxコマンドP-T, ネットワーク管理コマンド > scpコマンドでLinuxサーバー間のファイル転送を安全に行う方法
「開発環境のファイルを本番サーバーに転送したいけど、FTPはセキュリティが心配」 「scpコマンドを使ったら Permission denied で転送できない」 サーバー間でファイルをやり取りする場面は、Linuxの運用で日常的に発生します。FTPは通信が暗号化されないため、現場ではSSHベースの転送手段が標準です。

この記事では、SSH経由でファイルを安全に転送する scp コマンドの使い方を解説します。ローカル→リモート・リモート→ローカルの基本転送から、ディレクトリごとの転送、ポート指定、圧縮転送、rsyncとの使い分けまで網羅しました。

scpコマンドとは?

scp(Secure Copy)は、SSH(Secure Shell)の仕組みを使ってファイルを転送するコマンドです。

通信内容が暗号化されるため、パスワードやファイルの中身が盗聴される心配がありません。SSHで接続できる環境であれば、追加のソフトウェアなしですぐに使えます。

基本構文は以下の通りです。

# scp [オプション] コピー元 コピー先 scp ファイル名 ユーザー名@ホスト:パス

コピー元・コピー先のどちらかに「ユーザー名@ホスト:パス」の形式を指定することで、リモートサーバーとの間でファイルを転送できます。

基本的な使い方

1. ローカルからリモートへファイルを転送する

手元のファイルをリモートサーバーに送る、最も基本的な使い方です。

# ローカルの app.conf をリモートサーバーの /etc/httpd/conf.d/ に転送する scp app.conf user@192.168.1.100:/etc/httpd/conf.d/ # 転送先のファイル名を変えたい場合はパスにファイル名を指定する scp app.conf user@192.168.1.100:/etc/httpd/conf.d/app_new.conf

実行するとSSHのパスワード(または鍵認証)を求められ、認証が通ればファイルが転送されます。

2. リモートからローカルへファイルを取得する

リモートサーバー上のファイルを手元にダウンロードする場合は、コピー元にリモートのパスを指定します。

# リモートサーバーの httpd.conf をカレントディレクトリに取得する scp user@192.168.1.100:/etc/httpd/conf/httpd.conf . # 別名で保存する場合 scp user@192.168.1.100:/etc/httpd/conf/httpd.conf ./httpd.conf.bak

設定ファイルの差分確認やバックアップ取得で頻繁に使うパターンです。

3. ディレクトリごと転送する(-r)

ディレクトリを中身ごと転送するには -r(recursive)オプションを付けます。

# ローカルの html ディレクトリをリモートに転送する scp -r /var/www/html user@192.168.1.100:/var/www/ # リモートのログディレクトリをローカルに取得する scp -r user@192.168.1.100:/var/log/httpd ./httpd_logs

-r を付けないとディレクトリは転送されず、エラーになります。

4. ポート番号を指定する(-P)

SSHのポートがデフォルトの22以外の場合は、-P(大文字のP)でポート番号を指定します。

# ポート2222でファイルを転送する scp -P 2222 app.conf user@192.168.1.100:/etc/httpd/conf.d/

ssh コマンドは小文字の -p ですが、scp は大文字の -P です。これはよくある間違いなので注意してください。

実務で役立つオプション

1. 転送を圧縮して高速化する(-C)

-C オプションを付けると、転送データをgzipで圧縮します。回線速度が遅い環境やテキストファイルの転送で効果を発揮します。

# 圧縮転送する scp -C largefile.log user@192.168.1.100:/tmp/

ただし、すでに圧縮されたファイル(.gz、.zipなど)に対しては、圧縮処理のオーバーヘッドで逆に遅くなることがあります。

2. 帯域を制限する(-l)

本番環境で大きなファイルを転送するとき、回線を占有してサービスに影響を与えたくない場合は -l で帯域を制限できます。単位はKbit/s(キロビット毎秒)です。

# 帯域を1Mbps(1000Kbit/s)に制限して転送する scp -l 1000 backup.tar.gz user@192.168.1.100:/backup/

3. タイムスタンプとパーミッションを保持する(-p)

-p(小文字のp)を付けると、元ファイルの更新日時・アクセス日時・パーミッションを保持したまま転送します。

# タイムスタンプとパーミッションを保持して転送する scp -p config.yml user@192.168.1.100:/opt/app/

ファイルの更新日時でバージョン管理をしている場合は、このオプションを付ける習慣にしておくと安全です。

4. SSH configと組み合わせる

~/.ssh/config にホスト情報を設定しておけば、scpでも短い名前で接続できます。

# ~/.ssh/config の設定例 Host webserver HostName 192.168.1.100 User admin Port 2222 IdentityFile ~/.ssh/id_ed25519

この設定があれば、以下のように短く書けます。

# config設定済みのホスト名で転送する scp app.conf webserver:/etc/httpd/conf.d/

ポート番号や秘密鍵のパスを毎回指定する必要がなくなるので、複数サーバーを管理する現場では必須の設定です。

「Permission denied」が出た時の対処法

scpで最もよく見るエラーがこれです。原因は大きく3つあります。

SSHの認証に失敗している:パスワードが間違っている、または鍵認証の設定が正しくない。ssh コマンドで先にログインできるか確認する
転送先ディレクトリの書き込み権限がない:一般ユーザーで /etc 配下に書き込もうとしている場合など。転送先のパーミッションを確認する
SELinuxが拒否している:SELinuxが有効な環境では、パーミッションは正しくても拒否されることがある。/var/log/audit/audit.log を確認する

# まずSSHでログインできるか確認する ssh user@192.168.1.100 # 転送先ディレクトリの権限を確認する ssh user@192.168.1.100 ls -ld /etc/httpd/conf.d/

「Connection refused」が出た時の対処法

このエラーは、リモートサーバーでSSHサービス(sshd)が起動していないか、ファイアウォールでSSHポートがブロックされている場合に発生します。

sshdの状態を確認する:systemctl status sshd でサービスが起動しているか確認する
ポート番号を確認する:SSHのポートがデフォルトの22から変更されていないか /etc/ssh/sshd_config を確認する
ファイアウォールを確認する:firewall-cmd --list-all でSSHポートが許可されているか確認する

「No such file or directory」が出た時の対処法

転送元または転送先のパスが間違っている場合に発生します。

ローカル側のパスミス:ファイルが存在するか ls -la で確認する
リモート側のパスミス:リモートのディレクトリが存在するか ssh user@host ls -ld /転送先/ で確認する
ホームディレクトリの指定:リモートのパスを省略すると、接続ユーザーのホームディレクトリが転送先になる(例:scp file user@host:

scpとrsyncの使い分け

ファイル転送には rsync という選択肢もあります。使い分けの基準は以下の通りです。

scpが向いている場面:単発のファイル転送、数個のファイルをサッと送りたい場合。追加インストール不要で手軽
rsyncが向いている場面:大量ファイルの同期、差分転送が必要な場合、定期バックアップ。転送済みファイルをスキップするため大幅に高速化できる

迷ったときの判断基準はシンプルです。「1回きりの転送ならscp」「繰り返し同期するならrsync」と覚えておけば、まず間違いありません。

# rsyncでSSH経由の差分同期をする場合(参考) rsync -avz -e ssh /var/www/html/ user@192.168.1.100:/var/www/html/

本記事のまとめ

やりたいこと コマンド
ローカル→リモートにファイル転送 scp ファイル名 user@host:/パス/
リモート→ローカルにファイル取得 scp user@host:/パス/ファイル名 .
ディレクトリごと転送 scp -r ディレクトリ名 user@host:/パス/
ポート番号を指定して転送 scp -P ポート番号 ファイル名 user@host:/パス/
圧縮して転送 scp -C ファイル名 user@host:/パス/
帯域を制限して転送 scp -l 帯域(Kbit/s) ファイル名 user@host:/パス/
タイムスタンプ・パーミッションを保持 scp -p ファイル名 user@host:/パス/

scpだけで終わらせず、サーバー構築の全体像を押さえませんか?

ファイル転送はサーバー運用の基本中の基本ですが、SSH鍵認証やファイアウォール設定と組み合わせてこそ、安全な運用が実現します。
ネットの切れ端の情報をコピペするだけでなく、現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。

「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。



無料プレゼント
図解60p「Linuxサーバー構築入門マニュアル」
独学で詰まる前に、“型(手順書)”で最初の環境構築をサクッと終わらせましょう。
登録10秒/自動返信でDL/合わなければ解除3秒
無料で受け取る ※メールアドレスだけでもOK(必須項目は最小限)

宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として15年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

図解60pのLinux無料マニュアル
登録10秒/自動返信でDL
無料で受け取る