Chạy tập lệnh trong OS X 10.6 trên kết nối mạng. (như /etc/network/if-up.d/)


17

Có cách nào để chạy tập lệnh khi giao diện mạng xuất hiện trong Mac OS X không?

Tôi đã thử đặt một tập lệnh có tên ip-up vào / etc / ppp nhưng nó dường như không kích hoạt khi tôi ngắt kết nối và kết nối lại với mạng không dây.

Tôi không muốn phải chạy một công việc định kỳ để liên tục kiểm tra xem trạng thái mạng đã thay đổi hay chưa. Trong một số bản phân phối linux, bạn có thể thực hiện điều này bằng cách đặt tập lệnh vào /etc/network/if-up.d/. Có điều gì tương tự cho Mac OS X không?

Câu trả lời:


5

Bạn có thể dùng thử MarcoPolo hoặc một trong những tiện ích tương tự được liệt kê trên trang web của nó. Thay đổi vị trí có vẻ hứa hẹn nếu bạn là người tối giản.


1
Tôi muốn làm điều này mà không cần cài đặt các chương trình bổ sung. Tuy nhiên, liên kết Trình thay đổi vị trí rất hữu ích vì nó bao gồm cấu hình launchd để chạy chương trình khi thay đổi mạng.
Zxaos

1
Zxaos: Chắc chắn, đó là lý do tại sao tôi đưa nó vào. Về cơ bản, đây là một mẫu kịch bản launchd / bash cho bất cứ điều gì bạn muốn. Cứu bạn khỏi việc tự viết mã soạn sẵn.
Daniel Beck

nếu tôi có thể làm phiền bạn khi xem q này rất phù hợp ( superuser.com/questions/265861 ) Tôi sẽ đánh giá cao nó (cách bắt đầu và dừng vpn từ dòng lệnh trên OSX). Xin lỗi, tôi sẽ xóa bình luận này trong vài giờ bất kể thế nào. Cảm ơn trong mọi trường hợp!
Dan Rosenstark

1
@Yar Không phải là vấn đề, nhưng bây giờ đã quá nửa đêm ở trung tâm châu Âu, vì vậy vui lòng đợi nửa ngày trước khi trả lời tôi một lần nữa (và xin vui lòng làm như vậy nếu không có gì xảy ra trong lúc này, đó là một câu hỏi thú vị).
Daniel Beck

Cảm ơn @Daniel Beck. Như bạn có thể đã thấy, sử dụng Applescript là câu trả lời. Có lẽ nhiều thứ trên OSX, nhưng tôi thường quên nó.
Dan Rosenstark

19

Một tác nhân launchd đang xem /etc/resolv.confvà hai tệp .plist liên quan đến mạng /Library/Preferences/SystemConfiguration/dường như hoạt động với tôi (trong 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>

Trước đây tôi chỉ sử dụng /etc/resolv.conf, nhưng có những trường hợp không đủ.


Điều này rất hữu ích với tôi, nhưng có một lỗi (được tìm thấy bởi [câu trả lời này] [1]): <plist version="1.0">thẻ mở bị thiếu. [1] [ apple.stackexchange.com/a/181127/56862]
LiberalArtist

@patrix (và LiberalArtist): Cảm ơn đã sửa chữa. Tôi đã không nhận thấy, bởi vì nó hoạt động cho tôi trong 10.8.5. Tôi đoán các phiên bản sau nghiêm ngặt hơn.
mivk

@mivk Chính xác những gì được cho là thay đổi trong các SystemConfigurationtập tin này ? Nếu tôi cắm / rút cáp mạng, dường như không có gì thay đổi cả
IceFire

Điều này có vẻ gần, nhưng nếu tôi tắt wifi và bật lại, thì chương trình chỉ chạy khi mạng ngắt kết nối, không phải khi nó kết nối lại. Tôi thấy rằng /etc/resolv.conftập tin bị xóa và được cài đặt lại khi trạng thái wifi của tôi thay đổi, vì vậy tôi không chắc tại sao nó chỉ chạy khi ngắt kết nối.
Matt Huggins

5

Bạn nên cân nhắc sử dụng crankd , chính xác cho phép bạn chạy các kịch bản để đáp ứng với nhiều sự kiện hệ thống như thay đổi mạng, hoạt động hệ thống tệp, khởi chạy ứng dụng, v.v.

Vì tôi không thể tìm thấy bất kỳ tài liệu hợp lý nào, tôi cũng đã viết một bài đăng blog nhỏ về việc bắt đầu sử dụng crankd .


Blog của bạn được bảo vệ khỏi việc đọc ẩn danh. Vui lòng xem xét sao chép nội dung ở đây.
nfirvine

Xin lỗi vì điều đó. Blog của tôi đã được chuyển, vì vậy tôi vừa cập nhật url. Vui lòng chỉnh sửa câu trả lời nếu bạn cảm thấy rằng một số thông tin từ bài đăng của tôi có thể được chuyển sang câu trả lời này.
Juan A. Navarro

4

Điều này dường như hoạt động trong bash:

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

thay thế echo changebằng lệnh của bạn, hãy nhớ rằng nếu bạn cần trích dẫn bất cứ điều gì trong lệnh của mình, bạn sẽ cần sử dụng '\'':

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

3

ControlPlane: bối cảnh điện toán nhạy cảm

ControlPlane là một cổng trực tiếp của MarcoPolo và trên thực tế, phần lớn cấu hình từ MarcoPolo vẫn hoạt động với ControlPlane, tốt hơn hết! ControlPlane hỗ trợ máy Mac dựa trên Intel 32 và 64 bit chạy Snow Leopard trở lên.

nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây


2

Bắt đầu với launchd. Bạn có thể có chức năng tương tự bằng cách sử dụng nó.

EDIT : 9 năm sau, có thể không. Theo mục Wikipedia này :

Vào năm 2014, với OS X 10.10 và iOS 8, Apple đã chuyển mã cho launchd sang libxpc nguồn đóng


launchd có vẻ như là một bước đi đúng hướng, đặc biệt là nếu tôi có thể tìm ra cách các chương trình khác sử dụng nó để phát hiện các thay đổi mạng.
Zxaos

@Zxaos, launchd có vẻ như là một bước đi đúng hướng, nhưng không có cách nào đáng tin cậy để làm cho nó phát hiện các thay đổi mạng. Xem câu trả lời của tôi cho một giải pháp bằng cách sử dụng crankd thay thế.
Juan A. Navarro

URL dẫn đến một trang 404.
Slaven Rezic

@ Slaven-Rezic Cập nhật câu trả lời và xóa liên kết cũ.
CaseyIT
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.