はじめに
この記事では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/
ディレクトリからはアクセス拒否されます。
$ pwd
/data/data/com.termux
$ ls
cashe code_cache files shared_prefs
$ pwd
/data/data
$ ls
ls : cannot open directory '.': Permission denied
一方、内部ストレージは/storage/emulated/0
以下にあるため直接アクセスできません。
$ cd /storage/emulated/0
$ ls
ls: cannot open directory '.': Permission denied
そのため、以下のコマンドを入力し、内部ストレージへのシンボリックリンク(ショートカット)を作ります。
$ termux-setup-storage
上記のコマンドを実行すると、ストレージへのアクセス許可が求められ、許可をするとホームディレクトリ以下に/storage/
ディレクトリが作成されます。
$ pwd
/data/data/com.termux/files/home
$ ls
storage
$ cd storage
$ ls
dcim movies pictures
downloads music shared
storageディレクトリにアクセスして見ると上記のディレクトリがある事が分かります。
試しにdownloadsディレクトリにアクセスしてpwd -P
で物理的なディレクトリ名を表示してみると、/storage/
ディレクトリにアクセスできている事が分かります。
$ 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を押します。
$ 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にします。
$ mkdir .ssh
$ chmod 700 ~/.ssh
次に、.sshフォルダ内にauthorized_keysを作り、パーミッションを600にします。
$ touch ~/.ssh/authorized_keys
$ cdmod 600 ~/.ssh/authorized_keys
ダウンロードフォルダに「id_ed25519_smart.pub」があることを確認した後、中身を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
コマンドを打つと、lo
とwlan0
が出る筈です。
lo
は「ローカルループバック」と呼ばれる自分自身を指すIPアドレスです。常に127.0.0.1
となります。これはIPネットワークやその上で動くサービスがきちんと動いているかどうかを確認するためのもので、ここに問題があればネットワークではなくコンピュータに問題があることになります。
一方、wlan0
は無線LANアダプタ.。inet
と書かれている欄がIPアドレスとなります。
参考サイト
- 特別なIPアドレス:ローカルループバックアドレス(Local Loopback Address)について | IT情報メディア「LIVRA」
- ifconfigコマンドの詳細まとめました【Linuxコマンド集】
3.sshdを起動してポート番号を確認する
SSH接続は受ける側がsshd
(SSHのデーモン)を起動していなければなりません。
sshdを起動していない状態のポートの様子を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
もう一度nmapで調べます。
$ 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 -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」というファイルを作成します。
$ 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接続が出来たことでscp
やsftp
もスマホとパソコン間で行えるようになります。
ただし、termuxは現在推奨されていないため、もし気になる方がいましたら「UserLAnd」を使ったSSH接続方法を試してみてください。