0
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?

【サーバ構築メモ】mDNSの名前解決を手動で行う方法

0
Last updated at Posted at 2026-02-23

1. はじめに

 以前の記事では、Windowsの dns-sd -P コマンドに対するAndroidからの名前解決が安定しないという不具合に直面していました。サービス名にIPアドレスを埋め込む力業で不具合を解消させましたが、今回はユーザ名とポート番号も埋め込んで、~/.ssh/config を更新してSSH接続するスクリプトに仕立てたいと思います。

本記事では以下のOSで動作確認を行っています。

以前の記事はこちらです。

2. 運用のイメージ

 今回はサービス名に以下の情報を埋め込んで運用する手順を説明します。.local 以外の部分は環境に合わせて自由に改変してください。

項目 設定値
ホスト名 untied-srv.local
サービス名 Untied Server(ユーザ名@IPアドレス:ポート番号)

 ~/.ssh/config には以下を仕込んでおきましょう。

Linux Mint xed ~/.ssh/config
Termux SSH nano ~/.ssh/config
Windows PC notepad "$HOME/.ssh/config"
Host untied-ssh
  HostName example.com
  User user
  Port 9999
  IdentityFile ~/.ssh/id_ed25519

3. 手動での名前解決の運用方法

3.1 Linux環境での運用方法

 サービス開始の一連のコマンドを以下のように改変します。

Linux Mint
# サービス開始
MDNS_HOST=untied-srv.local
MDNS_SRV="Untied Server"
MDNS_IP="$(ifconfig | grep -o '192\.168\.[0-9.]*' | head -n 1)"
MDNS_USER="$(whoami)"
MDNS_PROTO=_ssh._tcp
MDNS_PORT=22
nohup avahi-publish \
  -aR "$MDNS_HOST" "$MDNS_IP" > /dev/null 2>&1 &
nohup avahi-publish \
  -s "$MDNS_SRV($MDNS_USER@$MDNS_IP:$MDNS_PORT)" \
    "$MDNS_PROTO" "$MDNS_PORT" --host="$MDNS_HOST" > /dev/null 2>&1 &

# サービス停止
pkill -f "$MDNS_HOST"

 以下のスクリプトで ~/.ssh/config を更新して接続します。

Linux Mint
SSH_HOST=untied-ssh
SSH_SRV="Untied Server"
SSH_INFO="$(timeout 5s \
  avahi-browse -t _ssh._tcp 2>&1 | grep -om 1 "$SSH_SRV"'(.*@.*:.*)')"
if [ -n "$SSH_INFO" ]; then
  sed -i '/^Host '"$SSH_HOST"'$/,/ IdentityFile / {
    / HostName /s/ [^ ]*$/ '"$(grep -oP '(?<=@).*(?=:)' <<< "$SSH_INFO")"'/
    / User /s/ [^ ]*$/ "'"$(grep -oP '(?<=\().*(?=@)' <<< "$SSH_INFO")"'"/
    / Port /s/ [^ ]*$/ '"$(grep -oP '(?<=:).*(?=\))' <<< "$SSH_INFO")"'/
  }' ~/.ssh/config
  ssh "$SSH_HOST"
fi

3.2 Termux環境での運用方法

 サービス開始の一連のコマンドを以下のように改変します。

Termux SSH
# サービス開始
MDNS_HOST=untied-srv.local
MDNS_SRV="Untied Server"
MDNS_IP="$(ifconfig | grep -o '192\.168\.[0-9.]*' | head -n 1)"
MDNS_USER="$(whoami | tr -d '_')"
MDNS_PROTO=_ssh._tcp
MDNS_PORT=8022
ssh agency-ssh "
  nohup avahi-publish \\
    -aR '$MDNS_HOST' '$MDNS_IP' > /dev/null 2>&1 &
  nohup avahi-publish \\
    -s '$MDNS_SRV($MDNS_USER@$MDNS_IP:$MDNS_PORT)' \\
      '$MDNS_PROTO' '$MDNS_PORT' --host='$MDNS_HOST' > /dev/null 2>&1 &"

# サービス停止
ssh agency-ssh "pkill -f '$MDNS_HOST'"

 以下のスクリプトで ~/.ssh/config を更新して接続します。

Termux SSH
SSH_HOST=untied-ssh
SSH_SRV="Untied Server"
SSH_INFO="$(timeout 5s \
  mdns-scan 2>&1 | grep -om 1 "$SSH_SRV"'(.*@.*:.*)')"
if [ -n "$SSH_INFO" ]; then
  sed -i '/^Host '"$SSH_HOST"'$/,/ IdentityFile / {
    / HostName /s/ [^ ]*$/ '"$(grep -oP '(?<=@).*(?=:)' <<< "$SSH_INFO")"'/
    / User /s/ [^ ]*$/ "'"$(grep -oP '(?<=\().*(?=@)' <<< "$SSH_INFO")"'"/
    / Port /s/ [^ ]*$/ '"$(grep -oP '(?<=:).*(?=\))' <<< "$SSH_INFO")"'/
  }' ~/.ssh/config
  ssh "$SSH_HOST"
fi

3.3 Windows環境での運用方法

 サービス開始の一連のコマンドを以下のように改変します。

Windows PC
# サービス開始
$mdnsHost = "untied-srv.local"
$mdnsSrv = "Untied Server"
$mdnsIP = (Get-NetIPAddress -IPAddress "192.168.*")[0].IPAddress
$mdnsUser = $env:USERNAME
$mdnsProto = "_ssh._tcp"
$mdnsPort = "22"
$mdnsArgs = @("-P", "`"$mdnsSrv($mdnsUser@$mdnsIP`:$mdnsPort)`"",
  $mdnsProto, ".", $mdnsPort, $mdnsHost, $mdnsIP)
$mdnsProc = Start-Process dns-sd -ArgumentList $mdnsArgs -PassThru

# サービス停止
Stop-Process -Id $mdnsProc.Id

 以下のスクリプトで ~/.ssh/config を更新して接続します。Git Bashを使用してBashスクリプトを実行しますので、Gitを別途インストールしてください。

Windows PC
$tempPath = "temp_script.sh"
$tempScript = @'
  export LANG=en_US.UTF-8
  SSH_HOST=untied-ssh
  SSH_SRV="Untied Server"
  SSH_INFO="$(timeout 5s \
    dns-sd -B _ssh._tcp . 2>&1 | grep -om 1 "$SSH_SRV"'(.*@.*:.*)')"
  if [ -n "$SSH_INFO" ]; then
    sed -i '/^Host '"$SSH_HOST"'$/,/ IdentityFile / {
      / HostName /s/ [^ ]*$/ '"$(grep -oP '(?<=@).*(?=:)' <<< "$SSH_INFO")"'/
      / User /s/ [^ ]*$/ "'"$(grep -oP '(?<=\().*(?=@)' <<< "$SSH_INFO")"'"/
      / Port /s/ [^ ]*$/ '"$(grep -oP '(?<=:).*(?=\))' <<< "$SSH_INFO")"'/
    }' ~/.ssh/config
    ssh "$SSH_HOST"
  fi
'@
$tempScript | Out-File -FilePath $tempPath -Encoding "ascii"
& "C:\Program Files\Git\bin\bash.exe" $tempPath
Remove-Item -Path $tempPath -Force

4. おわりに

 気分は完全敗北です。当初はWindows環境のスクリプトをPowershellの機能で書く予定でしたが、完全な別物となってメンテ性も損ねてしまうので、ファイルに吐き出したBashスクリプトをGit Bashに読ませるという苦し紛れの対応となっています。

◀️ 前の記事 次の記事 ▶️
【サーバ構築メモ】ローカルサーバでのmDNS活用方法 【開発環境構築メモ】DockerでGo開発環境を構築する
0
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
0
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?