1. はじめに
前回の記事で、Windows PCに additional-name.local を名乗らせようと dns-sd コマンドを使用した訳ですが、Androidからの名前解決がまるで安定しませんでした。Linux PCの avahi-publish が安定しているだけに、何というか妙にくやしい。
そこで今回は、Pythonの python-zeroconf ライブラリを試して…WindowsとAndroidの相性が悪すぎてどうにもならんかった。なので、力技で捻じ伏せることにします。
本記事では以下のOSで動作確認を行っています。
前回の記事はこちらです。
2. 具体的な方策
スマホからは mdns-scan コマンドでサービス名までは見えるので、サービス名にIPアドレスを埋め込むという原始的な手段で強引に解決します。サービス名からIPアドレスを抽出して ~/.ssh/config を更新した後に、SSH接続を行います。
3. IPアドレスの埋め込み
まずは、サービス名にIPアドレスを埋め込むための細工をします。QEMU起動スクリプトの該当箇所を以下で置き換えてください。
#!/bin/bash
AVAHI_IP="$(ifconfig | grep -o '192\.168\.[0-9.]*' | head -n 1)"
AVAHI_SRV="Wraith Server($AVAHI_IP)"
avahi-publish -aR wraith-srv.local "$AVAHI_IP" &
avahi-publish -s "$AVAHI_SRV" _http._tcp 8080 --host=wraith-srv.local &
# ここでQEMUを起動
pkill avahi-publish
$avahiIP = (Get-NetIPAddress -IPAddress "192.168.*")[0].IPAddress
$avahiSrv = '"Wraith Server(' + $avahiIP + ')"'
$avahiArgs = @('-P', $avahiSrv, '_http._tcp', '.', '8080',
'wraith-srv.local', $avahiIP)
$avahiProc = Start-Process dns-sd -ArgumentList $avahiArgs -PassThru
# ここでQEMUを起動
Stop-Process -Id $avahiProc.Id
4. Termuxのスクリプト
.bashrc に、mdns-scan コマンドでサービス名を取得して ~/.ssh/config を更新するコードを仕込みます。sshd コマンドの直後に以下を挿入してください。
pkg install mdns-scan
SSH_IP="$(timeout 5s mdns-scan 2>&1 | grep -m 1 'Wraith Server' |
tee /dev/tty | grep -o '192\.168\.[0-9.]*')"
if [ -n "$SSH_IP" ]; then
sed -i '/ HostName /s/ [^ ]*$/ '"$SSH_IP"'/' ~/.ssh/config
fi
5. おわりに
mDNSに対応していないAndroid 10スマホでも、mDNSの名前解決が擬似的にできるようになりました。これは思わぬ副産物ですw
| ◀️ 前の記事 | 次の記事 ▶️ |
|---|---|
| どこでも動くDebianサーバを手に入れよう!DHCPでも設定変更なしでスマホと連携する。 | PCツナイデント(パラレル版)はES-DE + RetroArchでも問題なく使用できます。 |