Linuxでscpコマンドを使用する方法

  • SCPは、SSHを使用してLinuxコンピュータ間でファイルをコピーするための安全でシンプルな方法です。使いやすく、ファイルを転送するための安全な手段となります。
  • SCPはOpenSSHバージョン8.8以降非推奨とされており、最近のインプリメンテーションではファイル転送にSFTPがデフォルトで使用されます。ただし、構文は同じです。
  • scpよりもrsyncが推奨されますが、scpは自己完結型のネットワーク上のコンピュータ間でファイルをコピーするための適切なオプションです。転送に関与するすべてのコンピュータでSSHが実行されている必要があります。

scpコマンドを使用すると、Linuxコンピュータ間でファイルを簡単に安全にコピーできます。SSHセキュリティを使用しますが、何よりもシンプルです。cpを使用できるなら、scpも使用できます。

scpとSecure Copy Protocolとは何ですか?

用語をいくつか定義しましょう。SCPとscpがあります。大文字のSCPはSecure Copy Protocolの略です。小文字のscpはsecurecpの略です。言い換えると、SCPはプロトコルで、scpはプログラムです。

scpは、リモートのLinuxコンピュータ間でファイルをコピーするための安全でセキュアな手段として設計されました。SSHを使用してセキュアな接続を確立します。SSH、またはセキュアシェルは、リモートのLinuxコンピュータにアクセスしてログインするために使用される暗号化ネットワークプロトコルです。Linuxディストリビューションでは、SSHの機能はOpenSSHによって提供されます。

SCPは古くからあり、現在の使用について懸念が表明されています。OpenSSHバージョン8.8以降、SCPは非推奨とされています。scpの最近のインプリメンテーションでは、デフォルトでSecure File Transfer Protocolが使用されます。SSHは引き続きセキュアな接続に使用されますが、ファイル転送はSFTPによって処理されます。これはすべて目に見えずに自動的に行われ、scp構文は同じです。

rsyncプログラムはscpよりも推奨されますが、rsyncがインストールされておらず、root権限がないためインストールできないコンピュータがある場合があります。自己完結型のネットワーク上のコンピュータ間でファイルをコピーする場合、scpは最適です。scpが機能するには、コピー元のコンピュータとコピー先のコンピュータのすべてでSSHが実行されている必要があります。

コンピュータにインストールされているOpenSSHのバージョンを確認するには、次のように入力します。

ssh -V

scpを使用して単一ファイルをコピーする

標準のcpコマンドと同様に、scpはソースの場所からターゲットの場所にファイルをコピーします。ファイルをリモートコンピュータにコピーするには、リモートコンピュータのIPアドレスまたはネットワーク名を知る必要があります。また、ファイルを送信する場所に書き込み権限を持つユーザーアカウントの資格情報も必要です。

「sample.txt」というファイルをローカルネットワーク上の「fedora-34」というコンピュータに送信するには、構文は次のようになります。

scp ./sample.txt [email protected]:/home/dave/Downloads/

このコマンドは、次の内容で構成されています。

  • scp:scpコマンド
  • ./sample.txt:送信するファイルです。これは現在のディレクトリにあります。
  • dave@:ファイルを転送するリモートコンピュータのユーザーアカウントです。
  • fedora-34.local:リモートコンピュータのネットワーク名です。
  • :/home/dave/Downloads/:リモートコンピュータにファイルをコピーする場所です。コンピュータ名とパスを区切るコロン「:」に注意してください。

リモートコンピュータのアカウントのパスワードを入力するように求められ、ファイルがコピーされます。

リモートコンピュータでファイルに別の名前を付けたい場合は、ターゲットパスにファイル名を追加できます。同じファイルをコピーして「different-file.txt」という名前を付けるには、次の構文を使用します。

scp ./sample.txt [email protected]:/home/dave/Downloads/different-file.txt

scpコマンドは、既存のファイルを自動的に上書きします。ファイルをコピーするときは注意してください。コピーするファイルと同じ名前のファイルがターゲットコンピュータにすでに存在する場合、そのファイルは上書きされて失われます。

ターゲットコンピュータでデフォルトのSSHポート22を使用していない場合は、-P(ポート番号)オプションを使用して適切なポート番号を指定できます。

単一ファイルを取得する

リモートサーバーからファイルをコピーするには、リモートサーバーをソースとして、ファイルをコピーするローカルパスをターゲットとして指定します。リモートコンピュータから「development-plan.md」というファイルをローカルコンピュータの現在のディレクトリにコピーします。

scp [email protected]:/home/dave/Downloads/development-plan.md .

ローカルパスにファイル名を追加すると、ファイルがコピーされ、その名前が付けられます。

scp [email protected]:/home/dave/Downloads/development-plan.md ./dp-1.md

ファイルがコピーされ、指定したファイル名に変更されました。

ls -hl *.md

