เรียกใช้สคริปต์ใน OS X 10.6 บนการเชื่อมต่อเครือข่าย (เช่น /etc/network/if-up.d/)


17

มีวิธีใดบ้างในการรันสคริปต์เมื่อมีส่วนต่อประสานเครือข่ายเกิดขึ้นใน Mac OS X

ฉันพยายามวางสคริปต์ชื่อ ip-up ใน / etc / ppp แต่ดูเหมือนว่าจะไม่ทำงานเมื่อฉันตัดการเชื่อมต่อและเชื่อมต่อกับเครือข่ายไร้สายอีกครั้ง

ฉันไม่ต้องการทำงาน cron เพื่อตรวจสอบสถานะเครือข่ายที่มีการเปลี่ยนแปลงอยู่ตลอดเวลา ในลินุกซ์ distros บางตัวคุณสามารถทำได้โดยใส่สคริปต์ใน /etc/network/if-up.d/ มีอะไรที่คล้ายกันสำหรับ Mac OS X หรือไม่?

คำตอบ:


5

คุณสามารถลองใช้MarcoPoloหรือหนึ่งในสาธารณูปโภคที่คล้ายคลึงกันที่ระบุไว้ในเว็บไซต์ เครื่องเปลี่ยนตำแหน่งดูดีหากคุณเป็นมินิมัลลิสต์


1
ฉันต้องการทำสิ่งนี้โดยไม่ต้องติดตั้งโปรแกรมเพิ่มเติม อย่างไรก็ตามลิงก์ Location Changer มีประโยชน์มากเนื่องจากมีการกำหนดค่า launchd สำหรับการเรียกใช้โปรแกรมในการเปลี่ยนแปลงเครือข่าย
Zxaos

1
Zxaos: แน่นอนนั่นคือเหตุผลที่ฉันรวมมันเข้าด้วยกัน มันเป็นเทมเพลตสคริปต์ launchd / bash สำหรับสิ่งที่คุณต้องการ ช่วยให้คุณไม่ต้องเขียนโค้ดสำเร็จรูปด้วยตัวคุณเอง
Daniel Beck

ถ้าฉันสามารถรบกวนคุณให้ดู q ที่เกี่ยวข้องมากนี้ ( superuser.com/questions/265861 ) ฉันขอขอบคุณมาก (วิธีเริ่มและหยุด vpn จากบรรทัดคำสั่งบน OSX) ขอโทษด้วยการชักชวนฉันจะลบความคิดเห็นนี้ในไม่กี่ชั่วโมงโดยไม่คำนึงถึง ขอบคุณในกรณีใด ๆ !
Dan Rosenstark

1
@ ใช่ไม่ใช่ปัญหา แต่เป็นเที่ยงคืนที่ผ่านมาในยุโรปตอนกลางดังนั้นโปรดรอประมาณครึ่งวันก่อนที่จะส่งเสียงฉันอีกครั้ง (และโปรดทำเช่นนั้นหากไม่มีอะไรเกิดขึ้นในระหว่างนี้มันเป็นคำถามที่น่าสนใจ)
Daniel Beck

ขอบคุณ @Daniel Beck อย่างที่คุณอาจเห็นแล้วการใช้ Applescript คือคำตอบ อาจเป็นเพราะหลาย ๆ อย่างใน OSX แต่ฉันมักจะลืมมันไป
Dan Rosenstark

19

เอเจนต์เรียกดู launchd /etc/resolv.confและไฟล์. plist ที่เกี่ยวข้องกับเครือข่ายสองไฟล์/Library/Preferences/SystemConfiguration/ดูเหมือนว่าจะทำงานให้ฉันได้ (ใน Mac OS X 10.8.4):

<?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>ifup.ddns</string>

  <key>LowPriorityIO</key>
  <true/>

  <key>ProgramArguments</key>
  <array>
    <string>/Users/Shared/bin/ddns-update.sh</string>
  </array>

  <key>WatchPaths</key>
  <array>
    <string>/etc/resolv.conf</string>
    <string>/Library/Preferences/SystemConfiguration/NetworkInterfaces.plist</string>
    <string>/Library/Preferences/SystemConfiguration/com.apple.airport.preferences.plist</string>
  </array>

  <key>RunAtLoad</key>
  <true/>
</dict>
</plist>

ก่อนหน้านี้ฉันเพิ่งใช้ /etc/resolv.conf แต่มีหลายกรณีที่ไม่เพียงพอ


สิ่งนี้มีประโยชน์กับฉันมาก แต่มีข้อผิดพลาด (พบโดย [คำตอบนี้] [1]): <plist version="1.0">แท็กเปิดหายไป [1] [ apple.stackexchange.com/a/181127/56862]
LiberalArtist

@patrix (และ LiberalArtist): ขอบคุณสำหรับการแก้ไข ฉันไม่ได้สังเกตเห็นเพราะมันใช้ได้กับฉันใน 10.8.5 ฉันเดาว่ารุ่นต่อ ๆ มาจะเข้มงวดกว่านี้
mivk

