Envaderにて、ftpコマンドを実践しながら学ぶ

30代後半、未経験からIT業界のエンジニア転職へ挑戦している、kobakichiです。

今回も[Envader](https://envader.plus/)を利用して、Linuxのコマンドについて学んだので、その振り返りと言語化を兼ねて書いていきます。

今回学んだのは、ファイルの転送などをするときに使用するコマンド`ftp`についてです。
私は全くこのコマンドを使うことは無いので、こういった用意された環境で実践しながら学べるのは本当にありがたい。

そして、`ftp`コマンドも奥が深いので、あくまで私が実践しながら感じたことを記事にしていることをご理解ください。

`Envader`についてついて気になる方は、リンクを貼っておきますので参考にしてください。

[Envaderコース一覧](https://envader.plus/course)

[今回使用したシナリオ](https://envader.plus/course/5/scenario/1020)

## 参考にさせていただいた記事等
[OSI参照モデル](https://ja.wikipedia.org/wiki/OSI%E5%8F%82%E7%85%A7%E3%83%A2%E3%83%87%E3%83%AB)

[ファイル転送の「FTP」とは？通信の仕組みやデメリットなどを解説
](https://it-trend.jp/file_transfer/article/104-0004)

[ftpコマンドについて詳しくまとめました 【Linuxコマンド集】](https://eng-entrance.com/linux-command-ftp)

## FTP
FTP（File Transfer Protocol）は、サーバとクライアントの間でファイルの転送を行う時に必要な通信プロトコル。
他にはHTTPやIMAPなどなどあると思いますが、その内の一つ。

OSI参照モデルの第7層、アプリケーション層に該当。

FTPについてはこちらの記事が分かりやすかったです。
[ファイル転送の「FTP」とは？通信の仕組みやデメリットなどを解説](https://it-trend.jp/file_transfer/article/104-0004)

## ftpコマンド
Linux環境において、CUIでFTPサーバーとの通信をやり取りする時に使用するコマンド。

これを使用することで、FTPサーバーへ接続して、ファイルのアップロード、ダウンロード、さらにはアクセス権を変更したりなど、FTPサーバー内を色々と操作できるようになります。

## ftpコマンドの注意点
`ftp`コマンドは、FTPサーバーへ接続する際の認証時のパスワードやデータ送受信の内容は一切暗号化されていないので、セキュリティは考慮できていません。
なので、実際に使用する際には`sftp`コマンドや`scp`コマンド、またはSSH接続などを使用する方が良さそうです。

## ftpコマンドの使い方
ftpサーバーへの接続
```bash
ftp サーバーのアドレス

# 例
ftp 172.10.10.5
```
こうすることで自分の接続したいftpサーバーを指定して、ログインやパスワードを入力する段階へ進む。

サーバーのアドレスを指定しないで`ftp`コマンドだけ叩いた場合、`ftp`コマンドだけが起動し、待機状態になる。
この場合には、`ftp open`コマンドによりサーバーアドレスを指定することでftpサーバーへ接続が可能になる。

```bash
# 待機状態
envader@172-19-1-2:~$ ftp
ftp>

# openコマンドで接続先アドレスを指定
envader@172-19-1-2:~$ ftp
ftp> open 172.19.1.11
```

### ftpコマンドのオプション
ここで紹介するオプションは２つ

| オプション | 説明 |
|:-:|:-:|
| -v  | FTPサーバーの処理後のメッセージを表示する  |
| -i  | FTPサーバーの処理後の確認メッセージを省略する  |

この意味がなかなか理解できなかったのですが、実際にコマンドを実行することで理解できました。

オプションを使うタイミングは、FTPサーバーへ接続する時。
そうすると、サーバーへ接続した後にオプションが適用された状態でサーバーとのやり取りができるようになります。

```bash
# 確認メッセージを表示する
ftp -v 172.19.1.11

# 確認メッセージを省略する
ftp -i 172.19.1.11
```

これを使うことで、複数のファイルをアップロードしたり、ダウンロードしたりした時に表示される確認メッセージを全部表示させるか、省略することができるようになります。

実際に比べてみます。

```bash
# ローカルに以下のファイルがある
envader@172-19-1-2:~$ ls
mydata.txt  test1.txt  test2.txt  test3.txt

# -vオプションでftpサーバーへ接続
envader@172-19-1-2:~$ ftp -v 172.19.1.11
Connected to 172.19.1.11.
220 (vsFTPd 3.0.3)
Name (172.19.1.11:envader): envader
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.

# mputコマンドで複数のファイルをftpサーバーへアップロード
ftp> mput test*.txt
mput test1.txt? y
200 PORT command successful. Consider using PASV.
150 Ok to send data.
226 Transfer complete.
mput test2.txt? y
200 PORT command successful. Consider using PASV.
150 Ok to send data.
226 Transfer complete.
mput test3.txt? y
200 PORT command successful. Consider using PASV.
150 Ok to send data.
226 Transfer complete.

# 一つのファイルをアップロードするごとに確認される。
```
どうでしょうか？
イメージはこんな感じです。

続いて`-i`オプションで確認メッセージを省略します。

```bash
# -iオプションで確認を省略
envader@172-19-1-2:~$ ftp -i 172.19.1.11
Connected to 172.19.1.11.
220 (vsFTPd 3.0.3)
Name (172.19.1.11:envader): envader
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.

# mputで複数ファイルをアップロード
ftp> mput test*.txt
local: test1.txt remote: test1.txt
200 PORT command successful. Consider using PASV.
150 Ok to send data.
226 Transfer complete.
local: test2.txt remote: test2.txt
200 PORT command successful. Consider using PASV.
150 Ok to send data.
226 Transfer complete.
local: test3.txt remote: test3.txt
200 PORT command successful. Consider using PASV.
150 Ok to send data.
226 Transfer complete.
```

いちいち確認メッセージが表示されることなく、一気にアップロードができました。
オプションによって、こういった違いがあるんですね。


## ftpコマンドの種類
ftpサーバー内では、使えるコマンドの種類があるようです。
Linuxコマンドが全て使えるわけでは無いので注意が必要ですね。

### ftpコマンド一覧
一部ですが、一覧にてまとめました。

| コマンド| 説明 |
|:-:|:-:|
|  open | サーバーに接続する  |
| close  | FTPサーバーから切断する  |
|  quit | FTPモードを終了する(exitでも可能)  |
| put  | ローカルのファイルをアップロードする  |
|  get |  ftpサーバーからダウンロードする |
| mput  |  複数のファイルをアップロードする |
|  mget | 複数のファイルをダウンロードする  |
| ls | FTPサーバー内のファイルやディレクトリを一覧表示する|
| mkdir| FTPサーバー内でディレクトリを作成する|
|chmod | ファイルのアクセス権限を変更する|
|delete | 指定したファイルを削除する|

もっと知りたい場合には、`ftpモード`にして`?`コマンドを叩くとコマンド一覧が見れます。

何か分からないことや知りたいことがあった場合には`?`コマンドは便利そうです。

```bash
envader@172-19-1-2:~$ ftp
ftp> ?
Commands may be abbreviated.  Commands are:

!               dir             mdelete         qc              site
$               disconnect      mdir            sendport        size
account         exit            mget            put             status
append          form            mkdir           pwd             struct
ascii           get             mls             quit            system
bell            glob            mode            quote           sunique
binary          hash            modtime         recv            tenex
bye             help            mput            reget           tick
case            idle            newer           rstatus         trace
cd              image           nmap            rhelp           type
cdup            ipany           nlist           rename          user
chmod           ipv4            ntrans          reset           umask
close           ipv6            open            restart         verbose
cr              lcd             prompt          rmdir           ?
delete          ls              passive         runique
debug           macdef          proxy           send
```

## まとめ
[Envader](https://envader.plus/)を利用して、`ftp`について学んでみました。

個人的には`-i`オプションを使って確認メッセージを省略した方が使い勝手が良さそうなイメージでしたが、実際に業務で使われている方はどういった感じなのかが気になるところです。

最後まで読んでいただき、ありがとうございました。