3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Android OS に openSSH で Android OS を接続する。

Last updated at Posted at 2021-01-01

GNU screen とはどういうものか、やってみたかったので、Android OS (Amazon Fire 7) に Android OS (Amazon Fire 8) を接続してみることにした。

よくわかっていなかったので、GNU screen とは、SSH を内包していて、片方のリモートされる側に SSH デーモンを、もう片方のリモートする側に GNU Screen を用意するものと考えていたが、やってみると違い1、 SSH の設定自体が成功していないために、フォーカスを SSH 接続にして、SSH での接続をトライアンドエラーでやっていると、かなり愕然とするほど時間が経っていて、これは大変、大変だわと思いました。
なので、間違いのないように記録しておく。


ここで、 SSH てどうなってこうなってる?
の参考をいくつか。


ここでは、 Android A が Fire7 で Android B が Fire8 としておく。
Android A (Fire7) がリモートサーバで、Android B (Fire8) がクライアントサーバーということになる。

Termux が A また B 両方にインストールされているという前提で、本当のところ A と B のアンドロイドの機種は問わない。

SSH が正常につながらないのは、公開鍵をつかって認証し、パスワードなしで接続するべきところで、パスワードを要求されて認証失敗になり、アクセス拒否されるというような動作になったということで、このような状態であった。

IMG_20210101_225548_085.jpg

ここで整理しておくと、

  • A ( fire 7 )には openssh がインストールされていて、 sshd でデーモンが立ち上がっていて、ポートの 8022 番で待ち受けている。リモートサーバー

  • B ( fire 8 )クライアントサーバーには openssh がインストールされていて、 A と B がともに同じ LAN 内にいる。

  • B (クライアント)から アドレスとポート番号を指定して A (リモート)へ接続を試みるためには、 A の IP アドレスがわかっている必要がある。言い換えると、A を
    B からリモートするには、A のIP アドレスがわかっている必要がある。

  • SSH でパスワードなしで接続するためには、 A または B でパブリックキー(公開鍵)、プライベートキー(秘密鍵)、フィンガープリントを生成して、パブリックキーの方を、接続する相手に登録しておく必要がある。

ここが失敗している。なので、この部分にフォーカスしていくことになる。

SSH 接続自体よりも、この概念をよく見ていくということである。

パブリックキー(公開鍵)とプライベートキー(秘密鍵または Id と呼ばれる)がどのようにして照合するのかホントのところまではわからない。
なので、そこのところは最も重要だけれども、ここではセットアップに必要なことだけ記録する。

openSSH にはこのようなものが含まれている。

  • scp, Secure copy protocol
  • sftp, SSH File Transfer Protocol
  • ssh, Secure Shell
  • ssh-add and ssh-agent,
  • ssh-keygen, key generate
  • sshd, the SSH server daemon

鍵の生成( key generate )と、鍵の登録 ( Authorized )

リモートされる側(A)で、リモートする側(B)のパブリックキー(公開鍵)をあらかじめ登録する場合と、その逆がある。

その逆とは、リモートされる側(A)で生成したパブリックキー(公開鍵)をリモートする側(B)で登録することで、この方向はどちらかで、それぞれ別の作業の流れがあるので、本件は、リモートする側でキーを生成(パブリックキー(公開鍵)、プライベートキー、フィンガープリント)し、リモートされる側、つまり sshd が動いてる側で、リモートする側のパブリックキーを登録するという流れを説明する。

言い換えると、リモートする側 Android B ( fire 8 )で キーを生成し、そのうちのパブリックキーだけをコピーして、リモートされる側である Android A ( fire 7 )の .ssh/authorized_key へ書き込むことで、「キーを登録する == Authorized 」。

以上のことが整理されていれば、あとはそのやり方の一つの例という感じで、理解しやすいのではないかと思う。

cf.
Connectiong by SSH from Android Termux to Desktop and vice-versa.md
Copyright (c) 2019 Evandro Coan
https://gist.github.com/evandrocoan/f503188587587d7b1d1ba8746c9c6107

cf.
Termux wiki >> 'Remote Access' >> 'Using the SSH server'
https://wiki.termux.com/wiki/Remote_Access

では、どうやって・・・・

お献立

Termux の openssh を使って SSH 接続で認証に使うパブリックキー(公開鍵)をつくる。

Android A (リモートサーバー) のターミナル( Termux )に Android B (クライアントサーバー)のターミナル( Termux )から接続するのに、ユーザー名とパスワードで SSH 接続するのではなく、 openssh で鍵を作ってパブリックキー(公開鍵)の受け渡しで、パスワードは無しで SSH 接続するところまで。

レシピ

  • wi-fi とインターネット接続環境が必要。
  • ここでは2つのアンドロイドタブレット Android A ( fire 7 )と Android B ( fire 8 )だが、手ごろなものがあればなんでもいい。つまりは Termux に Termux を ssh をつかって接続する。そういった解説がなかったのでやってみたということなので、要件は Termux が使える Android OS のインターネット接続可能なもの 2 こ。
  • A と B が LAN へ接続されていること。
  • A 及び B が Firetoolbox で程よく自由になっていること( kindle FireOS の場合)。
  • termux ・・・ターミナルエミュレーター アプリ。
  • openssh ・・・ Termux のパッケージに登録されているプログラム。 Termux 内でパッケージをインストールする。今回の主役。同じく SSH 用のパッケージ dropbear とは別のもの。 dropbear は openssh に比べるとドキュメントが少ないので、まずは openssh を使う。ファイルサイズは dropbear のほうが遥かに小さい。またオーストラリアの可愛い動物のことを思い出せる。
  • nmap ・・・ Termux のパッケージに登録されているプログラム。 Termux 内でパッケージをインストールする。(なくてもいい)

インストール

termux は F-Droid でアプリとしてインストール。

Important: Do not mix installations of Termux and Addons between Google Play and F-Droid. They are presented at these portals for your convenience. There are compatibility issues when mixing installations from these Internet portals. This is because each download website uses a specific key for keysigning Termux and Addons.

https://wiki.termux.com/wiki/Termux:API

( Termux-API というTermux の機能拡張アプリがありますが、 google play store でインストールした Termux は同じ google play store でインストールした Termux-API でないと不具合があると注意書があります。F-Droid の Termux APK の場合は、F-Dorid で揃えて Termux-API APK を使ってください。なお、ここでは Termux-API は使用しません。)  

ターミナルエミュレーター( termux )で

pkg update && update

としてリポジトリ情報を更新してから、各プログラムのパッケージをインストールする。

pkg install openssh

※インストールすると自動的にいくつかのキーが生成されます。これはおそらく、 SSH ホストキーだと思う。未調査なので、そのキーには触れずに、後述するように鍵生成したものだけ使います。

pkg install nmap

アンインストール

pkg uninstall パッケージの名前
apt autoremove パッケージの名前

でインストールしたプログラムを削除(アンインストール)することができる。 autpremove だと削除したいパッケージの依存してる他で未使用なパッケージも削除してくれるようですが、削除したい範囲を設定ファイルまで含めるためには、 purge オプションをつけて remove する(ここでは使いません) 。

例えば nmap をアンインストールしたい場合は、このようになります。

apt autoremove nmap

今現在インストールされているものを全部リストアップするには、これ。

pkg list-all

お道具

ここで使うパーツとして、ターミナルで使うかもしれないコマンドを紹介しておきます。
全部使うわけではないですが、これらのコマンドを知ってれば、やりたいことをこれらコマンドの組み合わせて使えばできます。
後に一例として 6 ステップの手順を示しますが、材料が揃っていれば応用が利くので、先に此処に並べておきます。賢い人は、材料だけで料理できると思います。
組み合わせのパズルなので、手順通りやればできると思いますが、手順通りやる必要もないので、色々やって、途中でやめるのも賢いと思います。
あれ❓変だなということに気がついたら調べてみてください。
賢い必然性はありません。

bash コマンド
  • ls -a
  • cd
  • mv
  • mkdir
  • rm -i
  • cp
  • cat
  • chmod
  • exit

cf.
https://explainshell.com/

  • 現在の user 名をたずねるコマンド。私は誰だっけ?
whoami
  • wi-fi LAN でデバイスのローカルアドレスってどうなっているか等、教えてくれるコマンド。
ifconfig wlan0

