จะเปลี่ยนการตั้งค่า DNS อัตโนมัติในขณะที่เชื่อมต่อกับ WiFi อื่นได้อย่างไร

Aug 17 2020

ฉันมีการตั้งค่า DNS ที่แตกต่างกันโดยสิ้นเชิงเมื่อฉันอยู่ที่ทำงานและเมื่อฉันอยู่ที่บ้าน ฉันสงสัยว่าฉันสามารถเปลี่ยนการตั้งค่า DNS ของ MacBook Pro โดยอัตโนมัติเมื่อฉันเชื่อมต่อกับ WiFi อื่นได้หรือไม่

ฉันทำการค้นหาหลายครั้งฉันสร้างตำแหน่งที่กำหนดเองชื่อบ้านในการตั้งค่าเครือข่าย และฉันตั้งค่า Home DNS ภายใต้โปรไฟล์นี้ และโปรไฟล์เริ่มต้นที่เรียกว่าอัตโนมัติฉันปล่อยให้คอมพิวเตอร์รับการตั้งค่า DNS โดยอัตโนมัติ

หลังจากนั้นฉันสามารถเปลี่ยนการตั้งค่า DNS ของฉันผ่าน:

networksetup -switchtolocation Home

มันใกล้เคียงกับความต้องการของฉันมาก แต่ฉันหวังว่าฉันจะพบวิธีที่ชาญฉลาดกว่านี้หากฉันหาวิธีได้หากฉันเชื่อมต่อกับ WiFi ที่เรียกว่า "Home" แล้วดำเนินการคำสั่งโดยอัตโนมัติมันจะดีมาก

ปรับปรุง 20200819

ฉันพบเครื่องมืออัตโนมัติที่เรียกว่าHammerspoonดังนั้นฉันจึงสามารถกำหนดช็อตคัทเพื่อสลับตำแหน่งต่างๆโดยใช้คำสั่ง

แม้ว่าฉันจะไม่พบทางตรง แต่แฮมเมอร์สปูนนั้นยอดเยี่ยมและทรงพลัง ฉันพยายามดูการเปลี่ยนแปลง Wifi โดยใช้ Hammerspoon แต่ก็ยังมีปัญหาเล็กน้อยฉันจึงเปิดปัญหาที่นี่

คำตอบ

4 TJLuoma Aug 17 2020 at 23:44

Keyboard Maestroสามารถทำได้อย่างง่ายดาย:

ตั้ง SSID และตำแหน่งที่คุณต้องการและควรทำตามที่คุณต้องการ

3 user3439894 Aug 19 2020 at 01:06

คุณไม่จำเป็นต้องใช้แอปพลิเคชันของบุคคลที่สามเพื่อบรรลุเป้าหมายของคุณ

เมื่อWi-Fiเชื่อมต่อกับเครือข่ายไฟล์ต่อไปนี้จะถูกแก้ไข:

/Library/Preferences/SystemConfiguration/com.apple.airport.preferences.plist

คุณสามารถใช้User Launch Agentพร้อมกับคีย์WatchPaths เพื่อทราบเมื่อไฟล์เป้าหมายถูกแก้ไขและเรียกใช้สคริปต์ของคุณตามนั้น

ต่อไปนี้เป็นตัวอย่างของวิธีการที่จะบรรลุเป้าหมายและใช้SkyNetเป็นSSIDของWi-Fi เครือข่าย

เมื่อใช้networksetupเพื่อรับเครือข่ายWi-Fi ปัจจุบันโค้ดเชลล์สคริปต์ตัวอย่างต่อไปนี้จะถูกใช้และบันทึกเป็นเช่น: /usr/local/bin/detect-wifi-change

#!/bin/bash

[[ $(networksetup -getairportnetwork en0) == "Current Wi-Fi Network: SkyNet" ]] && say "connected to skynet"

ในโค้ดตัวอย่างด้านบนเมื่อเชื่อมต่อ Wi-FiกับSkyNetมันจะบอกว่า "เชื่อมต่อกับ skynet" และคุณจะแทนที่SkyNetใน$(...)ส่วนของคำสั่งด้วยSSIDเป้าหมายของคุณและแทนที่say "connected to skynet" คำสั่งด้วยnetworksetup -switchtolocation Home คำสั่งดังที่แสดงใน คำถามของคุณ.

สำหรับLaunch Agentในไลบรารีของโฟลเดอร์Home คุณจะใช้ตัวอย่างต่อไปนี้บันทึกเป็นเช่น:~/Library/LaunchAgents/com.my.detect.wifi.change.plist

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC -//Apple Computer//DTD PLIST 1.0//EN http://www.apple.com/DTDs/PropertyList-1.0.dtd >
<plist version="1.0">
<dict>
    <key>Label</key>
        <string>com.my.detect.wifi.change</string>
    <key>ProgramArguments</key>
    <array>
        <string>/bin/sh</string>
        <string>/usr/local/bin/detect-wifi-change</string>
    </array>
    <key>WatchPaths</key>
    <array>
        <string>/Library/Preferences/SystemConfiguration/com.apple.airport.preferences.plist</string>
    </array>
</dict>
</plist>

หลังจากบันทึกplist ไฟล์ใช้launchctlเพื่อloadมันเช่น:

launchctl load ~/Library/LaunchAgents/com.my.detect.wifi.change.plist

หมายเหตุ: คุณสามารถใช้unload คำกริยาที่มีlaunchctlขนเป้าหมายplist ไฟล์

ตอนนี้เมื่อใดก็ตามที่Wi-Fiเชื่อมต่อกับที่แตกต่างกันSSIDเช่น/usr/local/bin/detect-wifi-changeจะถูกดำเนินการและหากการเชื่อมต่อไปยังเป้าหมายSSID คำสั่งหลังจากที่&&ถูกดำเนินการ


หมายเหตุ: ตัวอย่างข้างต้นได้รับการทดสอบและทำงานภายใต้MacOS High Sierraใช้ที่เกิดขึ้นจริงของฉันSSIDในสถานที่ของSkyNetในสถานที่ทั้งในสคริปต์


 

เอกสารที่เกี่ยวข้อง:

ในTerminalให้แทนที่commandอย่างใดอย่างหนึ่งต่อไปนี้:

  • launchd
  • launchd.plist
  • launchctl

คุณสามารถอ่านหน้าคู่มือสำหรับcommand ในTerminal ได้โดยพิมพ์commandจากนั้นคลิกขวาที่หน้านั้นแล้วเลือก: Open man Page

ดูสิ่งนี้ด้วย: