1. はじめに
以前の記事では、Windowsの dns-sd -P コマンドに対するAndroidからの名前解決が安定しないという不具合に直面していました。サービス名にIPアドレスを埋め込む力業で不具合を解消させましたが、今回はユーザ名とポート番号も埋め込んで、~/.ssh/config を更新してSSH接続するスクリプトに仕立てたいと思います。
本記事では以下のOSで動作確認を行っています。
以前の記事はこちらです。
2. 運用のイメージ
今回はサービス名に以下の情報を埋め込んで運用する手順を説明します。.local 以外の部分は環境に合わせて自由に改変してください。
| 項目 | 設定値 |
|---|---|
| ホスト名 | untied-srv.local |
| サービス名 | Untied Server(ユーザ名@IPアドレス:ポート番号) |
~/.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環境での運用方法
サービス開始の一連のコマンドを以下のように改変します。
# サービス開始
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 を更新して接続します。
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環境での運用方法
サービス開始の一連のコマンドを以下のように改変します。
# サービス開始
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 を更新して接続します。
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環境での運用方法
サービス開始の一連のコマンドを以下のように改変します。
# サービス開始
$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を別途インストールしてください。
$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開発環境を構築する |