আরেকটি সমাধান হ'ল একটি লঞ্চডেমোন ব্যবহার করে নির্দিষ্ট ডিরেক্টরি নিরীক্ষণ করা এবং বাহ্যিক স্ক্রিপ্ট চালু করা যখনই ডিরেক্টরিতে পরিবর্তন হয়। ম্যাক বিকাশকারী লাইব্রেরি এ জাতীয় স্ক্রিপ্টের একটি রূপরেখা দেয় (তাদের উদাহরণ পর্যবেক্ষণ করে /etc/hostconfig
এবং syslog -s -l notice "somebody touched /etc/hostconfig"
যখনই ফাইলটির পরিবর্তনের সময় পরিবর্তন হয় তখনই এটি চালিত হয় ))
আমাদের উদ্দেশ্যে, আমরা নোট করি যে যতবার আপনি আপনার ভিপিএন-এ লগইন করেন, ডিরেক্টরিটি /Library/Preferences/SystemConfiguration
পরিবর্তিত হয়। সুতরাং আপনি যদি নীচের প্লাস্ট ফাইলটি ভিতরে সংরক্ষণ করেন তবে /Library/LaunchDaemons/vpn.connectscript.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>vpn.connectscript</string>
<key>ProgramArguments</key>
<array>
<string>/bin/bash</string>
<string>/opt/local/bin/vpn_some_script.sh</string>
</array>
<key>WatchPaths</key>
<array>
<string>/Library/Preferences/SystemConfiguration</string>
</array>
</dict>
</plist>
মনে রাখবেন যে এই লঞ্চডেমনকে কেবলমাত্র আপনার ভিপিএন সংযোগের চেয়ে বেশি বলা হবে (যেমন, প্রতিবার আপনি যখন ওয়াইফাইতে সংযুক্ত হন)। সুতরাং আপনার স্ক্রিপ্টটিতে /opt/local/bin/vpn_some_script.sh
একটি চেক থাকা উচিত যে টানেলটি আসলে সংযুক্ত রয়েছে এবং স্ক্রিপ্টটি যদি একাধিকবার এটি একাধিকবার চালিত হয় তবে সমস্যাগুলি তৈরি করা উচিত নয়। (সুতরাং আপনি যদি শেয়ারগুলি মাউন্ট করেন তবে আপনি এটি পরীক্ষা করতে পারেন যে তারা ইতিমধ্যে মাউন্ট করা হয়নি)।
উদাহরণস্বরূপ, আমার স্ক্রিপ্টটি /opt/local/bin/vpn_some_script.sh
সহজভাবে:
#!/bin/bash
# This only changes the routes table if utun0 exists.
# -n checks that `ifconfig utun0` returns something other than "" on STDOUT
# The 2> /dev/null redirects STDERR to null, to silence errors
if [[ -n `ifconfig utun0 2> /dev/null` ]] ; then
route -n add -net 10.0.0.0/8 -interface utun0
# Find the old default gateway
GATEWAY=`route -n get default -ifscope en0 | grep gateway | awk '{ print $2 }'`
# make everything (except blocks described above) go through old default gateway rather than VPN
route -n change default $GATEWAY
fi
যা কেবলমাত্র VPN টানেলের সাথে সংযুক্ত থাকলে আমি সুরঙ্গটি দিয়ে 10.0.0.0/8 এ রুট যুক্ত করি (এবং 192.168.1.1 রাউটারে যাওয়ার জন্য ডিফল্টটি পরিবর্তন করি)।
আপনি যখন প্লিস্ট ফাইলটি সংরক্ষণ করবেন তখন এটি স্বয়ংক্রিয়ভাবে পরবর্তী পুনরায় বুট হবে। তবে আপনি নিজে এটি দিয়ে লোড করতে পারেন:
sudo launchctl load -w /Library/LaunchDaemons/vpn.connectscript.plist
দ্রষ্টব্য, যদি আপনার বাশ স্ক্রিপ্টের রুট অনুমতি প্রয়োজন হয় (উদাহরণস্বরূপ, আমার স্ক্রিপ্ট যা রাউটিং টেবিল পরিবর্তন করে), আপনাকে এটি /Library/LaunchDaemons/
(বা /System/Library/LaunchDaemons
) এ সঞ্চয় করতে হবে । যদি আপনার স্ক্রিপ্টটি সাধারণ ব্যবহারকারীর হিসাবে চালানো উচিত তবে আপনার এটি সংরক্ষণ করা উচিত ~/Library/LaunchAgents/
।
যদি আপনার স্ক্রিপ্টটি রুট হিসাবে চলে এবং বিশেষাধিকারের ক্রমবর্ধমান আক্রমণগুলি ভোগ করতে না চান, তবে যে বাশ স্ক্রিপ্টটি ডাকা হচ্ছে তা সেই ডিরেক্টরিতে থাকা উচিত /opt/local/bin/
কেবল রুট দ্বারা সংশোধন করা যেতে পারে। আপনি যদি সংরক্ষণ করে থাকেন যে ~/bin
কোনও নিয়মিত ব্যবহারকারী স্ক্রিপ্টটি পরিবর্তন করতে পারে (বা ফাইল / ডিরেক্টরিটির নাম পরিবর্তন করে এবং তারা লিখেছেন এমন একটি ফাইল এটি প্রতিস্থাপন করতে পারে) এবং আপনার সিস্টেমে সম্পূর্ণ অ্যাক্সেস অর্জন করতে পারে।