デバイスに割りあてられている IP アドレスを確認するコマンド

ip addr list wlan0
  • TCP で動いているものを見るコマンド
netstat -tln
  • ssh のデーモンのプロセスを止めるコマンド。リモートされる側で始めた sshd を止めるのはこちら。
pkill sshd
  • TCP のポート番号 8022 番を使っているプロセスを kill するコマンド。 sudo 無しでプロセス番号不明でも使える。
    Termux の sshd はデフォルトで 8022 ポートを使う。つまり、デフォルトでポート番号8022を使っている場合に限って、 sshd を止めれる。
fuser -k -n tcp 8022
  • ssh 接続後の ssh 接続状態で ssh を離脱するコマンド。リモートする側でリモートされる側の sshd からログアウト。
~.
Termux コマンド

Termux のアクセスできるストレージを拡張します。
デフォルトだと、 Android OS の仕様でアプリに割り当てられた以外の領域に書き込みができないため、`~/strage/downloads/` に Termux のターミナルからファイルコピーなどの操作ができません。つまりパーミッションの変更ですね。アプリだとよくありますよね、写真をアップロードするアプリだとかで、「ストレージに色々アクセスしますけどいいですか?」みたいな質問がよくあると思います。
あれの設定と同じようなもので、それをターミナルでコマンドでやります。

termux-setup-storage 

これは、以降 ssh で鍵の生成をするので、その鍵のコピーをタブレットの「ダウンロード」フォルダにコピーしたり、そこからファイルを読み取ったりしたい場面で必要になってきます。

cf.
Termux wiki >> 'Termux-setup-storage'

openssh コマンド
  • 鍵を作るコマンド
ssh-keygen

実行するとパブリックキー(公開鍵)~/.ssh/id_dsa.pub ができます。(他にもうひとつプライベートキー(秘密鍵)と、フィンガープリントが生成されます。)

ssh-keygen -t 作成する鍵の暗号化形式を指定
              rsa(デフォルト)
              dsa
              ecdsa
              ed25519
           -b ビット数 作成する鍵のビット数を指定( RSA 形式の場合、デフォルトは 2048bit )
           -f 生成する keyfile を指定

例:

ssh-keygen -t rsa -b 2048 -f id_rsa

cf.
Termix wiki >> Remote_Access >> Using the SSH server
https://wiki.termux.com/wiki/Remote_Access

  • リモートされる側で SSH 接続を待ち受けるためにデーモンを起動するコマンド
sshd

これに対して sshd を止めるコマンドは pkill sshd です。


調理

1. Termux をインストールします。

操作対象:
Androido A / Androido B

2. openssh をインストールします。

操作対象:Android A / Android B

pkg install openssh

アンインストールしたければ、こちら。

pkg uninstall openssh
apt autoremove openssh

3. 鍵を生成します。

操作対象:Android B
接続してリモートする側のターミナルで各種鍵を生成します。鍵は公開鍵と秘密鍵の2種類で、両方ともに必要です。
生成のコマンド:

ssh-keygen

実行すると以下のようになります。

~ $ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/data/data/com.termux/files/home/.ssh/id_rsa):

Enter passphrase (empty for no passphrase):
Enter same passphrase again:

Your identification has been saved in /data/data/com.termux/files/home/.ssh/id_rsa

Your public key has been saved in /data/data/com.termux/files/home/.ssh/id_rsa.pub

The key fingerprint is:..................................

2つのキーができた。
id_rsa
id_rsa.pub

SSH 認証の全体のワークフローが漠然としていると、まぎらわしいですが、 id_rsaidentification と呼称されていますが、プライベートキー(秘密鍵)ですね。

パブリックキー(公開鍵)は、~/.ssh/id_rsa.pub です。
pub て書いていますしね。生成された場所は /com.termux/files/ホームディレクトリ下です。つまり Termux アプリの割り当てられた領域にあります。
~はホームディレクトリのことを示しています。

現在どのディレクトリにいても

cd ~

でホームディレクトリに移動できます。 ~ (にょろにょろ)。 cd は チェンジ ディレクトリ でしょうね。

cd ~

としてホームディレクトリに移動して、
以下のコマンドを使って、生成された公開鍵がファイルとして存在しているかを確認してみます。

