Готовые команды для автоматической смены часового пояса при включении AmneziaVPN — и возврата обратно при отключении. Проверено и исправлено после разбора черновика.
utun с подсетью 10.x.x.x — признак поднятого туннеля Amnezia — система переключается на часовой пояс VPN. Как только маршрут исчезает, время мгновенно возвращается на домашний пояс. Скрипт работает как системная служба launchd, поэтому не зависит от открытого окна Терминала и переживает перезагрузку.
По умолчанию macOS сама выставляет часовой пояс по геолокации и не даёт скрипту его менять. Это нужно выключить вручную:
Иначе macOS будет просить пароль администратора каждые 3 секунды. Команда добавляет точечное правило только для systemsetup и сразу проверяет, что файл написан без ошибок:
echo "$(whoami) ALL=(ALL) NOPASSWD: /usr/sbin/systemsetup" | sudo tee /etc/sudoers.d/vpn_timezone > /dev/null
sudo chmod 440 /etc/sudoers.d/vpn_timezone
sudo visudo -cf /etc/sudoers.d/vpn_timezone
/etc/sudoers.d/vpn_timezone: parsed OK — это значит, что правило рабочее и не сломает sudo.Скопируйте блок целиком и вставьте в Терминал. Он создаст исполняемый файл ~/vpn_time.sh. Замените значения VPN_TZ и HOME_TZ, если нужны другие пояса.
cat << 'EOF' > ~/vpn_time.sh
#!/bin/bash
# Часовые пояса: свой и для VPN
VPN_TZ="America/New_York"
HOME_TZ="Europe/Moscow"
while true; do
if netstat -rn 2>/dev/null | grep "utun" | grep -q " 10\."; then
TARGET_TZ="$VPN_TZ"
else
TARGET_TZ="$HOME_TZ"
fi
CURRENT_TZ=$(sudo systemsetup -gettimezone | awk '{print $3}')
if [ "$CURRENT_TZ" != "$TARGET_TZ" ]; then
sudo systemsetup -settimezone "$TARGET_TZ"
fi
sleep 3
done
EOF
chmod +x ~/vpn_time.sh
Файл службы launchd запускает скрипт при загрузке Mac и мгновенно перезапускает его, если он вдруг завершится. Путь к скрипту подставляется автоматически — блок можно копировать на любой Mac без правок:
mkdir -p ~/Library/LaunchAgents
cat << EOF > ~/Library/LaunchAgents/com.user.vpntimezone.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.user.vpntimezone</string>
<key>ProgramArguments</key>
<array>
<string>$HOME/vpn_time.sh</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<true/>
<key>StandardOutPath</key>
<string>/tmp/vpn_timezone.log</string>
<key>StandardErrorPath</key>
<string>/tmp/vpn_timezone.err</string>
</dict>
</plist>
EOF
launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/com.user.vpntimezone.plist
/tmp/vpn_timezone.err.Подключите Amnezia и посмотрите на пояс в строке меню, либо спросите систему напрямую:
launchctl print gui/$(id -u)/com.user.vpntimezone | grep state
sudo systemsetup -gettimezone
Служба перезапускает себя сама (KeepAlive), поэтому обычный pkill её не остановит — она поднимется снова в течение секунды. Чтобы по-настоящему остановить или перезапустить, используйте launchctl.
| Что нужно | Команда |
|---|---|
| Проверить статус и последний код выхода | launchctl print gui/$(id -u)/com.user.vpntimezone |
| Остановить совсем (не будет перезапускаться) | launchctl bootout gui/$(id -u)/com.user.vpntimezone |
| Запустить снова после остановки | launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/com.user.vpntimezone.plist |
| Перезапустить прямо сейчас (после правки скрипта) | launchctl kickstart -k gui/$(id -u)/com.user.vpntimezone |
| Вручную поставить московское время | sudo systemsetup -settimezone Europe/Moscow |
| Посмотреть лог ошибок скрипта | cat /tmp/vpn_timezone.err |
Остановите службу, отредактируйте одну строку в скрипте, запустите снова:
launchctl bootout gui/$(id -u)/com.user.vpntimezone
nano ~/vpn_time.sh # поменяйте строку VPN_TZ="...", сохраните: Ctrl+O, Enter, Ctrl+X
launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/com.user.vpntimezone.plist
Черновик описывал рабочую идею, но два места ломали её на новом Mac или после включения автозапуска — вот что изменилось.
Если автоматизация больше не нужна — снимает службу, стирает скрипт, файл службы и разрешение на sudo:
Действие необратимо: скрипт и файлы будут удалены без возможности восстановить их из корзины.
launchctl bootout gui/$(id -u)/com.user.vpntimezone 2>/dev/null
rm -f ~/Library/LaunchAgents/com.user.vpntimezone.plist
rm -f ~/vpn_time.sh
sed -i '' '/vpn_time.sh/d' ~/.zshrc 2>/dev/null
sudo rm -f /etc/sudoers.d/vpn_timezone