LoginSignup
15
9

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

Last updated at Posted at 2021-04-21

はじめに

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

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

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

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

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

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

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

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

使うもの

  • パソコン
  • Androidスマートフォン

手順

【前準備】

パソコン

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

スマートフォン

1.termuxをインストール

2.必要なパッケージをインストールする
パッケージのアップデートとアップグレード
$ pkg update
$ pkg upgrade
$ apt update
$ apt upgrade
必要なパッケージをインストールする
$ pkg openssh
$ pkg iproute2
$ pkg nmap
3.termuxをスマートフォンの内部ストレージにリンクさせる

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

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

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

/com.termux/以下にはアクセスできる
$ pwd
/data/data/com.termux
$ ls
cashe code_cache files shared_prefs
/data/dataより上にはアクセスできない
$ pwd
/data/data
$ ls
ls : cannot open directory '.': Permission denied

一方、内部ストレージは/storage/emulated/0以下にあるため直接アクセスできません。

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

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

内部ストレージへのリンクを作成する
$ termux-setup-storage

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

storageディレクトリが作成されたことが確認できる
$ pwd
/data/data/com.termux/files/home
$ ls
storage
storageディレクトリを確認する
$ cd storage
$ ls
dcim	movies	pictures
downloads	music	shared

storageディレクトリにアクセスして見ると上記のディレクトリがある事が分かります。
試しにdownloadsディレクトリにアクセスしてpwd -Pで物理的なディレクトリ名を表示してみると、/storage/ディレクトリにアクセスできている事が分かります。

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

【SSH接続の準備】

パソコン

1.公開鍵と秘密鍵を作る

今回使う暗号化方式は「エドワーズ曲線デジタル署名アルゴリズム - Wikipedia」というものです。
暗号化方式を指定するには-tオプションを使います。ed25519と指定すれば上記の暗号方式となります。
また、鍵に名前を付けるには-fオプションを使います。今回はスマホとの暗号化接続なので「id_ed25519_smart」と名付けます。

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

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

「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にします。

.sshフォルダを作る
$ mkdir .ssh
$ chmod 700 ~/.ssh

次に、.sshフォルダ内にauthorized_keysを作り、パーミッションを600にします。

authorized_keys
$ touch ~/.ssh/authorized_keys
$ cdmod 600 ~/.ssh/authorized_keys

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

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

$ ip -4 a

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

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

参考サイト
3.sshdを起動してポート番号を確認する

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

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を起動してみます。

sshd起動
$ sshd

もう一度nmapで調べます。

今度は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接続をする書式は以下の通り。

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

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

ECDSA key fingerprint is フィンガープリント. 
 Are you sure you want to continue connecting (yes/no)? yes

一度接続すると、フィンガープリントは/.ssh/known_hostsファイルに保存され、今後は何も聞かれなくなります。

スマートフォンに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」というファイルを作成します。

パソコンから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で調べます。

きちんと「ダウンロード」フォルダ以下に作られていることが分かる
$ 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接続が出来たことでscpsftpもスマホとパソコン間で行えるようになります。

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

参考文献

15
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
9