うたカモ技術ブログ

Linux ネットワーク

Linux   いろいろなファイル転送方法(wget・curl・ftp・tftp・scp)

post:     update: 

この記事では、wgetやcurl、FTPなどの代表的なファイル転送方法を紹介します。

最近、仕事や趣味で組み込みソフトウェア開発やWebシステムを扱う中で、組み込み機器やWebサーバーとの ファイルのダウンロードやアップロードを行う機会がよくあります。

慣れてくると、何も考えずに自由にファイルを出し入れできるようになってきますので、ファイル転送そのものについて意識する 機会がなくなり、いつもの方法が固定化していきます。

しかし、ハードウェア環境によっては自分が普段使っていたファイル転送ツールが使用できなかったり、ソフトウェア構成に限りがあるため、 いつも利用しているファイル転送手段(転送プロトコル)そのものが全く通用しないこともあります。

そこで本記事では、機器やソフトウェア環境が限定される状況でも手段を選べるように、複数のファイル転送方法を整理して紹介します。

ファイル転送の手順は多くの技術ブログやドキュメントで紹介されていますが、自分が見返せる形でまとめる目的も兼ねています。

目次

  1. そもそもファイル転送とは?(ダウンロードとアップロード)
  2. [HTTP] Webサーバーを利用したファイルダウンロード
    1. サーバーとクライアントの設置
    2. Webサーバーの準備(次に挙げるものをどれか1つ実施)
      1. python3による簡易Webサーバーの導入
      2. nginxの導入
      3. apacheの導入
    3. Webサーバーからファイルをダウンロードする(wget・curl・browser)
      1. wgetコマンド
      2. curlコマンド
      3. Webブラウザ
  3. [FTP] FTPコマンドを利用したファイルのダウンロード・アップロード
    1. サーバーとクライアントの設置
    2. FTPサーバーの導入
    3. FTPサーバーにログイン
    4. ファイルダウンロード
    5. ファイルアップロード
  4. [UDP] TFTPコマンドを利用したファイルのダウンロード・アップロード
    1. サーバーとクライアントの設置
    2. TFTPサーバーの導入
    3. ファイルダウンロード
    4. ファイルアップロード
  5. [SFTP] SFTPコマンドを利用したファイルのダウンロード・アップロード
    1. SFTPサーバーに接続
    2. ファイルダウンロード
    3. ファイルアップロード
  6. [FTPS] FTPSを利用したファイルのダウンロード・アップロード
    1. FTPSサーバー(vsftpd + TLS)の準備
    2. FTPSサーバーに接続
    3. ファイルダウンロード
    4. ファイルアップロード
  7. [SSH] SCPコマンドを利用したファイルのダウンロード・アップロード
    1. サーバーとクライアントの設置
    2. SSHサーバーの導入
    3. ファイルダウンロード
    4. ファイルアップロード
  8. [UART] おまけ:UART接続によるファイルアップロードとダウンロード
    1. 制限事項と位置づけ(最終手段)
    2. ファイルアップロード(コピー&ペースト)
    3. ファイルダウンロード(コピー)

そもそもファイル転送とは?(ダウンロードとアップロード)

今回のテーマであるファイル転送とは、サーバーに対するファイルのダウンロードとアップロードのことを指します。

ここで言うダウンロードとは、そのファイルの所有元(サーバー)からダウンロード先(クライアント)へファイルが転送されることを意味します。

対してアップロードとは、そのファイルの所有元(クライアント)からアップロード先(サーバー)へファイルを転送することを意味します。

重要なのはクライアント側が能動的にリクエスト(要求)を出し、サーバーがその要求を許可してファイル転送するのか、それとも受けるのかという点です。

ダウンロードであれば、クライアントPCのダウンロード要求をサーバーが許可して指定ファイルをサーバーからクライアント側に転送します。

アップロードであれば、クライアントPCのアップロード要求をサーバーが許可して指定ファイルをクライアントからサーバー側に転送します。

このように、ファイル転送では要求を出すクライアントと、要求を受けとって許可を出すサーバーが存在し、 ファイルの転送方向はクライアントとサーバー間のやり取りによって決定されます。

それでは、次節から具体的なファイル転送方法を紹介します。

[HTTP] Webサーバーを利用したファイルダウンロード

はじめに、WebサーバーからクライアントPCへファイルをダウンロードする方法を紹介します。

