ローカルNASをマウントしたり、特定のサービスを(無効化/)アクティブ化するなど、(Linuxラップトップを使用して)どのネットワークに接続しているかを確認するために必要なスクリプトがいくつかあります。追加の複雑さは、他のSSIDまたはネットワークインターフェイス(有線/ WiFi)を介して接続しているときに、一部の(ほとんどの)ネットワークがまだ正しく認識されなければならないことです。また、特定のホストを使用できるとは信じられません。
現在のスクリプトは、IPv4 ゲートウェイをデフォルトゲートウェイとして使用し、IPv6 ゲートウェイをフォールバックとして使用してルーティングテーブルを解析し、デフォルトゲートウェイと関連 MAC アドレスを検索します。
#!/bin/sh
ROUTER=$(ip -4 route list | grep "default" | head -n 1 | cut -f 3 -d " ")
# echo "ROUTER=${ROUTER}" >&2
if [ "${ROUTER}" != "" ]; then
MAC=$(ip neigh | grep -E "^${ROUTER} " | cut -f 5 -d " ")
# echo "MAC=${MAC}" >&2
if [ ${MAC} != "" ]; then
echo "${MAC}"
exit 0
fi
fi
ROUTER6=$(ip neigh | grep -R "^fe80.* router " | head -n 1 | cut -f 1 -d " ")
# echo "ROUTER6=${ROUTER6}" >&2
if [ "${ROUTER6}" != "" ]; then
MAC6=$(ip neigh | grep -E "^fe80.* router " | head -n 1 | cut -f 5 -d " ")
# echo "MAC6=${MAC6}" >&2
if [ "${MAC6}" != "" ]; then
echo "${MAC6}"
exit 0
fi
fi
exit 1
これまではうまく機能しますが、すべてのフィールド解析とゲートウェイMACへの依存性により、わずかに脆弱になる可能性があります。
接続方法に関係なく、ネットワークを識別するための信頼できるネットワークIDを取得するより良い方法はありますか?
答え1
信頼できるネットワーク識別子はなく、IPアドレスはネットワークIDで始まる必要がありますが、プライベートネットワークではこれは一意ではなく、非常にランダムなネットワーク10.243.168.0/24を使用しない限り、自分のネットワークを検出できます。 ipv6ではプライベートネットワークは必要ないため、グローバルに一意のプレフィックスがある場合は使用できますが、プレフィックスはローカルfe80によって異なります。 WIFIと同様の認証に802.Xを使用できるため、既知のネットワークに認証し、そこからスクリプトをトリガーできます。
デフォルトのルートのみをリストして少し最適化できるため、grepを実行する必要はありませんが、複数のデフォルトゲートウェイIPを持つことができます。 -4 Route list default
サービス検索や他の形式のビーカーニングには mdns を使用できます。ビーコンとして機能するHost Identity Protocolがありますが、単一のホストに依存したくないので、個人的にはarpテーブル(arp -anなどの出力)を定期的に収集するか、net / arpを直接収集します。 /proc/で特定のネットワーク可能性への接続数を計算します。
たぶん、既存のスクリプトに固執する方が良いかもしれません。