今回はscpコマンドを使ってファイルをネットワーク経由でコピーします。scpコマンドは簡単で使いやすいという利点があります。
他にもファイルのネットワークコピーならrsyncコマンドがあります。ファイルの同期処理などはrsyncを使う必要がありますが、単純に高速にコピーしたいのであればscpコマンドで十分です。ただし、scpにはメンテナンス問題やセキュリティの問題もあります。

今回もこれまでと同様にデスクトップ上にあるsampleディレクトリに必要なファイルを用意しておきます。なお、今回は転送元のコンピューターと転送先のコンピューターの2台を使います。2台も用意できない、という場合は仮想環境を利用して同じマシンで異なるIPアドレス間でファイル転送を行うこともできます。

man scp

 とりあえず最初にman scpとしてマニュアルでパラメーター等を確認しておきましょう。特にman scpとしなくても今はWeb上に日本語訳のマニュアルや解説がありますので、そちらを参考にしても構いません。

man scp

・macOS

・Linux (Ubuntu 24LTS)

IPv4アドレスを指定して他のマシンにコピー

 まず、転送元のマシンのデスクトップ上にあるsampleディレクトリ内にある1.txtファイルを転送してみます。今回の転送先はRaspberry Piです。Raspberry Piのデスクトップ上にあるsampleディレクトリ内にコピーします。
 ここで必要なのはRaspberry PiのIPv4アドレスです。IPv6でもできますが、まずIPv4アドレスを指定してコピーしてみましょう。
 入力するコマンドを短くする都合上、以下のようにしてデスクトップ上にあるsampleディレクトリに移動し、そこをカレントディレクトリとします。macOSであればターミナルでcd と入力した後にデスクトップ上にあるsampleフォルダをターミナルウィンドウにドラッグドロップすればパスが自動で入力されます。

cd ~/Desktop/sample

scpコマンドはパスなしのscpとだけ入力すると環境によってはうまくいかないこともあるため、うまくいかない場合はscpコマンドのパスを直接指定してみてください。scpコマンドがどこにあるかを調べるにはwhichコマンドを使います。

which scp

scpコマンドはcpコマンドと同様に最初にコピー元のファイルパスを指定します。その後に半角空白で区切ってコピー先のユーザー名とIPアドレスとコピー先のパスを指定します。
カレントディレクトリ内にある1.txtをユーザー名pi、IPv4アドレス192.168.11.52の/home/pi/Desktop/sample/ディレクトリ内にコピーするには以下のようになります。
なお、一度もリモートでログインしたことがない場合は以下の図のように確認の画面が出てきます。yesと入力すれば転送が開始されます。

scp 1.txt pi@192.168.11.52:/home/pi/Desktop/sample/

なお、転送先のアクセスが許可されていないような場合は図のようなエラーが表示されます。

1.txtだけでなく拡張子がtxtのファイルをまとめてコピーする場合はワイルドカードである*を使います。これはcpコマンドと同じで様々なパターンのワイルドカードを使用できます。

scp *.txt pi@192.168.11.52:/home/pi/Desktop/sample/

ディレクトリもコピーしたい場合は-rを付けます。

scp -r * pi@192.168.11.52:/home/pi/Desktop/sample/    

IPv6アドレスを指定して他のマシンにコピー

 次にIPv6アドレスを指定してファイルをコピーしてみましょう。ここではリンクローカルアドレス内でのみコピーしてみます。IPv6のアドレスではfe80:〜で始まるアドレスになります。
 まず、転送先のRaspberry PiのIPv6アドレスを確認します。以下のようにコマンドを入力します。

ip -6 addr show

すると以下のように表示される行が出てきます。これがIPv6のアドレスです。fe80:〜で始まっているのでローカルであることがわかります。

inet6 fe80::cc6d:c08d:af94:6e11

scpで1.txtをコピーする場合、以下のようになります。IPv4アドレスだった部分を[〜]で囲み、この中にIPv6アドレス+インターフェース名を指定します。

scp 1.txt pi@[fe80::cc6d:c08d:af94:6e11%en0]:/home/pi/Desktop/sample/

なお、現在macOSのデフォルトシェルとなっているzshの場合は以下のように[〜]の範囲内を'で囲む必要があります。

scp 1.txt pi@'[fe80::cc6d:c08d:af94:6e11%en0]':/home/pi/Desktop/sample/

scpでは-vを指定すると転送に関する詳細な情報(デバッグメッセージ)が表示されます。通常は使うことはありませんが、何かあった場合に役立つかもしれません。

最後にmacOSでのIPv6アドレスを表示するコマンドです。インターフェースが多い場合は、たくさん表示されます。

sample % ifconfig | grep "inet6"

IPv6アドレスでfdc1:〜となっているのはグローバルユニキャストアドレスです。これはグローバルで一意(世界に1つしかないIPv6アドレス)となっています。

scpには他にも圧縮オプション(c)などもありますが、通常はここまで解説した使い方で十分なのではないかと思います。

なお、scpは必ずしもネットワーク経由のコピーということはなく以下のようにcpコマンドと同じように自分自身のマシン内でのコピーに使うこともできます。

scp 1.txt test/data

それでは、また次回。

著者 仲村次郎
いろいろな事に手を出してみたものの結局身につかず、とりあえず目的の事ができればいいんじゃないかみたいな感じで生きております。