この記事では、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
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/
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日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。
登録10秒/自動返信でDL/合わなければ解除3秒