複数のファイルをコピーする

どちらの方向でも複数のファイルをコピーするのは簡単です。好きなだけソースファイルのリストを作成できます。ここでは、2つのマークダウンファイルと1つのCSVファイルをコピーします。

scp ./dp-1.md ./dp-2.md ./dp-3.csv [email protected]:/home/dave/Downloads/

3つのファイルがリモートコンピュータにコピーされます。ワイルドカードを使用することもできます。このコマンドは、最後のコマンドとまったく同じことを行います。

scp ./dp. [email protected]:/home/dave/Downloads/

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

-r(再帰的)オプションを使用すると、1つのコマンドでディレクトリツリー全体をコピーできます。「data」というディレクトリに2つのファイルを入れ、「data」ディレクトリの中に「CSV」というディレクトリを作成しました。「data/CSV」ディレクトリにCSVファイルを入れました。

このコマンドは、ファイルのコピーとリモートコンピュータでのディレクトリ構造の再作成を行います。

scp -r ./data [email protected]:/home/dave/Downloads/

リモートサーバー間でファイルをコピーする

scpにリモートサーバーから別のリモートサーバーにファイルをコピーするように指示することもできます。構文はとてもシンプルです。ソースサーバーのアカウント名とネットワークアドレス、ターゲットサーバーのアカウント名とネットワークアドレスを指定します。ファイルはソースサーバーからコピーされ、ターゲットサーバーの場所にコピーされます。

構文はシンプルですが、その他すべてが整っていることを確認するには、もう少し考える必要があります。明らかに、リモートサーバー上のファイルのコピー先の場所は、コマンドラインで指定したユーザーアカウントからアクセスできる必要があります。そして、そのユーザーアカウントにはその場所への書き込み権限が必要です。

より微妙な前提条件は、ローカルコンピュータとソースコンピュータの間、およびソースサーバーとターゲットサーバーの間にSSHアクセスが設定されている必要があることです。ソースサーバーからターゲットサーバーにSSHを使用してログインできることを確認してください。それができない場合、scpは接続できません。

認証済みだがパスワードレスのアクセスを使用できるようにSSHキーを設定することが、はるかに好ましい方法です。パスワードの使用はすぐに面倒になり、各ユーザーアカウントのパスワードを要求されるため、スクリプトを使用してプロセスを完全に自動化することはできません。

各リモートサーバーで使用しているユーザーアカウントのSSHキーを設定しました。これにより、2人のユーザーに対して、もう1つのサーバーへのシームレスなSSHアクセスが提供されました。これにより、2つのユーザーアカウントを使用して、どちらの方向にもファイルを転送できます。

ローカルのUbuntuコンピュータから発行されたscpコマンドを介して、Manjaroコンピュータの「davem」ユーザーアカウントからFedoraコンピュータの「dave」アカウントにファイルをコピーするには、構文は次のようになります。

scp [email protected]:/home/davem/man. [email protected]:/home/dave/

コマンドラインに何も表示されません。何も起こらなかったことを示すものは何もありません。ニュースがないことは良いニュースであるという前提で、scpはこのリモートからリモートへのコピーのエラーのみを報告します。Fedoraコンピュータを確認すると、Manjaroコンピュータからのファイルがコピーされて受信されていることがわかります。

デフォルトでは、ファイルはソースコンピュータからターゲットコンピュータに直接コピーされます。-3(3ウェイ)オプションを使用してこれをオーバーライドできます。

このオプションを使用すると、ファイルはターゲットからソースに、ローカルコンピュータを介して転送されます。それには、ローカルコンピュータからターゲットコンピュータへのシームレスなSSHアクセスが必要です。

scp -3 [email protected]:/home/davem/man. [email protected]:/home/dave/

ローカルコンピュータを介してファイルをチャネル化する場合でも、何も起こらなかったことを示すものはまだありません。もちろん、プディングの証明はターゲットコンピュータを確認することです。

その他のSCPオプション

-p(ファイル属性を保持)は、転送されたファイルの元のファイル作成、所有権、およびアクセスフラグを保持します。ソースコンピュータの元のファイルと同じメタデータを持ちます。

エラーメッセージが表示された場合は、コマンドを繰り返して-v(詳細)フラグを使用して、転送試行に関する詳細情報を表示してみましょう。出力で障害の発生場所を確認できるはずです。

-C(圧縮)オプションは、ファイルをコピーするときに圧縮し、受信時に解凍します。これは、コンピュータ間のモデム通信が遅かった時代にさかのぼるものです。ペイロードのサイズを小さくすると、送信時間を短縮できます。

今日では、ファイルを圧縮して解凍する時間は、圧縮と非圧縮の送信時間の差よりも長くなる可能性があります。しかし、scpは同じLAN上のコンピュータ間でファイルをコピーするために最適であるため、送信速度はそれほど問題ではありません。