SCPをマスターする:ローカルホストとリモートホスト間でファイルを安全に転送する

scpの構文を学び、安全なアップロード、ダウンロード、再帰的コピー、カスタムSSHポート、ファイル属性の保持を理解します。

SCPマスターガイド:ローカルとリモートホスト間でファイルを安全に転送する

scpはSSH経由でマシン間のファイルをコピーします。サーバーにSSHアクセスがあり、迅速な安全なアップロードやダウンロードが必要な場合に便利です。

大規模な同期ジョブ、中断された転送、または繰り返しのデプロイには、通常rsyncの方が適しています。単純な一回限りのコピーには、scpがシンプルで、ほとんどのUnix系システムで利用可能です。

基本構文

scp [オプション] ソース 宛先

ローカルパスは通常のファイルパスのように見えます。リモートパスは次の形式を使用します:

[ユーザー@]ホスト:/パス/ファイル

ユーザー@を省略すると、scpはSSHログインにローカルユーザー名を使用します。リモートSSHサーバーがデフォルト以外のポートを使用する場合は、大文字の-Pを渡します。小文字の-pはファイル属性を保持することを意味します。

ファイルをアップロードする

ローカルファイルをリモートサーバーにコピーするには:

scp local_report.txt [email protected]:/home/remote_user/documents/

これにより、現在のディレクトリからlocal_report.txtがリモートのdocumentsディレクトリに送信されます。

アップロード中にファイル名を変更するには、宛先ファイル名を含めます:

scp local_report.txt [email protected]:/home/remote_user/documents/report-2026.txt

ファイルをダウンロードする

リモートファイルを現在のローカルディレクトリにコピーするには:

scp [email protected]:~/server_log.tar.gz .

異なるローカル名で保存するには:

scp [email protected]:~/server_log.tar.gz ./prod-server-log.tar.gz

ディレクトリを再帰的にコピーする

ディレクトリツリーをコピーするには-rを使用します:

scp -r local_project_folder [email protected]:/var/www/

これにより、ディレクトリとその内容が宛先にコピーされます。scp -rはトラバーサル中に遭遇したシンボリックリンクをたどるため、予想以上に多くのデータをコピーする可能性があることに注意してください。

カスタムSSHポートを使用する

SSHがポート2222でリッスンしている場合は、大文字の-Pを使用します:

scp -P 2222 local_config.ini [email protected]:/tmp/

SSH設定にポートを記述し、ホストエイリアスを使用することもできます:

Host prod-web
  HostName remote.example.com
  User user
  Port 2222

その後:

scp local_config.ini prod-web:/tmp/

時刻とモードを保持する

小文字の-pを使用して、ソースからの変更時刻、アクセス時刻、ファイルモードビットを保持します:

scp -p important_script.sh user@server:/tmp/

所有権はアーカイブツールのように一般的には保持されません。所有権が重要な場合は、転送後に設定するか、その要件に合わせたデプロイプロセスを使用してください。

詳細モードでトラブルシューティングする

-vを使用してSSH接続の詳細を表示します:

scp -v large_backup.zip user@server:/backups/

詳細出力は、認証失敗、SSH設定の問題、ホストキーの問題、予期しないポートの診断に役立ちます。

圧縮を有効にする(効果的な場合)

-CはSSH圧縮を接続に渡します:

scp -C logs.txt user@server:/tmp/

圧縮は、テキストが多いデータで低速なリンクの場合に役立ちます。.zip.gz.jpg.mp4などの既に圧縮されたファイルにはあまり効果がないかもしれません。

2つのリモートホスト間でコピーする

scpを2つのリモートパスで使用できます:

scp user_a@server_alpha:/data/db.sql user_b@server_beta:/backup/

現在のOpenSSH scpでは、リモート間のコピーはデフォルトでローカルマシンを経由して転送されます。元のホストが宛先ホストに直接接続するように意図的にしたい場合のみ-Rを使用します:

scp -R user_a@server_alpha:/data/db.sql user_b@server_beta:/backup/

-Rを使用する場合、元のホストはパスワードを求められずに宛先に対して認証できる必要があります。

よくある間違いを避ける

スペースを含むリモートパスは引用符で囲みます:

scp "local file.txt" 'user@server:/tmp/local file.txt'

ローカルファイル名にコロンが含まれる場合は、絶対パスまたは明確な相対パスを使用します。scphost:pathをリモートパスとして扱うためです:

scp ./report:final.txt user@server:/tmp/

rootとして、またはシステムディレクトリにコピーする前に、宛先パスを再確認してください。通常の使用では、scpは既存の宛先ファイルを確認なしで上書きします。

SCPかRsyncか?

単純な安全なコピーにはscpを使用します:

  • 1つのファイルをアップロードする。
  • 1つのアーカイブをダウンロードする。
  • 小さなディレクトリを一度コピーする。
  • SSHのみの環境でデータを移動する。

再開可能な転送、効率的な繰り返し同期、削除処理、除外パターン、チェックサム、またはより良い進行状況制御が必要な場合はrsyncを使用します。

まとめ

scp source destinationを使用して、迅速なSSHベースのファイル転送を行います。ディレクトリには-r、カスタムSSHポートには-P、時刻とモードを保持するには-p、SSH接続のトラブルシューティングが必要な場合は-vを追加します。