はじめに
この記事ではパソコンからSSH接続でAndroidスマートフォンにアクセスすることを目的とします。
SSH接続するには「openssh」というアプリが入っていれば使えます。Windowsにもデフォルトで入るようになったので、今回はWindowsでSSH接続してみます。
ただし、WindowsからSSH接続するにはpowershellではだめで、Git Bash を起動しなければなりません。
スマートフォンではsshどころかターミナルが使えないため、ターミナルが使えるアプリをインストールします。
以前は「termux」というアプリが主流でしたが現在はplayストアで更新できない状態が続いているため、現在おすすめのアプリは 「UserLAnd」 というアプリになります。
以前Qiitaで同じような記事を書いていました1。このときは「termux」を取り上げていましたが、今回はそれの「UserLAnd」版となります。
UserLAndはroot化しなくてもLinuxコマンドが扱える、非常に軽いオープンソースアプリです。
普通のLinuxのようにsudo apt install
でアプリをインストールできるので、iproute2
とnmap
をインストールします。
UserLAndはアプリ起動時にSSHデーモンが起動して自動でポートが開放されるので、ip -4 a
でIPアドレスを確認したあと、
nmap localhost
でポートを確認してメモします。
その後、パソコン側でssh -p ポート番号 -i SSH秘密鍵 userland@IPアドレス
と打つとSSH接続ができます。
ところでSSH接続をするには鍵が必要です。
パソコン側でssh-keygen
コマンドで鍵を作成できます。鍵は「秘密鍵」と「公開鍵」がペアで作成されるので、秘密鍵はPC:~/.ssh
に保管し、公開鍵は何らかの手段でスマートフォンに送りuserland@localhost:~/.ssh/authorized_keys
に追記します。こうすることで、公開鍵に対応する秘密鍵を所有しているパソコンのみがAndroidスマートフォンにSSH接続できるようになります。
使うもの
- パソコン(今回はWindows)
- Andoroidスマートフォン
SSH接続への手順
【前準備】
PC
1.Git Bashをインストールする
WindowsにGit Bashをインストールする方法はいくつかありますが、一番簡単な方法は Scoop というパッケージ管理ツールを使う方法です。
まずはscoopをインストールします。
powershellを開き、以下のコマンドをそのままコピペして貼り付けてください。
PS C:\Users\user> Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
PS C:\Users\user> irm get.scoop.sh | iex
これでGitがインストールできます。以下のコマンドを入力すると、C:\Users\ユーザー名\scoop\apps
にGitがインストールされ、Git Bashが使えるようになっています。
PS C:\Users\user> scoop install git
Androidスマートフォン
1.「UserLAnd」をインストール
UserLAndの名前の由来は?
少し話が逸れますが、「UserLAnd」の名前の由来はご存知でしょうか?
これは「OSが動作するのに必要な、カーネル以外の部分」2を指す言葉です。
ユーザーランド(userland)とは、実行中のオペレーティングシステム(OS)環境の中で、中核部であるカーネル以外の要素のこと。一般ユーザーの権限で操作できる領域であり、シェルやコマンド、アプリケーションなどが含まれる。
出典: ユーザーランドとは - 意味をわかりやすく - IT用語辞典 e-Words
OSは二種類の構造で出来ています。それが「カーネル」と「ユーザーランド」です。
- OS
- カーネル
- ユーザーランド
カーネルとはOSのコアで、最も有名なカーネルが「Linux」です。Linuxは 「オープンソース」 のカーネルであったことが画期的であり、爆発的に広まりました。
一方、それ以外の部分である「ユーザーランド」と Linux に直接的な関わりはありません。そのため、Linux は一般的に Linux Distribution(Linux配布物) と呼ばれます。
Linuxディストリビューションは,Linuxカーネル,Cライブラリ「glibc」などのGNUソフトウエア,各種フリーソフトを組み合わせて,デスクトップやサーバーなどの環境を快適に使えるようにしたOS(オペレーティング・システム)です。
出典: Linuxディストリビューション | 日経クロステック(xTECH)
つまり、Linux Distribution とは 「Linuxカーネルと独自のユーザーランドを一纏めにしたもの」 です。
スマートフォンアプリ「UserLAnd」は、どの Linux Distribution(ユーザーランド)を使うかユーザーが判断できるアプリです。
有名な Ubuntu や Debian 以外にも、Arch・Alpine・Kali を使うことができます。
2.Ubuntuを選択
アプリを起動すると、以下のような画面になります。
「Session」と「Filesystems」タブを開くと、初期画面では何も写っていません。
「Ubuntu」を選択します。
すると、「Please select a desktop enviroment:
」と聞かれますので、一番上を選んでください。
次に、「Please select a connection type:
」と聞かれますので、「Terminal」を選んでください。
「Always use this setting」チェックはどちらでも構いません。
すると、以下のような「Setting up」画面となるので、しばらくお待ちください。
しばらく待っていると、以下のような画面が表示されます。
これが「ターミナル」です。
ここで、Androidの設定をしていきます。
ちなみに、画面を戻すと、先程何も表示されていなかった「Sessions」と「Filesystems」にubuntuが表示されています。
3.必要なパッケージをインストールする
まず最初にupdateとupgradeを済ませます。
userland@localhost:~$ sudo apt update
userland@localhost:~$ sudo apt upgrade
更新が済んだら、必要なアプリをインストールします。
userland@localhost:~$ sudo apt install iproute2 # IPアドレスの確認
userland@localhost:~$ sudo apt install nmap # ポート番号の確認
4.現在ディレクトリを確認する
pwd
と入力して、現在ディレクトリを確認しておきます。
UserLAndのターミナル上では、/home/userland/
にいることが分かります。
userland@localhost:~$ pwd
/home/userland
【SSH接続の準備】
PC
1.秘密鍵と公開鍵を作る
ssh-keygen
と入力すると、現在ディレクトリ以下に、秘密鍵と公開鍵を作ることが出来ます。
秘密鍵とは、その名の通り誰にも見せてはいけない鍵で、通常~/.ssh
フォルダに置くことが多いです。
公開鍵とは、通信したい相手に渡す鍵で、今回はDropboxを経由して渡します。
今回使う暗号化方式は「エドワーズ曲線デジタル署名アルゴリズム - Wikipedia」というもので、 「ed25519」 と指定します。
以下は、オプションの説明です。
- -tオプション: 暗号化方式を指定に使います。
ed25519
と指定します。 - -fオプション: 鍵に名前を付けます。今回はAndroidスマートフォンとの暗号化接続なので「id_ed25519_android」と名付けます。
まずは、.ssh
フォルダを作成して、移動します。
PowerShell 7.4.1
PS C:\Users\user> mkdir .ssh
Directory: C:\Users\user
Mode LastWriteTime Length Name
---- ------------- ------ ----
d---- 2024/02/04 日曜日 20:45 .ssh
PS C:\Users\user> cd .ssh
次に鍵を作成します。
今回はテストなので、パスフレーズの入力は省略します(何も入力せずEnter)。
PS C:\Users\user\.ssh> ssh-keygen -t ed25519 -f id_ed25519_android
Generating public/private ed25519 key pair.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in id_ed25519_android
Your public key has been saved in id_ed25519_android.pub
The key fingerprint is:
SHA256:フィンガープリント ユーザー名@ホスト名
The key's randomart image is:
+--[ED25519 256]--+
| イ |
| メ |
| | |
| ジ |
| |
| |
| |
| |
| |
+----[SHA256]-----+
生成した鍵を確認します。
無事生成できた事がわかったら、
.pub
という拡張子がついている方が公開鍵です。
PS C:\Users\user\.ssh> ls
id_ed25519_android
id_ed25519_android.pub
2.公開鍵をスマホに送る
送る手段は何でもいいです。今回はDropboxを使いました。Dropboxを通じて、スマートフォンのどこかにid_ed25519_android.pub
を保存します。
今回はスマートフォンの「ダウンロードディレクトリ」に保存しておきます。
Androidスマートフォン
1.authorized_keysに公開鍵を登録する
他のクライアントから受け取った公開鍵は全て、中身をauthorized_keysファイルにコピーして運用します。
そのため、まずはauthorized_keysとそれを保管する.sshフォルダを作成します。
ホームディレクトリ下に~/.sshを作って、パーミッションを700にします。
userland@localhost:~$ mkdir .ssh
userland@localhost:~$ chmod 700 .ssh
次に、.sshフォルダ内にauthorized_keysを作って、パーミッションは600にします。
userland@localhost:~$ touch .ssh/authorized_keys
userland@localhost:~$ chmod 600 .ssh/authorized_keys
Dropboxを経由して、ダウンロードフォルダに「id_ed25519_android.pub」に置いたことを確認した後、中身をauthorized_keysファイルに追記します。
>
はリダイレクトを意味しており、二個重ねると追記となります。
userland@localhost:~$ cat /Downloads/id_ed25519_android.pub >> ~/.ssh/authorized_keys
2.IPアドレスを確認する
ip -4 aと入力するとIPアドレスが分かる。
- -4はIPv4のこと。
- aはaddress(住所)の略。
userland@localhost:~$ ip -4 a
コマンドを打つと、loとwlan0が出るので、wlan0のIPアドレスを確認する。
- loは「ローカルループバック」と呼ばれる自分自身を指すIPアドレス。常に127.0.0.1となる。
- wlan0は無線LANアダプタ.。inetと書かれている欄がIPアドレスとなる。
Android13からcannot bind netlink socket: permission denied
と表示され、IPアドレスを確認することが出来ないそうです。
https://github.com/termux/termux-app/issues/2993
3.ポート番号を確認する
UserLAndは起動しただけでsshdが起動しているため、開いているポート番号を確認する。
userland@localhost:~$ nmap localhost
Starting Nmap 7.80 ( https://nmap.org ) at 2024-02-08 07:31 UTC
Nmap scan report for localhost (127.0.0.1)
Host is up (0.0018s latency).
Not shown: 998 closed ports
PORT STATE SERVICE
22/tcp open ssh
2022/tcp open down
Nmap done: 1 IP address (1 host up) scanned in 1.62 seconds
ポートは全部で1000個あるが、Not shown: 998 closed ports
となり2つだけ閉じていないことが分かる。
開いているポート番号は22
と2022
であることが分かったので、メモをする。このうち、2022を使います。
IPアドレスが島の住所なら、ポートは島にたくさんある港であり、 「このデバイスにSSH接続をしたいのであればこの2022番のポートを使ってください」 という意味になります。
SERVICEとは?
ちなみに、ポートの各項目の説明は以下の通り。
- PORT: 開いているポート番号
- STATE: ポートが開いているか、閉じているかの状態
- SEVICE: nmapがサービスの名前を自動で判断している
上記はSEVICEが「down」となっているが、この名前はIANAが登録したサービス名を参照している。
上記のサイトを見ると、ポート番号が「2022」でプロトコルが「tcp」のサービス名を「down」と名付けている事がわかる。nmapをこれを元にSEVICEを決定している。
ちなみに、IANAとは「Internet Assigned Numbers Authority」の略3です。
IANAは、南カリフォルニア大学情報科学研究所(ISI)のJon Postel教授が中心となって始めたプロジェクトグループで、 ドメイン名、 IPアドレス、 プロトコル番号など、 インターネット資源のグローバルな管理を行っていました。
(中略)
その後、 1998年10月に国際的な非営利法人 ICANN が設立されてインターネットの管理体制が変化し、 2000年2月にはICANN、南カリフォルニア大学、 及びアメリカ政府の三者の合意により、 IANAが行っていた各種資源のグローバルな管理の役割は ICANNに引き継がれることになりました。 2002年現在IANAは、ICANNにおける機能の名称として使われています。
出典: インターネット用語1分解説~IANAとは~ - JPNIC
参考サイト
- TCP22番ポートとは?SSH通信の基本概念を分かりやすく解説する | THE SIMPLE
- openssh - After I switch default SSH ports, why does NMAP display port service as "down" - Super User
- Service Name and Transport Protocol Port Number Registry
【SSH接続開始】
PC
UserLAndを起動したことでポートが開放され、さらに公開鍵をスマートフォンに送りauthorized_keysへの登録も完了したので、いよいよSSH接続を開始できます。
SSH接続をする書式は以下の通りです。IPアドレスには、ip -4 a
で調べたIPアドレスを入力してください。
PS C:\Users\user\.ssh> ssh -p ポート番号 -i 使用する秘密鍵 userland@IPアドレス
しかし、ここで一つ注意点があります。上記のコマンドのようにPowershellでSSH接続しようとすると、以下のような表記が出てタイムアウトになります。
PS C:\Users\user\.ssh> ssh -p 2022 -i id_ed25519_android userland@IPアドレス
ssh: connect to host IPアドレス port 2022: Connection timed out
ここで、Git Bashを使うことになります。
powershell上でbash
と入力すると、ユーザー名@PC名 MINGW64 ~$
に移行します。
PS C:\Users\user> bash
user@PC名 MINGW64 ~
$
ここで同じようにコマンドを入力すると、以下のように接続できます。
また、初めて接続すると以下のようにフィンガープリントが提示され、本当に接続していいかと聞かれるので、「yes」と入力したください。
user@PC名 MINGW64 ~
$ ssh -p 2022 -i id_ed25519_android IPアドレス
The authenticity of host '[IPアドレス]:2022 ([IPアドレス]:2022)' can't be established.
ECDSA key fingerprint is フィンガープリント.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '[IPアドレス]:2022' (ECDSA) to the list of known hosts.
userland@localhost:~$
一度接続すると、フィンガープリントは~/.ssh/known_hosts
ファイルに保存され、次回移行の接続からは何も聞かれなくなります。
接続するとパソコンのターミナル上でAndroidを操作出来るようになります。
SSH接続をやめるにはexit
コマンドを打ちます。
試しに、dowloadsディレクトリに「test.txt」というファイルを作成します。
$ ssh -p 2022 -i id_ed25519_android userland@IPアドレス
userland@localhost:~$ whoami
userland
userland@localhost:~$ pwd
/home/userland
userland@localhost:~$ cd /Downloads
userland@localhost:/Downloads$ touch test.txt
userland@localhost:/Downloads$ exit
logout
Connection to IPアドレス closed.
Androidスマートフォン
パソコンから作成した「test.txt」があるかをUserLAndで調べます。
userland@localhost:~$ pwd
/home/userland
userland@localhost:~$ find /Downloads/test.txt
/Downloads/test.txt
きちんと「ダウンロード」フォルダ以下に作られていることが分かります。
まとめ
これでパソコンからAndroidスマートフォンにSSH接続することができます。以前は「Termux」を使用していましたが、Playストアで更新できなくなって久しいため、「UserLAnd」を使ってSSH接続する方法をあらためてまとめました。
以前の記事は以下からご覧ください。
今回は手間を省く為に鍵のパスフレーズを作りませんでしたが、実際の運用では作った方が良いです。
SSH接続が出来たことでscpやsftpもスマホとパソコン間で行えるようになります。