@mivk สิ่งที่ควรจะมีการเปลี่ยนแปลงในSystemConfigurationไฟล์เหล่านี้คืออะไร? หากฉันเสียบ / ถอดสายเคเบิลเครือข่ายดูเหมือนว่าจะไม่มีอะไรเปลี่ยนแปลงเลย
IceFire

ดูเหมือนว่าจะปิด แต่ถ้าฉันปิด wifi แล้วเปิดใหม่โปรแกรมก็จะทำงานก็ต่อเมื่อเครือข่ายตัดการเชื่อมต่อไม่ใช่เมื่อมันทำการเชื่อมต่อใหม่ ฉันเห็นว่า/etc/resolv.confไฟล์ถูกลบและอ่านใหม่เมื่อสถานะ wifi ของฉันเปลี่ยนแปลงดังนั้นฉันจึงไม่แน่ใจว่าทำไมจึงมีการยกเลิกการเชื่อมต่อเท่านั้น
Matt Huggins

5

คุณควรพิจารณาใช้crankdซึ่งช่วยให้คุณสามารถเรียกใช้สคริปต์เพื่อตอบสนองต่อเหตุการณ์ต่าง ๆ ของระบบเช่นการเปลี่ยนแปลงเครือข่ายกิจกรรมระบบไฟล์การเปิดตัวแอปพลิเคชันเป็นต้น

ขณะที่ผมไม่สามารถหาเอกสารที่เหมาะสมใด ๆ ผมยังเขียนบล็อกโพสต์เล็ก ๆ ในการเริ่มต้นใช้ crankd


บล็อกของคุณได้รับการปกป้องจากการอ่านที่ไม่ระบุชื่อ โปรดพิจารณาการทำซ้ำเนื้อหาที่นี่
nfirvine

ขอโทษสำหรับเรื่องนั้น. บล็อกของฉันถูกย้ายดังนั้นฉันเพิ่งอัปเดต URL อย่าลังเลที่จะแก้ไขคำตอบหากคุณรู้สึกว่าข้อมูลบางอย่างจากโพสต์ของฉันสามารถโยกย้ายไปยังคำตอบนี้ได้
Juan A. Navarro

4

ดูเหมือนว่าจะทำงานในทุบตี:

(echo -e "n.add State:/Network/Global/IPv4\nn.watch" & cat) | \
 scutil | \
 awk '/notification/ {system("echo change")}'

แทนที่echo changeด้วยคำสั่งของคุณโปรดจำไว้ว่าหากคุณต้องการพูดอะไรในคำสั่งของคุณคุณจะต้องใช้'\'':

(echo -e "n.add State:/Network/Global/IPv4\nn.watch" & cat) | \
 scutil | \
 awk '/notification/ {system("echo '\''&'\''")}'

3

ControlPlane:“ การประมวลผลที่ละเอียดอ่อนตามบริบท”

ControlPlane เป็นพอร์ตโดยตรงของ MarcoPolo และในความเป็นจริงการกำหนดค่าส่วนใหญ่จาก MarcoPolo ยังคงใช้งานได้กับ ControlPlane ดีกว่า! ControlPlane รองรับ Mac ที่ใช้ 32 และ 64 บิตของ Intel ที่ใช้ Snow Leopard และสูงกว่า

ป้อนคำอธิบายรูปภาพที่นี่ ป้อนคำอธิบายรูปภาพที่นี่ ป้อนคำอธิบายรูปภาพที่นี่


2

เริ่มด้วย launchd คุณอาจสามารถใช้ฟังก์ชันที่คล้ายกันนี้ได้

แก้ไข : 9 ปีต่อมาอาจจะไม่ ตามรายการ Wikipedia นี้ :

ในปี 2014 ด้วย OS X 10.10 และ iOS 8 แอปเปิ้ลย้ายรหัสสำหรับ launchd ไปยัง libxpc แหล่งปิด


ดูเหมือนว่าจะเป็นขั้นตอนในทิศทางที่ถูกต้องโดยเฉพาะอย่างยิ่งถ้าฉันสามารถหาวิธีที่โปรแกรมอื่นใช้ในการตรวจจับการเปลี่ยนแปลงเครือข่าย
Zxaos

@Zxaos, launchd ดูเหมือนเป็นขั้นตอนในทิศทางที่ถูกต้อง แต่ไม่มีวิธีที่เชื่อถือได้ในการตรวจจับการเปลี่ยนแปลงเครือข่าย ดูคำตอบของฉันสำหรับการแก้ปัญหาโดยใช้crankdแทน
Juan A. Navarro

URL นำไปสู่หน้า 404
Slaven Rezic

@ Slaven-Rezic อัปเดตคำตอบและลบลิงก์เก่า
CaseyIT
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.