LinuxでSCPを使用してファイルを安全に転送する方法

リモートLinuxサーバーにファイルを転送する際には、いくつかのオプションがあります。その中で最も優れた方法の1つは、SSHプロトコルを介してファイルを迅速にネットワーク上でリモートシステムに転送するSecure Copy(SCP)と呼ばれるプログラムを使用することです。このチュートリアルでは、LinuxでSCPを使用してファイルを安全に転送する方法を示します。
目次
- SSHの設定
- SSHを介してシステムに接続する
- SCPを使用してファイルを転送する
- SCPでのファイル転送の圧縮
- SCPによるデータ転送の最適化
- SCPでの帯域幅の使用制限
- SCPを使用したリモートからリモートへの転送
- SCPを使用したプロキシ
- SCPでのデフォルトポートの変更
- SCPの静粛モードを使用する
- よくある質問
SSHの設定
リモートサーバーでSSHサーバーをインストールする必要があります。Linuxで最も一般的なのはOpenSSHサーバーです。インストールするには、以下のコマンドのいずれかを実行します:
# Debian/Ubuntuベースのサーバー
sudo apt install ssh
# Fedora
sudo dnf install openssh
ディストリビューションによっては、一部のソフトウェアファイアウォールを通過させる必要があります。Ubuntuではこの問題は存在しませんが、Fedoraでは次のコマンドも実行する必要があります:
sudo firewall-cmd --add-service=ssh --permanent
sudo firewall-cmd --reload
SSHを介してシステムに接続する
SSH経由で接続する前に、リモートサーバーのIPアドレスを特定する必要があります。グラフィカルサーバーの場合、IPアドレスはシステム設定のネットワークアプレットに表示されます。ほとんどのサーバーでは、ターミナルでipコマンドを使用します。
ip addr
出力の中で、ethXまたはenpXsyの下のinetで始まる行を探します。私の場合、192.168.68.108です。
SSH接続をテストするには、別のLinuxマシンに移動し、次のように入力します:
「user」をサーバーでの実際のユーザー名に変更します。