~ $ ls -a .ssh
.  ..  authorized_keys  id_rsa  id_rsa.pub  known_hosts

在りましたか? .ssh はフォルダですが、先頭にドットが付いた名前のフォルダは隠しフォルダになっていますからコマンド ls には -a オプションをつけて実行します。
リスト -オール ということですね。
確認できたら次のステップです。

公開鍵id_rsa.pubを、リモートされる側である Android A にあるautorized_keysに登録するのです。

4. 公開鍵のコピーをとります。

操作対象:Android B
接続してリモートする側のターミナルでの作業です。

~/.ssh/id_rsa.pubをコピーしたいのですが、例えばメールでファイル添付するとして、メールで扱いやすい領域にコピーして移します。コピーなので~/.ssh/id_rsa.pubには残ったまま存在することは意識しておいてください。
ここでは、たとえばとして、ダウンロードフォルダにコピーします。
まず Termux がダウンロードフォルダに対してファイルを保存できるようにします。

termux-setup-storage

ダウンロードに公開鍵をコピーします。

cp ~/.ssh/id_rsa.pub ~/storage/downloads/

ダウンロードにコピーできたか確認できますか?

ls ~/storage/downloads/

できていれば、メールアプリで id_rsa.pub を添付してみましょう。
方法は必ずしもメールでなくてもいいです。このファイルを Android A にコピーできる方法をとってください。

例えば gmail やウェブサービスのメールの場合だと、メールサービスにログインしてメールを作成して、 id_rsa.pub を添付ファイルにします。
そして下書きのまま保存して、 Android A に移り、同じメールサービスに同じアカウントでログインし、保存されている下書きのメールから、 id_rsa.pub をダウンロードすると、 Android A のダウンロードフォルダにファイルがコピーされます。
Android A のターミナルで、ダウンロードフォルダは ~/storage/downloads/ です。

5. 公開鍵を登録します。「キーを登録する == Authorized 」

操作対象:Android A
リモートされる側のターミナルでの作業に切り替わります。
まず Termux がダウンロードフォルダに対してファイルを読み出しできるようにします。

termux-setup-storage

ステップ 4. の最後でメールなどで Android A でファイルをダウンロード可能の状態にしました。ダウンロードしてください。

Android B の id_rsa.pub のコピーが Android A にあるか確認します。

ls ~/storage/downloads/

ダウンロードフォルダに id_rsa.pub が見あたらなければ、4. に戻って確認してからここに戻ってきてください。
 
Android A の ~/.ssh/authorized_keys に Android B の公開鍵である id_rsa.pub を書き加えます。「キーを登録する == Authorized 」

cat ~/storage/downloads/id_rsa.pub >> ~/.ssh/authorized_keys

ここで使った >> の場合は書き加えになります。 > の場合は上書きになります。

ファイルとディレクトリのパーミッションを変更します。

chmod 600 ~/.ssh/authorized_keys
chmod 700 ~/.ssh 

ここまでで、Android B の公開鍵が Andoroid A に登録されたはずです。

確認したければ authorized_keys の中身を直接ファイルを開いて見るとわかるはずです。

たとえば、 vim エディターでファイルを開いて中身を見るとすると:

vim ~/.ssh/authorized_keys

一行で、こんな感じの長い文字列が入っていたら、多分大丈夫です。

ssh-dss AAAAB3NzaC1kc3MAAACBAMKP/UZzYAazzV2jNkOc/pDtsnwovbF/W3hRbYnmfJBmTG+UXybEX2seE9X0LqR7mblMzVYe5CBs24i5boMFvVdZ93WxgX6La4Wz+M1bk3MX1rQYyq3sgYTtvs+g+ey0U0S7ILfn3uXBQlshK7Wyj4XXnewpTQ+BviXUkXi7iedLAAAAFQC5AxBPR43SzcM/nhsKWYOe+V9XOwAAAIEApF12ZeRZnk7zrN30lzbD0vLL7Ql6CDGS2JcHHu0Sn/wW0EHO0ojO4uAN6IZWPOeY7LpMyfl/kH8xPZ/Z0gfhSYhWq5iXLAAx+drVzli+KSDGjNKXJskuCx7mPufgh9wWYsELmCXCmZ2ZHDCxgF1k8gJEtJ7pVfDqhvMdmsyg7w4AAACAQaJyIfH+Thz0KWxReU1h97KcGUc7zNytFRJe7Rq5y4FyvL+oUygeIj6hkK9LFeel1FvuGZrf0/mHvpkPV2TmuM9VkO62XYo05DGk9kzcyaWLXq8ysuYfpFql7IfilKI2qwk+3rjo3Xs4rt2Y7ImrGCg/9smwWhXf+LFfdy61SrI= u0_a256@localhost

