Как вы можете автоматически запустить скрипт после подключения к VPN на OS X?
Я настроил VPN-соединение в OS X 10.7.3, но поскольку сеть, к которой я подключаюсь, использует корпоративный прокси-сервер, имеет настраиваемые серверы репозитория Maven и другие сетевые параметры (например, удаленные диски), я хочу запустите скрипт для входа / выхода из VPN для:
- изменить Maven
~/.m2/settings.xml
указать на их Maven репо - сопоставить несколько
smb://
акции, - псевдоним некоторых команд для использования своих серверов
Я не знаю, как этого добиться.
- Как выполнить скрипт или набор команд автоматически при входе в систему?
- Как выполнить сценарий или набор команд автоматически при выходе из системы?
3 ответа
Если у вас уже настроен VPN, вы можете подключиться к нему через командную строку. Как я объяснил в этом ответе, вы можете создать две функции оболочки для входа и выхода соответственно, добавив их в свой ~/.bash_profile
- см. Связанный ответ для vpn-disconnect
функция.
function vpn-connect {
/usr/bin/env osascript <<-EOF
tell application "System Events"
tell current location of network preferences
set VPN to service "UniVPN" -- your VPN name here
if exists VPN then connect VPN
end tell
end tell
EOF
# insert your commands here
}
Просто включите необходимые команды после EOF
маркер.
Если вы хотите сделать это с помощью графического интерфейса, откройте Automator.app и создайте новое приложение. Затем перетащите действия для запуска сценариев AppleScript и Shell из левой панели и вставьте команды, как показано ниже.
Затем вы можете просто вставить это псевдо-приложение в Dock, чтобы быстро запустить его.
Другое решение - использовать LaunchDaemon для мониторинга определенного каталога и запуска внешнего скрипта всякий раз, когда в этом каталоге есть изменения. Библиотека разработчика Mac дает схему такого скрипта (их примеры мониторов /etc/hostconfig
и работает syslog -s -l notice "somebody touched /etc/hostconfig"
всякий раз, когда изменяется время изменения этого файла.)
Для нашей цели отметим, что каждый раз, когда вы входите в свой VPN, каталог /Library/Preferences/SystemConfiguration
модифицируется. Так что если вы сохраните следующий файл plist внутри /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>
Обратите внимание, что этот LaunchDaemon будет вызываться не только для вашего VPN-подключения (например, каждый раз, когда вы подключаетесь к Wi-Fi). Итак, ваш сценарий /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
который только добавляет маршрут к 10.0.0.0/8 через туннель, если я подключен к VPN-туннелю (и изменяю значение по умолчанию для перехода к маршрутизатору 192.168.1.1).
Когда вы сохраните файл plist, он будет автоматически загружен при следующей перезагрузке. Однако вы также можете загрузить его вручную:
sudo launchctl load -w /Library/LaunchDaemons/vpn.connectscript.plist
Обратите внимание: если вашему bash-скрипту требуются права суперпользователя (например, мой скрипт, который изменяет таблицу маршрутизации), вы должны сохранить его в /Library/LaunchDaemons/
(или же /System/Library/LaunchDaemons
). Если ваш скрипт должен запускаться как обычный пользователь, вы должны сохранить его в ~/Library/LaunchAgents/
,
Если ваш сценарий запускается от имени пользователя root и не хочет подвергаться атакам повышения привилегий, вызываемый сценарий bash должен находиться в таком каталоге, как /opt/local/bin/
это может быть изменено только пользователем root. Если вы храните в скажем ~/bin
обычный пользователь может изменить скрипт (или переименовать файл / каталог и заменить его на файл, который он написал) и получить полный доступ к вашей системе.
/etc/ppp/ip-up
для сценария перед подключением, и /etc/ppp/ip-down
для сценария после подключения. Не забудьте добавить бит разрешения на выполнение. Я использую их для изменения и восстановления таблицы маршрутов до и после PPTP и L2TP VPN-подключений.
После того, как вы написали два сценария с именем ip-up
а также ip-down
вы запускаете следующие команды в Terminal.app:
chmod +x ip-up ip-down
sudo cp ip-up ip-down /etc/ppp