そのアカウントのパスワードを入力すると接続されます。「ホストの信憑性を確立できません」という質問が出た場合は、「yes」と答えてください。これは、実際のサーバーに接続しているかどうかを確認するためのセキュリティチェックです。接続が成功したことを示すプンプトがクライアントシステムにも表示されるはずです。また、次のステップに進む前に、SSH接続の最大セキュリティを設定するか、二要素認証を設定することをお勧めします。
SCPを使用してファイルを転送する
SSH接続をテストしたので、2つのマシン間でファイルをコピーし始めましょう。安全なコピーはscpコマンドを使用して実現されます。scpコマンドの基本形式は次のとおりです:
scp /PATH/TO/FILE USER@IP-ADDRESS:PATH/TO/DESIRED/DESTINATIONたとえば、ローカルマシンから192.168.68.165のリモートサーバー上のユーザー「ramces」のホームディレクトリ内の「backups」フォルダに「backup.tar.gz」ファイルをコピーするには、次のようにします:
scp backup.tar.gz [email protected]:~/backups/
sshを使用して接続する時と同様に、パスワードの入力を求められます。ユーザー名はコマンド内で指定されているため、要求されません。
次のようにワイルドカードを使用することもできます:
scp *.tar.gz [email protected]:~/backups/
リモートサーバーからローカルマシンにファイルをコピーするには、単にパラメータを反転させます:
scp [email protected]:~/backups/backup.tar.gz ./
コマンドの末尾のドットに注意してください。これは「現在のディレクトリ」を意味します。標準のcpやmvコマンドでも同様です。他のディレクトリを指定することもできます。
scp -r [email protected]:~/backups/ backups-from-server/ワイルドカードを使用するのも同様です:
scp [email protected]:~/backups/*.txz ./リモートサーバーにディレクトリを再帰的にコピーするには、-rオプションを使用します:
scp -r backups/ [email protected]:~/backups/
リモートサーバーからローカルマシンにディレクトリの再帰コピーを行うには、次のようにします:
scp -r [email protected]:~/backups/ ./
SCPでのファイル転送の圧縮
基本的なコピーに加えて、SCPがファイル転送中にどのように動作するかを変更することもできます。たとえば、-Cフラグを使用して、SCPがリモートクライアントに送信するデータを圧縮することができます:
scp -C backup.tar.gz [email protected]:/home/ramces/このオプションは、SCPプログラムを通じて送信される各データパケットを圧縮することによって機能します。このため、帯域幅が限られた接続でファイルをリモートサーバーに堅実に送信したい場合に非常に便利です。

上記のオプションと同様に、-Cを-rフラグと組み合わせて、ファイルを再帰的に圧縮してリモートマシンに転送することもできます。たとえば、次のコマンドは、リモートサーバーから「backup.tar.gz」ファイルを圧縮して取得します:
scp -Cr [email protected]:/home/ramces/backups /home/ramces/
SCPによるデータ転送の最適化
SCPは、大部分のファイル転送に対してAES-128暗号化アルゴリズムを使用しようとします。しかし、特定のファイルを転送したい場合、このアルゴリズムが適していない場合があります。
そのことを理解した上で、特定の転送のために暗号アルゴリズムを直接変更することによって、SCPをさらに最適化およびセキュリティを強化することが可能です。これを行うには、使用したい暗号を指定する-cフラグを使用します。
たとえば、次のコマンドはAES-256を使用して私のリモートサーバーに「backup.tar.gz」ファイルを転送します:
scp -c aes256-ctr ./backup.tar.gz [email protected]:/home/ramces/
さらに、-cオプションは、特定のファイル転送に使用したい暗号のリストを提供することもできます。たとえば、次のコマンドは、「backup.tar.gz」ファイルを転送する際にAES-192およびAES-256の両方を使用します:
scp -c aes192-ctr,aes256-ctr ./backup.tar.gz [email protected]:/home/ramces/
SCPでの帯域幅の使用制限
ファイルパケットの圧縮は、悪条件のネットワークでSCPを使用するのに役立ちますが、転送中にプログラムが使用する帯域幅を制限することも可能です。これは、メーター接続を使用している場合や、SCPにネットワークの帯域幅を圧倒させたくない場合に便利です。
プログラムの有効な帯域幅を制限するには、-lフラグを使用し、キロビット毎秒(Kb/s)で希望する上限を指定します。たとえば、次のコマンドを実行すると、「backup.tar.gz」ファイルが私のリモートサーバーに1,600 Kb/sの有効な帯域幅で転送されます:
scp -l 1600 ./backup.tar.gz [email protected]:/home/ramces/
SCPを使用したリモートからリモートへの転送
ローカルのファイルをリモートサーバーにコピーするだけでなく、SCPを使用してローカルマシンから複数のリモートサーバーを管理することもできます。SCPはファイル転送を処理するだけで、ローカルマシンとリモートマシンを区別しません。
2つのリモートサーバー間で転送するには、それぞれのマシンのユーザー名とアドレスを明示的に指定する必要があります。たとえば、次のコマンドを実行すると、「remote-backup.tar.gz」ファイルが私の2つのリモートサーバー間で転送されます:
scp [email protected]:/home/ramces/remote-backup.tar.gz [email protected]:/home/ramces/
SCPを使用したプロキシ
デフォルトでは、SCPは異なるホスト間でファイルを転送する際にローカルマシンのIPアドレスを使用します。これは通常の状況では問題ありませんが、ローカルネットワークがSCPアクティビティを制限している場合は問題が発生する可能性があります。この問題を解決するための迅速な方法は、SSHプロキシを介してローカル接続を通過させることです。
これを行うには、-oフラグを使用してProxyCommandオプションを指定します。これにより、新しいマシンへの基本的なSSH接続を作成し、それがSCPコマンドを実行します。たとえば、次のコマンドはリモートマシンと新しいSSHプロキシを作成し、それを使用して「backup.tar.gz」ファイルを転送します:
scp -o "ProxyCommand ssh [email protected] nc %h %p" ./backup.tar.gz [email protected]:/home/ramces/
SCPでのデフォルトポートの変更
基本的なSSHプロキシを作成することに加えて、SCPのデフォルトポートを変更することもできます。これは、Linuxサーバーを保護してデフォルトポートを公開したくない場合に特に便利です。
異なるポートでSCPを使用するには、使用したいポート番号を指定する-Pフラグを使用します。たとえば、次のコマンドは、「backup」ディレクトリを再帰的にコピーし、ポート2222を使用してリモートサーバーに接続します:
scp -r -P 2222 ./backup [email protected]:/home/ramces/
SCPの静粛モードを使用する
最後に、SCPコマンドからターミナル出力を完全に取り除くことも可能です。これは、マシンで実行される非対話型スクリプトを作成する場合に特に役立ちます。それだけでなく、cronジョブを作成してプロセスを完全に自動化し、プライベートSSHキーをサーバーに転送することもできます。
静粛なSCP転送を作成するには、-qフラグを使用します。たとえば、次のコマンドは「backup.tar.gz」ファイルを静かにリモートサーバーに転送します:
scp -q ./backup.tar.gz [email protected]:/home/ramces/
よくある質問
SCPでのリモートからリモートへの転送がうまくいきません。どうすれば修正できますか?
この問題は、リモートマシンの設定ファイルでポートがブロックされていることが原因である可能性が最も高いです。この問題を修正するには、両方のマシンでSSHのデフォルトポートが開いていることを確認してください。
また、リモートマシンの1つがCG-NAT接続の背後にある場合、外部からの接続が適切に解決されないことによって問題が発生する可能性もあります。これを修正するには、CG-NATを突き破ることができるYggdrasilのような仮想LANプログラムを使用する必要があります。
SCPプロキシを実行中にリモートホストが接続を切断しました。どうすればよいですか?
この問題は、プロキシマシンに関連する問題の可能性が最も高いです。SSHプロキシを正しく開始するには、使用したいマシンにOpenSSHサーバーとネットキャットが必要です。Ubuntuにこれらのプログラムをインストールするには、次のコマンドを実行します:sudo apt install ssh netcat。
SCPで利用可能なすべての暗号を知ることは可能ですか?
デフォルトで、SCPプログラムはその暗号機能にSSHプロトコルを重く依存しています。これにより、SSHプログラムを使用してSCPと共に使用できる暗号リストを表示することができます。たとえば、ssh -Q ciphersを実行して、マシンで利用可能なすべての暗号の簡潔なリストを表示できます。
画像クレジット:Unsplash。すべての変更とスクリーンショットはRamces Redによるものです。