以下をタイプすれば、保存せずに vim エディターをぬけれます。

:q

次に、確認ですが、 nmap を使います。

nmap のインストール方法は:

pkg install nmap

Localhost の様子を覗いてみます。とくに何もないのを確認して、使用前と使用後の変化を見るためですので、スキップしてもかまいません。

nmap localhost

はい、見ました。

次に、 sshd を開始します。これが「Termux で ssh サーバーをたちあげる。」ということになると思います。 SSH で接続可能なように待ち受ける状態にするということで、くどいかもしれないですが、今あなたがいるのは Android A のリモートされる側として設定しようとしているタブレットのターミナル( Termux )であることを確認してください。

sshd を開始します。

sshd

それでは、使用後をチェックして、使用前との差を見てください。

nmap localhost
$ sshd
$ nmap localhost
Starting Nmap 7.91 ( https://nmap.org ) at 2021-01-02 23:41 JST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.0084s latency).
Not shown: 999 closed ports
PORT     STATE SERVICE
8022/tcp open  oa-system

Nmap done: 1 IP address (1 host up) scanned in 1.32 seconds
$

sshd 使用前

$ nmap localhost
Starting Nmap 7.91 ( https://nmap.org ) at 2021-01-02 23:40 JST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.0080s latency).
All 1000 scanned ports on localhost (127.0.0.1) are closed

Nmap done: 1 IP address (1 host up) scanned in 1.50 seconds
$

TCP 8022 番のポートが使われていることがわかりました。

次は Android A の IP アドレスを調べましょう。

wi-fi につながるように設定してからコマンドをタイプして実行してください:

ip addr list wlan0

コマンドを実行したらこんな感じのが出てきましたか?

inet 192.168.0.3/24 brd 192.168.0.255 scope global wlan0

このリゾルトの場合 192.168.0.3 の部分が Android A の LAN 内でのローカル IP アドレスです。 192.168.0.3 の部分はあなたの場合では違うと思いますが、4 つの区切られた数字であれば、たぶんそれが IP アドレスです。TCP 4 の場合は。

次にユーザーアカウント名をチェックしてみましょう。
ターミナルの中でコマンドをタイプしてエンターを押します。

whoami

何かそっけなく短い答えが返ってきましたね。

私の場合は、u0_a57でした。これも、あなたの場合は違っていますが、そう違わないと思います。
Android A での設定は完了です。

6. SSH 接続

操作対象:Android B
リモートする側の Android B のターミナルでの作業に切り替えます。

まず、ユーザー名を確かめてみましょう。

whoami

u0_a228でした。(これも、あなたのユーザー名とは違っています。)

Android A の IP アドレスはステップ 5. のおしまいのところで調べがついています。
ポート番号は、8022 番でした。
Android B から ssh コマンドで Android A に接続します。
-pスイッチで接続するポート番号を指定します。ユーザー名は無しでいいと思います。

$ ssh 192.168.0.3 -p 8022 

しばらくかかって接続できましたか?

なんかあまり変わらないけど、画面が書き換わったような気がして、 Termux ... っていう見たことあるようなのが出てきていて、画面がスッキリしてるような気がしたら、おそらく SSH 接続成功です。

whoamiとコマンド入力してエンターキーを押してみてください。

SSH 接続からログアウトしたい場合は、
~.
とタイプしてください。チルダとピリオドです。

sshd を止めたい場合は Android A のターミナルで
pkill sshd
とコマンドをだせば、ストップします。 Android B でログインしていた場合は SSH 接続が切れます。

sshd が止まっているか確認したい場合は、
netstat -tln
とコマンドを出せば確認できます。

  1. GNU Screen youtube 動画

3
1
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
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?