ローカル・リモート間でファイル転送を行うSCPコマンドの使い方

2022年8月12日

2017年の2月に、このブログを立ち上げた際、合わせて、ラズパイを始めました。当初、windows しか触ったことがなく、コマンド中心の LINUX には相当なコンプレックスがありました。

知識もない癖にラズパイサーバを複数台使っていて、その間のファイル転送には FTP を使用していました。しかし、当コマンドを教えてもらうと、LINUX 間のファイル転送が驚くほど簡単に出来ることがわかり感動したものです。

そこで、この記事では 「SCPコマンドの使い方」を改めて丁寧に説明しました。合わせて、SCPコマンドの注意点と、遭遇するであろうエラーメッセージも載せておきました。

SCPコマンドは、sshプロトコルを使用してファイルを転送しますので、ネットワーク通信は暗号化されます。このため、安全にファイルの転送を行うことができます。

また、このコマンドは、ほぼ全ての Linuxディストリビューションに標準で搭載されていますので、追加のソフトウェアをインストールする必要もありません

この便利なコマンドを覚えて、皆様も快適な LINUX ライフを満喫ください。

なお、このコマンドは windows でも使用できますので、下記記事でご確認ください。

スポンサーリンク

SCPコマンドの構文

scpコマンドの構文

scp [オプション] コピー元 コピー先

コピー元とコピー先の内容は次のように記述します。但し、ローカルホストの場合は、「ユーザ名 + @ + IPアドレス (or ホスト名)+ :」を省略することが出来ます。

【コピー元】

ユーザ名 + @ + IPアドレス(or ホスト名) + : + コピーしたいファイル

【コピー先】

ユーザ名 + @ + IPアドレス (or ホスト名)+ : + 保存先のディレクトリ(パス)

オプション

オプションはかなりありますが、良く使用するであろうもののみ記載しておきます。

-P転送元ファイルのタイムスタンプ及びパーミッションを保持
-rディレクトリ内を再帰的にコピー

SCPコマンドの使い方

下記のようなローカルホストとリモートホストの間でファイルの転送を行う前提で、それぞれの例を示します。

ローカルホストからリモートホストへのファイル転送

ローカルホストのホームディレクトリ(/home/pi)にある test1.txt を、リモートホストのホームディレクトリへ(/home/pi)ファイル転送する構文は次のようになります。

さらに、ローカルホストのホームディレクトリで打鍵していますので、ローカルホスト側のディレクトリ(パス)は入力不要です。

scp test1.txt pi@192.168.254.116:/home/pi

【実行例】

scp test1.txt 192.168.254.116:/home/pi
pi@192.168.254.116's password:
test1.txt 100% 7077 6.9KB/s 00:00

リモートホストからローカルホストへのファイル転送

今度は、リモートホストのホームディレクトリにあるファイル out.txt をローカルホストのホームディレクトリへファイル転送する例を示します。

構文は次のようになります。(1) で示した転送先と転送元を逆さにするだけです。

scp pi@192.168.254.116:/home/pi/out.txt /home/pi

【実行例】

scp pi@192.168.254.116:/home/pi/out.txt /home/pi
pi@192.168.254.116's password:
out.txt 100% 196 0.2KB/s 00:00

ディレクトリ(パス)の転送

ディレクトリの転送も、オプションに -r を使えばOKです。

ローカルホストのホームディレクトリにあるディレクトリ jpg_181230 を、リモートホストのホームディレクトリへファイル転送します。

構文は次のようになります。

scp -r jpg_181230 pi@192.168.254.116:/home/pi

【実行例】

ディレクトリ配下のファイルが転送されたことがわかります。

scp -r jpg_181230 pi@192.168.254.116:/home/pi
pi@192.168.254.116's password:
naporitan.jpg 100% 181KB 180.7KB/s 00:00
onigiri.jpg 100% 180KB 180.3KB/s 00:00
omuraisu.jpg 100% 206KB 206.3KB/s 00:00
steak.jpg 100% 286KB 285.8KB/s 00:00
tonkatu.jpg 100% 238KB 237.6KB/s 00:00

次に、リモートホストに入って、フォルダの中身を見てみます。

ifconfig
~
wlan0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.254.116 netmask 255.255.255.0 broadcast 192.168.254.255
~
ls -l jpg_181230/
合計 1104
-rw-r--r-- 1 pi pi 185007 7月 26 20:40 naporitan.jpg
-rw-r--r-- 1 pi pi 211216 7月 26 20:40 omuraisu.jpg
-rw-r--r-- 1 pi pi 184654 7月 26 20:40 onigiri.jpg
-rw-r--r-- 1 pi pi 292667 7月 26 20:40 steak.jpg
-rw-r--r-- 1 pi pi 243285 7月 26 20:40 tonkatu.jpg

ご覧のように、送付された内容が確認できました。

ちょっと便利な使い方

ローカルホストとリモートホストのユーザ名が同じ場合、上記で説明した構文から「ユーザ名 + @」を省略できます。

scp test1.txt 192.168.254.116:/home/pi

【実行例】

scp test1.txt 192.168.254.116:/home/pi
pi@192.168.254.116's password:
test1.txt 100% 7077 6.9KB/s 00:00

ほんのちょっぴりですが入力が減りますね。

スポンサーリンク

注意点とエラーメッセージ

注意点

これ、取り返しがつかないので、十分、注意して使用しましょう。

scp を行う際、万が一、コピー先に同名のファイルやディレクトリがあると、警告もなく、上書されてしまいます。

エラーメッセージ

① Permission denied

実行権限がないファイルやディレクトリを転送しようとすると、本エラーが表示されます。

以下のファイルは、読み込み権限がありません。

ls -l test.txt
-r--r----- 1 root root 336 10月 1 2017 test.txt

このファイルを転送しようとすると、以下のように表記のエラーメッセージが表示されました。

scp test.txt 192.168.254.116:/home/pi
pi@192.168.254.116's password:
test.txt: Permission denied

今回は、読み込み権限のせいで表記エラーメッセージが表記されましたが、書き込み権限のないフォルダ、ファイルを転送しようとした場合も同様のエラーメッセージが表示されます。

② not a regular file

ディレクトリを転送する際、-r オプションを付け忘れると、このエラーが表示されます。上記「ディレクトリ(パス)の転送」で使用した構文から -r を外して実行してみます。

scp jpg_181230 pi@192.168.254.116:/home/pi
pi@192.168.254.116's password:
jpg_181230: not a regular file

ご覧のように、表記のエラーメッセージが表示されました。

スポンサーリンク

最後に

リモートサーバへの構文の書き方さえマスターすれば、SCPコマンドで手軽にファイルを転送できることがおわかりになったと思います。

さらに、ファイルだけでなく、ディレクトリ自体も転送できるので、ファイルを一つずつ転送する余計な手間もかからないので便利です。

ただ、手軽に行える転送ですが、同一のファイル名、ディレクトリ名がないことを事前に調べておかないと、大切なファイルやディレクトリが一瞬のうちに上書きされてしまうののは困りものです!上述しましたが、十分に注意してください。

これらを踏まえて SCPコマンドを使用すれば LINUX ライフをより楽しむことが出来ると思います。

スポンサーリンク
この記事を書いた人

60爺

60路を越え、RaspberryPi と出会い、その関係でブログ開設(2017/2~)となりました。始めてみると、コツコツやるのが性に合ってしまい、漢字の記事から家の補修・将棋・windows10関係・別名・言い方などジャンルを拡大して今に至ってます。まだまだ、元気なので新たな話題を見つけて皆様に提供できればと思っています。「プロフィールはこちら

コマンド

Posted by 60爺