Skip to content

Instantly share code, notes, and snippets.

@rz6agx
Created February 12, 2026 07:04
Show Gist options
  • Select an option

  • Save rz6agx/e68821b39d75f2732560e376c88ef5d4 to your computer and use it in GitHub Desktop.

Select an option

Save rz6agx/e68821b39d75f2732560e376c88ef5d4 to your computer and use it in GitHub Desktop.
Настройка алиасов для автоматического выбора активного сетевого интерфейса в macOS

Настройка алиасов для автоматического выбора активного сетевого интерфейса в macOS

Описание проблемы

Команда networksetup в macOS работает не с типами подключений (Wi‑Fi, Ethernet), а с именами сетевых сервисов.
Если прописать алиасы вроде:

alias proxyon="networksetup -setsocksfirewallproxy Wi-Fi localhost 1080 && networksetup -setsocksfirewallproxystate Wi-Fi on"
alias proxyoff="networksetup -setsocksfirewallproxystate Wi-Fi off"

то они будут работать только для Wi‑Fi. При подключении к проводной сети (Ethernet, USB LAN и т. д.) имя сервиса другое, и алиасы перестают работать. Задача — сделать алиасы, которые автоматически определяют активный сетевой сервис и включают/выключают SOCKS‑прокси именно на нём.

Первый вариант решения

Изначально использовался подход, который перебирал все сетевые сервисы и выбирал первый, у которого есть строка IP address:

alias proxyon='ACTIVE_SERVICE=$(networksetup -listallnetworkservices | grep -v "An asterisk" | while read service; do networksetup -getinfo "$service" | grep -q "^IP address:" && echo "$service" && break; done); [ -n "$ACTIVE_SERVICE" ] && networksetup -setsocksfirewallproxy "$ACTIVE_SERVICE" localhost 1080 && networksetup -setsocksfirewallproxystate "$ACTIVE_SERVICE" on || echo "Не удалось определить активный сетевой интерфейс"'

alias proxyoff='ACTIVE_SERVICE=$(networksetup -listallnetworkservices | grep -v "An asterisk" | while read service; do networksetup -getinfo "$service" | grep -q "^IP address:" && echo "$service" && break; done); [ -n "$ACTIVE_SERVICE" ] && networksetup -setsocksfirewallproxystate "$ACTIVE_SERVICE" off || echo "Не удалось определить активный сетевой интерфейс"'

Этот вариант работал, но имел недостаток: строка IP address: может присутствовать даже при отсутствии IP (none), что приводило к ложным срабатываниям.

Улучшённое решение

Чтобы сделать определение активного интерфейса надёжным, нужно:

  • проверять, что IP не пустой и не равен none;
  • оставить всю логику внутри алиаса, без вынесения в отдельную функцию;
  • сохранить читаемость и предсказуемость.

Итоговый вариант алиасов

alias proxyon='ACTIVE_SERVICE=$(
  networksetup -listallnetworkservices | grep -v "An asterisk" |
  while read service; do
    ip=$(networksetup -getinfo "$service" | awk -F": " "/IP address/ {print \$2}")
    if [[ -n "$ip" && "$ip" != "none" ]]; then
      echo "$service"
      break
    fi
  done
); \
if [[ -n "$ACTIVE_SERVICE" ]]; then
  echo "Активный интерфейс: $ACTIVE_SERVICE"
  networksetup -setsocksfirewallproxy "$ACTIVE_SERVICE" localhost 1080
  networksetup -setsocksfirewallproxystate "$ACTIVE_SERVICE" on
else
  echo "Не удалось определить активный сетевой интерфейс"
fi'

alias proxyoff='ACTIVE_SERVICE=$(
  networksetup -listallnetworkservices | grep -v "An asterisk" |
  while read service; do
    ip=$(networksetup -getinfo "$service" | awk -F": " "/IP address/ {print \$2}")
    if [[ -n "$ip" && "$ip" != "none" ]]; then
      echo "$service"
      break
    fi
  done
); \
if [[ -n "$ACTIVE_SERVICE" ]]; then
  echo "Активный интерфейс: $ACTIVE_SERVICE"
  networksetup -setsocksfirewallproxystate "$ACTIVE_SERVICE" off
else
  echo "Не удалось определить активный сетевой интерфейс"
fi'
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment