Команда 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'