WebサーバーはHTML文書を含むWebコンテンツを配信するサーバーです。主にGoogle Chrome、Edge、Safari、Firefox、Braveなどの Webブラウザに対して、WebサイトやWebサービスを提供する役割を持ちます。

Webコンテンツを配信する特性上、wgetやcurlからHTTPリクエストを送ることで、特定のファイルをクライアントPCへダウンロードできます。 もちろん、WebブラウザのURL入力欄にファイルパスを指定してもダウンロードできます。

ここでは、wgetコマンドとcurlコマンド(とWebブラウザ)を実行して、指定ファイル(今回はsample-file)をダウンロードしてみます。

サーバーとクライアントの設置
サーバーからファイルをダウンロードする準備として、まずはじめにLAN内に Webサーバーを立てます。そして、ダウンロードしたいファイルをそのWebサーバーのドキュメントルートに格納します。

LAN内に即席でWebサーバーを立てますので、WebサーバーへのアクセスはIPアドレスの直接指定になります。 (DNSサーバーでドメイン設定をすれば、http://utakamo.comのようにURLでアクセス可能です。今回は、ただファイル転送したいだけなので ドメイン設定はしません。)

今回、私の環境では192.168.3.0/24のネットワークにWebサーバーとなるLinuxマシン(192.168.3.10/24)とクライアントのLinuxマシン(192.168.3.20)を1台ずつ配置しています。

実施する場合は、自身のネットワーク環境を把握してください。基本はipコマンドで、ネットワークとサーバー/クライアントのIPアドレスを確認できます(ifconfigはnet-tools導入時のみ利用可能です)。

192.168.3.0/24のような、特定のネットワーク上にサーバーとクライアントが接続されており、共にIPアドレスが割り当てられていればOKです。

それでは、実際に進めます。

補足:ドキュメントルートとは?
ドキュメントルートとは、ユーザーに配信するWebコンテンツを管理するディレクトリです。 ダウンロードさせたいファイルをこのディレクトリに置くことで、Webコンテンツとして配信できます。

例えば、このWebサイト「うたカモ技術ブログ」を管理するWebサーバーのドキュメントルートが「/www」であれば、 http://utakamo.com/index.htmlへのHTTPリクエストに対して、サーバーは /www/index.htmlを探してクライアントのWebブラウザへ返します。

つまり、URL(ドメイン)のhttp://utakamo.comはWebサーバーの「/www」ディレクトリを示すということです。

今回紹介するWebサーバーの大半は、ドキュメントルートとして「/www」や「/www/html」などのディレクトリをデフォルトで持ちます。 このようにWebサーバーによって微妙にデフォルトで設定されているディレクトリが異なります。サーバーを立てた後はドキュメントルートがどこなのか常に確認しましょう。

Webサーバーの準備(次に挙げるものをどれか1つ実施)
ここでは、Webサーバーを立て、クライアント側にダウンロードさせるファイルをドキュメントルートに格納する方法を紹介します。

以下にWebサーバー別(python3、nginx、apache)の導入手順を掲載します。この技術ブログを読んでいる皆さんは、この中からどれか1つだけ導入作業を実施してください。

これを実施することで、Webサーバーからファイルをダウンロードできる環境が整います。

python3による簡易Webサーバーの導入

一番簡単なpython3の簡易Webサーバー機能から紹介します。

python3は以下のコマンドでインストールできます。

kamo@raspberrypi:~ $ sudo apt update    
kamo@raspberrypi:~ $ sudo apt install python3

python3の簡易Webサーバー機能は、実行したときのカレントディレクトリがドキュメントルートになります。

そのため、今回はホームディレクトリにdocrootディレクトリを作成して、そこにダウンロード対象のファイルであるsample-fileを作ります。

kamo@raspberrypi:~ $ mkdir /home/kamo/docroot
kamo@raspberrypi:~ $ cd /home/kamo/docroot
kamo@raspberrypi:/home/kamo/docroot $ touch sample-file
kamo@raspberrypi:/home/kamo/docroot $ echo hello world > sample-file

そして、次のコマンドを実行します。
これでドキュメントルートをdocrootディレクトリとする簡易Webサーバーが80番ポートで起動します。

kamo@raspberrypi:/home/kamo/docroot $ sudo python3 -m http.server 80

後はクライアント側からIPアドレスを伴ったファイルパスを次節で説明するコマンドの引数として指定(例:http://192.168.3.10/sample-file)すれば、docrootのsample-fileが転送(ダウンロード)される ようになります。

nginxの導入

nginxはWebサーバーとして代表的なアプリケーションです。

皆さんがよく見るWebサイトもnginxによって提供されているかもしれません。 nginxは以下のコマンドでインストールできます。

kamo@raspberrypi:~ $ sudo apt update
kamo@raspberrypi:~ $ sudo apt install nginx

デフォルトのドキュメントルートは/var/www/htmlです。 この中に今回、クライアント側にダウンロードさせるsample-fileを格納しましょう。

kamo@raspberrypi:~ $ cd /var/www/html    <--nginxのDocument rootへ移動
kamo@raspberrypi:/var/www/html $ touch sample-file
kamo@raspberrypi:/var/www/html $ echo hello world > sample-file

最後に、nginxが起動しているか確認して準備完了です。
もし、停止していた場合はsystemctlのstartで起動してください。

kamo@raspberrypi:~ $ sudo systemctl status nginx
kamo@raspberrypi:~ $ sudo systemctl start nginx   <---nginxが停止していればここで起動

デフォルト設定では、80番ポートでサーバーが稼働します。

クライアント側で次節のコマンドにファイルURL(例:http://192.168.3.10/sample-file)を指定すれば、 nginxのドキュメントルートで管理するsample-fileをダウンロードできます。

apacheの導入

apacheもnginxに並んで代表的なWebサーバーアプリケーションです。

nginxと同様の手順でインストールできます。Ubuntuではapache2として提供されています。

kamo@raspberrypi:~ $ sudo apt update
kamo@raspberrypi:~ $ sudo apt install apache2

デフォルトのドキュメントルートも/var/www/htmlです。 この中に今回、クライアント側にダウンロードさせるsample-fileを格納しましょう。

kamo@raspberrypi:~ $ cd /var/www/html    <--apache2のDocument rootへ移動
kamo@raspberrypi:/var/www/html $ touch sample-file
kamo@raspberrypi:/var/www/html $ echo hello world > sample-file

最後に、apacheが起動しているか確認して準備完了です。
もし、停止していた場合はsystemctlのstartで起動してください。

kamo@raspberrypi:~ $ sudo systemctl status apache2
kamo@raspberrypi:~ $ sudo systemctl start apache2   <---apacheが停止していればここで起動

デフォルト設定では、80番ポートでサーバーが稼働します。

クライアント側で次節のコマンドにファイルURL(例:http://192.168.3.10/sample-file)を指定すれば、 apacheのドキュメントルートで管理するsample-fileをダウンロードできます。

Webサーバーからファイルをダウンロードする(wget・curl・browser)
上記のWebサーバーの準備が完了したら、以下のコマンドやブラウザで ドキュメントルートに保存したsample-fileをダウンロードできます。

以下に各コマンドの簡単な使い方と実行結果を掲載します。 ※実際に読者ご自身の環境で確認をしたい場合は、クライアント側の機器上で次のコマンドを実行してみてください。

wgetコマンドwget <source>

Webサーバーから指定ファイルをダウンロードするコマンドです。以下のように使用します。

wget http://192.168.3.10/sample-file

成功すると、プログレスバーの表示と共にダウンロードが始まります。 指定ファイルのダウンロード先はwgetコマンドを実行したディレクトリです。

kamo@kamo:~ $ wget http://192.168.3.10/sample-file
Downloading 'http://192.168.3.10/sample-file'
Connecting to 192.168.3.10:80
Writing to 'sample-file'
sample-file           100% |*******************************|    12   0:00:00 ETA
Download completed (12 bytes)

curlコマンドcurl -o <destination> <source>

curlコマンドもwgetコマンドと同じようにファイルをWebサーバーからダウンロードすることができます。

-oオプションを付けずにそのまま実行すると、ファイルの内容がコンソールに出力されるので以下のようにして ダウンロード内容をファイルに保存します。

kamo@kamo:~$ curl -o target-files http://192.168.3.10/target-files
% Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                Dload  Upload   Total   Spent    Left  Speed
100 14004    0 14004    0     0  54095      0 --:--:-- --:--:-- --:--:-- 54279

Webブラウザ

Webサーバーは元々、Webブラウザに対してHTML文書を提供するサーバーです。

そのため、WebブラウザのURL入力欄にファイルを指定することでもダウンロードできます。

以下はFirefoxを使用してsample-fileをダウンロードした結果です。 正常にダウンロードされると右側にダイアログが表示されます。

今回はHTMLではないファイルを指定したのでダウンロードマークが表示され、downloadディレクトリなどにファイルが保存されます。

ここでHTML文書(.html)を指定した場合は、Webブラウザが内容を解釈して画面に表示します。

また、Webブラウザ側でファイルを指定せずにURLパス(例:http://utakamo.com)のみの指定をした場合、http://utakamo.com/index.htmlという名前のファイルの ダウンロード要求を暗黙的にしたことになります。

index.htmlはWebサイトのトップページなどに名づける特別なファイル名です。

このように、拡張子がhtml(場合によってはcgi)のファイルは他のファイルと扱いが異なる点に注意してください。

[FTP] FTPコマンドを利用したファイルのダウンロード・アップロード

ここではFTPサーバーを利用したファイル転送について紹介します。

FTPサーバーはファイル転送用プロトコルのFTP(File Transfer Protocol)を利用したサーバーです。

昔はWebサーバーへのファイルアップロードなどでよく利用されていました。現在はセキュリティの観点から SFTPやFTPSが主流ですが、ローカル環境内の機器間転送では今も使われることがあります。

FTPは認証情報・データを平文で送るため、インターネット公開環境では使用せず、閉域網の一時用途に限定してください。

FTPはファイルのダウンロードとアップロードの両方に対応しているため、ここではそれぞれの使い方を紹介します。

サーバーとクライアントの設置
サーバーとクライアントをネットワークに配置するところから紹介します。

今回、私の環境では192.168.3.0/24のネットワークにFTPサーバーとなるLinuxマシン(192.168.3.10/24)とクライアントのLinuxマシン(192.168.3.20)を1台ずつ配置しました。

実施する場合は、自身のネットワーク環境を把握してください。基本はipコマンドで、ネットワークとサーバー/クライアントのIPアドレスを確認できます(ifconfigはnet-tools導入時のみ利用可能です)。

192.168.3.0/24のような、特定のネットワーク上にサーバーとクライアントが接続されており、共にIPアドレスが割り当てられていればOKです。

今回は、FTPサーバー側にクライアントにダウンロードさせるserver-fileを用意します。一方、クライアント側にはFTPサーバーにアップロードするclient-fileを 用意します。これらのファイルをダウンロード・アップロードすることで、その使い方を紹介します。

FTPサーバー(vsftpd)の準備
それでは、FTPサーバーを導入して起動してみましょう。

今回は多くのLinuxディストリビューションで利用されるFTPサーバーのvsftpdをインストールします。

次のコマンドでvsftpdをインストールできます。

kamo@raspberrypi:~ $ sudo apt update
kamo@raspberrypi:~ $ sudo apt install vsftpd

インストールできたら、次は設定ファイルの/etc/vsftpd.confを編集します。

今回はデフォルト設定で禁止されているファイルのアップロードを行うため、必要な書き込み権限を有効化します。

具体的には、/etc/vsftpd.confのwrite_enable項目のコメントアウト#を除去します。

/etc/vsftpd.conf
以下抜粋部
#
# Uncomment this to allow local users to log in.
local_enable=YES
#
# Uncomment this to enable any form of FTP write command.
write_enable=YES   <---この項目のコメントアウト#を除去して有効化
#
# Default umask for local users is 077. You may wish to change this to 022,
# if your users expect that (022 is used by most other ftpd's)
#local_umask=022
#

これでファイルのアップロードが許可されます。 あとは次のコマンドでFTPサーバーを起動しましょう。

kamo@raspberrypi:~ $ sudo systemctl start vsftpd

以降、FTPクライアントはファイルのダウンロードとアップロードができます。

FTPサーバーにログイン
それでは、FTPクライアントを起動して実際にファイルを転送してみましょう。

クライアント側で次のコマンドを実行して、上記で立てたFTPサーバーにログインします。 ユーザー名とパスワードが聞かれますので入力しましょう。

kamo@kamo:~$ ftp 192.168.3.10   <--FTPサーバーのIPアドレスまたはホスト名(FQDN)を入力して接続します。
Connected to 192.168.3.10.
220 (vsFTPd 3.0.3)
Name (192.168.3.10:kamo): kamo   <--ユーザー名を入力します。
331 Please specify the password.
Password:    <--パスワードを入力します。
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.

ログイン後は、次のコマンドでFTPサーバーからファイルをダウンロード・アップロードできます。

ファイルダウンロードftp> get <file>

FTPサーバーのディレクトリ確認と指定ファイルのダウンロードをしてみます。

まず、どのファイルをダウンロードするか確認するためにサブコマンドのlsを実行します。 (別ディレクトリへの移動はサブコマンドのcdでできます。)

ftp> ls
229 Entering Extended Passive Mode (|||55983|)
150 Here comes the directory listing.
drwxr-xr-x    2 1000     1000         4096 Feb 21 10:14 Bookshelf
drwxr-xr-x    2 1000     1000         4096 Mar 01 20:17 Desktop
drwxr-xr-x    7 1000     1000         4096 Jul 16 16:15 Documents
drwxr-xr-x    2 1000     1000         4096 Feb 26 20:46 Downloads
drwxr-xr-x    2 1000     1000         4096 Feb 26 20:46 Music
drwxr-xr-x    2 1000     1000         4096 Feb 26 20:46 Pictures
drwxr-xr-x    2 1000     1000         4096 Feb 26 20:46 Public
drwxr-xr-x    2 1000     1000         4096 Feb 26 20:46 Videos
-rw-r--r--    1 1000     1000           11 Jul 16 07:51 server-file

今回は、クライアント側にダウンロードさせたいファイルのserver-fileがFTPサーバー側のホームディレクトリにあることが確認できました。

それでは、このserver-fileをクライアント側でダウンロードしましょう。

上記のls実行で、FTPサーバーのカレントディレクトリがホームディレクトリであることを確認できました。 そのまま次のコマンドを実行すれば、指定したファイルをFTPサーバーのカレントディレクトリからクライアントへ転送できます。

ftp> get server-file
local: server-file remote: server-file
229 Entering Extended Passive Mode (|||12501|)
150 Opening BINARY mode data connection for server-file (11 bytes).
100% |***********************************|    11        3.10 KiB/s    00:00 ETA
226 Transfer complete.
11 bytes received in 00:00 (1.07 KiB/s)

コマンド実行が成功すると、上記のようにプログレスバーが表示されてダウンロードが完了します。 このときのダウンロード先はftp> get server-fileを実行したクライアント側のカレントディレクトリになります。

ファイルアップロードftp> put <file>

ファイルのアップロードでは、まずクライアント側がアップロード対象のファイルを持ったディレクトリをカレントディレクトリとしているかが重要です。

サブコマンドのlcdを使用して、クライアント側のカレントディレクトリを確認することができます。 (今回、私は/home/kamoにFTPサーバーにアップロードするclient-fileを置いたはずなので、クライアントのカレントディレクトリが/home/kamoであるか確認しています。)

ftp> lcd
Local directory now: /home/kamo   <---クライアント側のカレントディレクトリが確認できます

lsはFTPサーバー側のファイルを確認するサブコマンド、lcdはクライアント側の カレントディレクトリを確認するサブコマンドなので使い分けに注意しましょう。

それでは、client-fileを次のコマンドでFTPサーバーにアップロードしてみます。

ftp> put client-file
local: client-file remote: client-file
229 Entering Extended Passive Mode (|||34511|)
150 Ok to send data.
100% |*************************************************************************************************|    11       14.37 KiB/s    00:00 ETA
226 Transfer complete.
11 bytes sent in 00:00 (0.95 KiB/s)

コマンド実行が成功すると、プログレスバーが表示されてアップロードが完了します。 このときのアップロード先はFTPサーバーのカレントディレクトリです。

そのため、今度はlsを実行して、FTPサーバーのカレントディレクトリの中身を見てみると 確かにclient-fileが存在することが分かります。

ftp> ls
229 Entering Extended Passive Mode (|||55983|)
150 Here comes the directory listing.
drwxr-xr-x    2 1000     1000         4096 Feb 21 10:14 Bookshelf
drwxr-xr-x    2 1000     1000         4096 Mar 01 20:17 Desktop
drwxr-xr-x    7 1000     1000         4096 Jul 16 16:15 Documents
drwxr-xr-x    2 1000     1000         4096 Feb 26 20:46 Downloads
drwxr-xr-x    2 1000     1000         4096 Feb 26 20:46 Music
drwxr-xr-x    2 1000     1000         4096 Feb 26 20:46 Pictures
drwxr-xr-x    2 1000     1000         4096 Feb 26 20:46 Public
drwxr-xr-x    2 1000     1000         4096 Feb 26 20:46 Videos
-rw-r--r--    1 1000     1000           11 Jul 16 07:51 server-file
-rw-r--r--    1 1000     1000           11 Jul 16 13:28 client-file

[UDP] TFTPコマンドを利用したファイルのダウンロード・アップロード

ここではTFTPサーバーを利用したファイル転送について紹介します。

TFTPサーバーはファイル転送としてトランスポート層プロトコルであるUDP(User Datagram Protocol)を利用したサーバーです。

ファイル転送手続きをUDPで簡素化しているため、データストリームへの負荷を抑えながらファイルをダウンロード・アップロードできます。

ただし、FTPのようなサーバーログイン機能を持たないため、機器情報を確認するようなlslcdなどのサブコマンドはありません。

TFTPは認証と暗号化がないため、管理ネットワーク内の限定用途でのみ使用してください。

それでは、ファイルのダウンロードとアップロードをそれぞれ試しながら使い方を紹介します。

サーバーとクライアントの設置
サーバーとクライアントをネットワークに配置するところから紹介します。

今回、私の環境では192.168.3.0/24のネットワークにTFTPサーバーとなるLinuxマシン(192.168.3.10/24)とクライアントのLinuxマシン(192.168.3.20)を1台ずつ配置しました。

実施する場合は、自身のネットワーク環境を把握してください。基本はipコマンドで、ネットワークとサーバー/クライアントのIPアドレスを確認できます(ifconfigはnet-tools導入時のみ利用可能です)。

192.168.3.0/24のような、特定のネットワーク上にサーバーとクライアントが接続されており、共にIPアドレスが割り当てられていればOKです。

今回は、TFTPサーバー側にクライアントにダウンロードさせるserver-fileを用意します。一方、クライアント側にはTFTPサーバーにアップロードするclient-fileを 用意します。これらのファイルをダウンロード・アップロードすることで、その使い方を紹介します。

TFTPサーバー(tftpd-hpa)の導入
それでは、TFTPサーバーを導入して起動してみましょう。

今回は多くのLinuxディストリビューションで利用されるTFTPサーバーのtftpd-hpaをインストールします。

次のコマンドでtftpd-hpaをインストールできます。

kamo@raspberrypi:~ $ sudo apt update
kamo@raspberrypi:~ $ sudo apt install tftpd-hpa

インストールできたら、次は設定ファイルの/etc/default/tftpd-hpaを編集します。

今回はデフォルト設定で禁止されているファイルのアップロードをしたいので、必要な書き込み権限を有効化します。

具体的には、/etc/default/tftpd-hpaのTFTP_OPTIONS項目に--createを追記します。

# /etc/default/tftpd-hpa

TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/srv/tftp"
TFTP_ADDRESS=":69"
TFTP_OPTIONS="--secure --create"   書き込みを許可したい場合はここに--createを追記します。

また、tftpサーバーの転送用ディレクトリ/srv/tftpはデフォルトでroot権限のため、このままでは権限エラーになる場合があります。

そこで、chownコマンドで/srv/tftpの所有者をrootからtftpに変更します。 これによりアップロード要求が拒否されにくくなります。

kamo@raspberrypi:~ $ sudo chown -R tftp:tftp /srv/tftp

最後にTFTPサーバーを起動してみましょう。次のコマンドを実行してください。

kamo@raspberrypi:~ $ sudo systemctl start tftpd-hpa

以降は、次のコマンドでクライアント側からファイルのダウンロードとアップロードができます。

ファイルダウンロードtftp get <file>

getでTFTPサーバーから指定したファイルをダウンロードできます。

kamo@kamo:~$ tftp 192.168.3.10
tftp> get server-file
Received 12 bytes in 0.2 seconds

なお、今回はTFTPサーバーへのアクセスとダウンロード行を分けていますが、次のように一行で済ませることもできます。

tftp 192.168.3.10 -c get server-file

ファイルアップロードtftp put <file>

putでクライアント側の指定ファイルをTFTPサーバーへアップロードできます。

kamo@kamo:~$ tftp 192.168.3.10
tftp> put client-file
Sent 13 bytes in 0.0 seconds

なお、今回はTFTPサーバーへのアクセスとアップロード行を分けていますが、次のように一行で済ませることもできます。

tftp 192.168.3.10 -c put client-file

[SFTP] SFTPコマンドを利用したファイルのダウンロード・アップロード

ここではSFTP(SSH File Transfer Protocol)を利用したファイル転送について紹介します。

SFTPはSSHの暗号化通信をそのまま利用するため、FTPより安全にファイルをダウンロード・アップロードできます。

SFTPサーバーに接続
クライアント側で次のコマンドを実行すると、SFTPサーバーに接続できます。

kamo@kamo:~$ sftp kamo@192.168.3.10
kamo@192.168.3.10's password:
Connected to 192.168.3.10.
sftp>

ファイルダウンロードsftp> get <file>

サーバー側のファイルをダウンロードする場合は、次のようにgetを実行します。

sftp> get server-file
Fetching /home/kamo/server-file to server-file
server-file                                   100%   11     1.4KB/s   00:00

ファイルアップロードsftp> put <file>

クライアント側のファイルをサーバーへ送る場合は、次のようにputを実行します。

sftp> put client-file
Uploading client-file to /home/kamo/client-file
client-file                                   100%   11     2.0KB/s   00:00
sftp> bye

[FTPS] FTPSを利用したファイルのダウンロード・アップロード

次に、FTP通信をTLSで暗号化するFTPS(FTP over SSL/TLS)を利用したファイル転送方法を紹介します。

FTPSサーバー(vsftpd + TLS)の準備
ここではFTP節で導入したvsftpdを使い、TLS設定を追加してFTPSを有効化します。

kamo@raspberrypi:~ $ sudo apt update
kamo@raspberrypi:~ $ sudo apt install openssl
kamo@raspberrypi:~ $ sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/vsftpd.key -out /etc/ssl/private/vsftpd.crt
# /etc/vsftpd.conf の設定例(抜粋)
ssl_enable=YES
allow_anon_ssl=NO
force_local_logins_ssl=YES
force_local_data_ssl=YES
rsa_cert_file=/etc/ssl/private/vsftpd.crt
rsa_private_key_file=/etc/ssl/private/vsftpd.key
kamo@raspberrypi:~ $ sudo systemctl restart vsftpd

自己署名証明書で検証する場合、クライアント側で証明書検証を一時的に無効化する手順が必要になることがあります。運用環境では正規証明書の利用を推奨します。

FTPSサーバーに接続
クライアント側ではlftpを使うとFTPS接続を確認しやすいです。

kamo@kamo:~$ sudo apt install lftp
kamo@kamo:~$ lftp
lftp :~> set ssl:verify-certificate no
lftp :~> open -u kamo ftps://192.168.3.10
Password:
lftp kamo@192.168.3.10:~>

ファイルダウンロードlftp> get <file>

サーバー側のファイルを取得する場合は、次のようにgetを実行します。

lftp kamo@192.168.3.10:~> get server-file

ファイルアップロードlftp> put <file>

クライアント側のファイルを送信する場合は、次のようにputを実行します。

lftp kamo@192.168.3.10:~> put client-file
lftp kamo@192.168.3.10:~> bye

[SSH] SCPコマンドを利用したファイルのダウンロード・アップロード

SSH接続を利用したファイル転送方法のSCP(Secure Copy)について紹介します。

SCPコマンドはSSHのストリームを利用してファイル転送をするツールです。SSHをサポートする機器同士で利用できます。

サーバーとクライアントの設置
サーバーとクライアントをネットワークに配置するところから紹介します。

今回、私の環境では192.168.3.0/24のネットワークにSSHサーバーとなるLinuxマシン(192.168.3.10/24)とクライアントのLinuxマシン(192.168.3.20)を1台ずつ配置しました。

実施する場合は、自身のネットワーク環境を把握してください。基本はipコマンドで、ネットワークとサーバー/クライアントのIPアドレスを確認できます(ifconfigはnet-tools導入時のみ利用可能です)。

192.168.3.0/24のような、特定のネットワーク上にサーバーとクライアントが接続されており、共にIPアドレスが割り当てられていればOKです。

今回は、SSHサーバー側にクライアントにダウンロードさせるserver-fileを用意します。一方、クライアント側にはSSHサーバーにアップロードするclient-fileを 用意します。これらのファイルをダウンロード・アップロードすることで、その使い方を紹介します。

SSHサーバー(OpenSSH)の導入
次はSSHサーバーをインストールして起動します。

なお、SSHサーバーは多くのLinuxディストリビューションでプリインストールされています。

SSHサーバーがインストールされていない場合は、次のコマンドでインストールしてください。 ここでは、SSHサーバーとして代表的なOpenSSHをインストールします。

kamo@raspberrypi:~ $ sudo apt update
kamo@raspberrypi:~ $ sudo apt install openssh-server

インストールが完了したら、次のコマンドで現在の動作ステータスを確認し、停止中であれば起動します。

kamo@raspberrypi:~ $ sudo systemctl status ssh  <--- ステータスを確認
kamo@raspberrypi:~ $ sudo systemctl start ssh  <--- 停止していればここで起動

これでSCPコマンドによるファイルのダウンロードとアップロードができる環境が整いました。

次に、ファイルのダウンロードとアップロード方法を示します。 どちらも同じコマンド形式で、転送元と転送先が入れ替わるだけです。

ファイルダウンロードscp <source> <destination>

クライアント側のコンソールに次のSCPコマンドを入力することで、サーバー側が持つファイルをダウンロードできます。 パスワードを掛けている場合はその入力を要求されます。

この例では、SSHサーバーの/home/kamoに存在するserver-fileをクライアントのカレントディレクトリにダウンロードしています。
kamo@kamo:~$ scp kamo@192.168.3.10:/home/kamo/server-file ./
kamo@192.168.3.10's password: 
server-file                                   100%   11     2.1KB/s   00:00  

ファイルアップロードscp <source> <destination>

クライアント側のコンソールに次のSCPコマンドを入力することで、サーバーへファイルをアップロードできます。 パスワードを掛けている場合はその入力を要求されます。

この例では、クライアント側のclient-fileをSSHサーバーの/home/kamoにアップロードしています。
kamo@kamo:~$ scp ./client-file kamo@192.168.3.10:/home/kamo
kamo@192.168.3.10's password: 
client-file                                   100%   11     1.3KB/s   00:00    

これは、上記のファイルダウンロードと同じコマンド呼び出しです。ファイル元<source>と転送先<destination>の関係を入れ替えただけです。

[UART] おまけ:UART接続によるファイルアップロードとダウンロード

ここではおまけとして、UARTシリアル通信でコンソールに接続し、コピー&ペーストでファイルをやり取りする方法を紹介します。

補足

このサイトにはUARTシリアル接続用のWebシリアルコンソールがあります。 本節で紹介するUARTによるファイル転送とは、このようなシリアルコンソールを利用したものです。

代表的なものとして、Tera Termがあります。

制限事項と位置づけ(最終手段)
この方法は、ネットワーク経由のファイル転送(HTTP/FTP/SFTP/SCPなど)が使えない場合の最終手段です。

実施条件は、組み込み機器などでUARTシリアル通信ができること、かつシリアルコンソールからログインしてコマンド実行できることです。

厳密には、UART自体はHTTPやSFTPのようなファイル転送プロトコルではなく、シリアル通信の経路です。 ここで紹介している方法は、シリアルコンソールの入出力を使って文字列を手作業で受け渡しする方法です。

UART経由のコピー&ペースト転送は、速度が遅く、端末設定や貼り付け失敗の影響を受けやすい方法です。 大きなファイルやバイナリファイルには不向きなため、可能なら通常のファイル転送プロトコルを優先してください。

どうしてもバイナリを扱う必要がある場合は、base64でテキスト化して復元する方法や、 xmodem/ymodem/zmodemに対応したツールの利用を検討してください。

ファイルアップロード(コピー&ペースト)

ターゲット機器側で次のコマンドを実行し、待ち受け状態にした後、送信したいテキスト内容を貼り付けます。 貼り付け後にCtrl + Dで終了すると、ファイルとして保存できます。

kamo@target-device:~$ cat > /tmp/upload-from-uart.txt
# ここでPC側からテキストを貼り付ける
# 終了は Ctrl + D

作成後は、次のように内容を確認します。

kamo@target-device:~$ ls -l /tmp/upload-from-uart.txt
kamo@target-device:~$ cat /tmp/upload-from-uart.txt

ファイルダウンロード(コピー)

逆方向は、ターゲット機器側でcatして表示された内容を、PC側へコピーして保存します。

kamo@target-device:~$ cat /tmp/download-to-pc.txt
# 表示された内容をPC側にコピーしてテキストファイルとして保存する

以上のように、UARTでも最低限の読み書きは可能ですが、あくまで緊急時のアナログな転送手段として使うのが実践的です。

おわりに

今回は、いろいろなファイル転送方法について紹介しました。

状況に応じて適切な方法を使い分けることが重要です。複数の方法を理解していることで、様々な場面に対応できるでしょう。

もしも困ったことがあった際には、この記事をいつでも見返してみて頂ければと思います。

この記事が読者の皆さんの助けになれば幸いです。

参考文献