AndroidスマホにWifi経由でSSH接続する方法

## はじめに
この記事では~~Linuxが入った~~**パソコンからSSH接続でAndroidスマートフォンにアクセスすること**を目的とします。

:::note info
最近のWindowsでは、デフォルトでopensshが入っているので、今回の方法も使えるようになりました。
:::

SSH接続を試みる側（SSHクライアント）は「openssh」さえ入っていれば使えます。一方、SSH接続を受ける側は「sshd」というSSHのデーモンを起動していなければ接続を受けることは出来ません。
通常のLinuxでは起動した瞬間にsshdが起動し、またopensshもデフォルトで入っています。しかし、スマートフォンはopensshを使えず、また能動的にユーザーが「`sshd`」とコマンドを打たなければsshdが起動しません。
そのため、これらの設定をするために、スマートフォン側で「**termux**」というターミナルアプリをインストールします。
termuxはroot化しなくてもLinuxコマンドを扱えることに加え、非常に軽いため、おすすめできる。もちろんオープンソースです。

:::note alert
現在Termuxは、Google Playでの更新を技術的な理由により停止しています。そのため、termuxを使うことは**推奨されていません**。
もし、どうしてもtermuxが使いたい場合は、「 https://github.com/termux/termux-packages/wiki/Package-Management 」を参照するか、「F-Droid」というアプリケーションストアから最新版をダウンロードしてください。
参考: [【Android】Termuxをインストールして開発の準備をしよう！【①】 - Wither Home Blog's](https://fogwither.hatenablog.com/entry/20220903/1662214442#F-Droid%E3%81%A8%E3%81%AF)

もしくは、第三の方法としてtermuxではなく、 **「UserLAnd」** というアプリを使う方法があります。こちらはubuntuなどのLinuxターミナルを使えるOSSアプリです。

以下の記事でUserLAnd版のSSH接続方法を紹介していますので、御覧ください。
この記事は、termuxをもし使うための方に残しておきます。
:::

https://qiita.com/yusu79/items/6e6590cce74cc1f4ea06

インストールし各種設定を終えた後、`sshd`と打つとssh接続を受けるためのポートが開放されます。`ip -4 a`でIPアドレスを、`nmap`で開いているポートを確認できます。
このIPアドレスと開放されているポートをメモし、パソコン側で`ssh -p ポート番号 IPアドレス`と打つとSSH接続ができます。

ところでSSH接続をするには鍵が必要です。
パソコン側で`ssh-keygen`コマンドで鍵を作成できます。鍵は「秘密鍵」と「公開鍵」のペアが作成されて、この内、公開鍵を何らかの手段でスマートフォンに送り`~/.ssh/authorized_keys`に追記することで、公開鍵に対応する秘密鍵を所有しているパソコンのみがスマートフォンにSSH接続できるようになります。

## 使うもの
- パソコン
- Androidスマートフォン

## 手順
### 【前準備】

#### パソコン

パソコン側で準備することはありません。

#### スマートフォン
##### 1.termuxをインストール

https://play.google.com/store/apps/details?id=com.termux&hl=ja&gl=US


##### 2.必要なパッケージをインストールする
```bash:パッケージのアップデートとアップグレード
$ pkg update
$ pkg upgrade
$ apt update
$ apt upgrade
```
```bash:必要なパッケージをインストールする
$ pkg openssh
$ pkg iproute2
$ pkg nmap
```


##### 3.termuxをスマートフォンの内部ストレージにリンクさせる

termuxのホームディレクトリを確認してみます。

```bash:ホームディレクトリを確認する
$ pwd
/data/data/com.termux/files/home
```

すると、termuxは親ディレクトリが`/data/`にあることが分かります。ところで、terumuxは`/com.termux/`ディレクトリまではアクセスできますが、その上の`/data/`ディレクトリからはアクセス拒否されます。

```bash:/com.termux/以下にはアクセスできる
$ pwd
/data/data/com.termux
$ ls
cashe code_cache files shared_prefs
```
```bash:/data/dataより上にはアクセスできない
$ pwd
/data/data
$ ls
ls : cannot open directory '.': Permission denied
```
一方、内部ストレージは`/storage/emulated/0`以下にあるため直接アクセスできません。

```bash:/storage/emulated/にアクセスしてみる
$ cd /storage/emulated/0
$ ls
ls: cannot open directory '.': Permission denied
```

そのため、以下のコマンドを入力し、内部ストレージへのシンボリックリンク（ショートカット）を作ります。

```bash:内部ストレージへのリンクを作成する
$ termux-setup-storage
```
上記のコマンドを実行すると、ストレージへのアクセス許可が求められ、許可をするとホームディレクトリ以下に`/storage/`ディレクトリが作成されます。


```bash:storageディレクトリが作成されたことが確認できる
$ pwd
/data/data/com.termux/files/home
$ ls
storage
```


```bash:storageディレクトリを確認する
$ cd storage
$ ls
dcim	movies	pictures
downloads	music	shared
```
storageディレクトリにアクセスして見ると上記のディレクトリがある事が分かります。
試しにdownloadsディレクトリにアクセスして`pwd -P`で物理的なディレクトリ名を表示してみると、`/storage/`ディレクトリにアクセスできている事が分かります。

```bash:/storage/downloads/にアクセスし物理的なディレクトリ名を確認する
$ cd storage/downloads
$ pwd
/data/data/com.terumx/files/home/storage/downloads
$ pwd -P
/storage/emulated/0/Download
```

### 【SSH接続の準備】
#### パソコン
##### 1.公開鍵と秘密鍵を作る
今回使う暗号化方式は「[エドワーズ曲線デジタル署名アルゴリズム - Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%A8%E3%83%89%E3%83%AF%E3%83%BC%E3%82%BA%E6%9B%B2%E7%B7%9A%E3%83%87%E3%82%B8%E3%82%BF%E3%83%AB%E7%BD%B2%E5%90%8D%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0)」というものです。
暗号化方式を指定するには`-t`オプションを使います。`ed25519`と指定すれば上記の暗号方式となります。
また、鍵に名前を付けるには`-f`オプションを使います。今回はスマホとの暗号化接続なので「**id_ed25519_smart**」と名付けます。

SSH鍵は、`~/.ssh/`に保存しておきます。

~~注意点として、通常はssh-keygenで鍵を作ると自動でホームディレクトリ下の`/.ssh/`ディレクトリに保存されますが、`-f`オプションを使うと現在ディレクトリ下に公開鍵と秘密鍵が作成されます。~~
`-f`オプションであっても、「id_」から始まる名前にすると`~/.ssh/`ディレクトリ以下に自動で保存されます。そのため、秘密鍵の名前は「**id_暗号方式_任意の名前**」とするのがおすすめです。
作成するとパスフレーズを入力するか問われますが、今回は省きます。そのままEneterを押します。

```bash:「id_ed25519_smart」という名前で公開鍵と秘密鍵を作成
$ ssh-keygen -t ed25519 -f id_ed25519_smart
Generating public/private ed25519 key pair.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in id_ed25519_smart.
Your public key has been saved in id_ed25519_smart.pub.
The key fingerprint is:
SHA256:フィンガープリント ユーザー名@ホスト名
The key's randomart image is:
+--[ED25519 256]--+
|       イ        |
|       メ        |
|       ｜        |
|       ジ        |
|                 |
|                 |
|                 |
|                 |
|                 |
+----[SHA256]-----+
 
```

##### 2.公開鍵をスマホに送る
送る手段は何でもいいです。今回はDropboxを使っています。
公開鍵は拡張子が「.pub」になっており、今回は「id_ed25519_smart.pub」がそれに当たります。
保存場所はどこでも、今回はスマートフォンの「ダウンロードディレクトリ」に保存しておきます。



#### スマートフォン
##### 1.authorized_keysに公開鍵を登録する
他のクライアントから受け取った公開鍵は全て、中身を`authorized_keys`ファイルにコピーして運用します。そのため、まずはauthorized_keysを作成します。
ホームディレクトリ下に`~/.ssh`を作り、パーミッションを700にします。

```bash:.sshフォルダを作る
$ mkdir .ssh
$ chmod 700 ~/.ssh
```
次に、.sshフォルダ内にauthorized_keysを作り、パーミッションを600にします。

```bash:authorized_keys
$ touch ~/.ssh/authorized_keys
$ cdmod 600 ~/.ssh/authorized_keys
```
ダウンロードフォルダに「id_ed25519_smart.pub」があることを確認した後、中身をauthorized_keysファイルに追記します。
`>`はリダイレクトを意味しており、二個重ねると追記となります。

```bash:authorized_keysに公開鍵を追記する
cat ~/storage/downloads/id_ed25519_smart.pub >> ~/.ssh/authorized_keys
```

##### 2.IPアドレスを確認する
`ip -4 a`と入力するとIPアドレスが分かります。
- `-4`はIPv4のこと
- `a`はaddress（住所）の略

参考：[IPv6・IPv4とは？ IPoE・PPPoEとは？ その違いを解説 | DTI](https://dream.jp/ftth/tips_f/hikari17.html)

```bash:
$ ip -4 a
```
コマンドを打つと、`lo`と`wlan0`が出る筈です。
`lo`は「ローカルループバック」と呼ばれる自分自身を指すIPアドレスです。常に`127.0.0.1`となります。これはIPネットワークやその上で動くサービスがきちんと動いているかどうかを確認するためのもので、ここに問題があればネットワークではなくコンピュータに問題があることになります。

一方、`wlan0`は無線LANアダプタ.。`inet`と書かれている欄がIPアドレスとなります。

###### 参考サイト

-  [特別なIPアドレス：ローカルループバックアドレス（Local Loopback Address）について | IT情報メディア「LIVRA」](https://livra.geolocation.co.jp/iplearning/217/)
- [ifconfigコマンドの詳細まとめました【Linuxコマンド集】](https://eng-entrance.com/linux-command-ifconfig#:~:text=wlan0%E3%81%8C%E7%84%A1%E7%B7%9ALAN%E3%82%A2%E3%83%80%E3%83%97%E3%82%BF,16.5MB%E3%81%A8%E7%A2%BA%E8%AA%8D%E3%81%A7%E3%81%8D%E3%82%8B%E3%80%82)


##### 3.sshdを起動してポート番号を確認する
SSH接続は受ける側が`sshd`（SSHのデーモン）を起動していなければなりません。
sshdを起動していない状態のポートの様子を`nmap`コマンドで確認してみます。

```bash:nmapでポートの状態を確認。スキャンした全てのポートが閉じている
$ nmap localhost
Starting Nmap 7.91 ( https://nmap.org ) at 2021-04-20 19:21 JST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.0026s latency).
All 1000 scanned ports on localhost (127.0.0.1) are closed

Nmap done: 1 IP address (1 host up) scanned in 0.60 seconds
```
`All 1000 scanned ports on localhost (127.0.0.1) are closed`から、スキャンしたポートが全て閉じている事が分かります。
では次に、sshdを起動してみます。

```bash:sshd起動
$ sshd
```
もう一度nmapで調べます。

```bash:今度は8022番のポートだけ開いている
$ nmap localhost
Starting Nmap 7.91 ( https://nmap.org ) at 2021-04-20 19:25 JST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.0032s latency).
Not shown: 999 closed ports
PORT     STATE SERVICE
8022/tcp open  oa-system

Nmap done: 1 IP address (1 host up) scanned in 0.64 seconds
```

今度は`Not shown: 999 closed ports`となり一つだけ閉じていないことが分かります。
`8022/tcp open  oa-system`を見て分かるとおり、開いているポートが8022番である事が分かりました。
IPアドレスが島の住所なら、ポートは島にたくさんある港であり、「このデバイスにSSH接続をしたいのであればこの8022番のポートを使え」という意味になります。


---

### 【SSH接続開始】

#### パソコン
これでSSH接続ができます。
SSH接続をする書式は以下の通り。

```bash:書式
$ ssh -p ポート番号 -i 使用する秘密鍵 IPアドレス
```


初めて接続すると以下のようにフィンガープリントが提示され、本当に接続していいかと聞かれます。

```bash:
ECDSA key fingerprint is フィンガープリント. 
 Are you sure you want to continue connecting (yes/no)? yes
```
一度接続すると、フィンガープリントは`/.ssh/known_hosts`ファイルに保存され、今後は何も聞かれなくなります。


```bash:スマートフォンにSSH接続をする
$ ssh -p 8022 -i id_ed25519_smart IPアドレス
Warning: Identity file id_ed25519_smart not accessible: No such file or directory.
The authenticity of host '[IPアドレス]:8022 ([IPアドレス]:8022)' can't be established.
ECDSA key fingerprint is フィンガープリント.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '[IPアドレス]:8022' (ECDSA) to the list of known hosts.

Welcome to Termux!

Wiki:            https://wiki.termux.com
Community forum: https://termux.com/community
Gitter chat:     https://gitter.im/termux/termux
IRC channel:     #termux on freenode

Working with packages:

 * Search packages:   pkg search <query>
 * Install a package: pkg install <package>
 * Upgrade packages:  pkg upgrade

Subscribing to additional repositories:

 * Root:     pkg install root-repo
 * Unstable: pkg install unstable-repo
 * X11:      pkg install x11-repo

Report issues at https://termux.com/issues
```
接続するとパソコンのターミナル上でterumuxを操作出来るようになります。
SSH接続をやめるには`exit`コマンドを打ちます。
試しに、dowloadsディレクトリに「ssh_text.txt」というファイルを作成します。

```bash:パソコンからtermuxを操作する
$ whoami
スマートフォンのユーザー名
$ pwd
/data/data/com.termux/files/home
$ cd storage/downloads
$ touch ssh_test.txt
$ exit
logout
Connection to IPアドレス closed.
```

#### スマートフォン

パソコンから作成した「ssh_test.txt」があるかをtermuxで調べます。

```bash:きちんと「ダウンロード」フォルダ以下に作られていることが分かる
$ pwd
/data/data/com.termux/files/home
$ find -L -name ssh_test.txt
./storage/shared/Download/ssh_test.txt
./storage/downloads/ssh_test.txt
```


## 終わりに

今回は手間を省く為に鍵のパスフレーズを作りませんでしたが、実際の運用では作った方が良いと思います。
また、SSH接続が出来たことで`scp`や`sftp`もスマホとパソコン間で行えるようになります。

ただし、**termuxは現在推奨されていない**ため、もし気になる方がいましたら「UserLAnd」を使ったSSH接続方法を試してみてください。

https://qiita.com/yusu79/items/6e6590cce74cc1f4ea06


## 参考文献
- [TermuxにWi-Fi経由でSSH接続する | 楽しい活字中毒](https://tanokatu.com/2019/03/27/02/)
- [SSHで鍵認証設定時にエラーが起きた場合 - make world](https://littlebuddha.hatenadiary.org/entry/20101109/1289306421)