Jak mogę uzyskać informacje o serwerze proxy Mac OS X w skrypcie Bash?

13

Mam kilka lokalizacji sieciowych skonfigurowanych na moim laptopie: Praca, Dom itp. Wszystkie te w pracy mają skonfigurowany serwer proxy, podczas gdy inne nie. Działa to dobrze w aplikacjach OSX - Safari, Mail, a nawet Firefox i Thunderbird dzięki wtyczce Proxy systemu .

Do zastosowań końcowych, takich jak git, svn, gem, i curlmam następujących w moim .bash_profile:

export HTTP_PROXY='http://proxy.mycompany.com:80'
export http_proxy=$HTTP_PROXY

Moje pytanie brzmi: czy istnieje jakiś sposób, aby wyeksportowana zmienna szukała wartości z bieżącej lokalizacji mojego systemu? Wolałbym, żeby było to robione dynamicznie (więc jeśli zmienię lokalizacje podczas sesji terminalu, to się zmieni), ale byłbym zadowolony tylko z tej, która ustawiała go podczas .bash_profileuruchamiania (co oznacza, że ​​musiałbym rozpocząć nową sesję terminalową kiedy zmieniłem lokalizacje).

Dzięki!

James A. Rosen
źródło
Oto skrypt bash, który używa konfiguracji sieci i zabezpieczeń do wyodrębnienia informacji o serwerze proxy i ustawienia http_proxy i https_proxy: gist.github.com/alexargo/4657760

Odpowiedzi:

8

Jaka wersja Mac OS X? Nie jestem pewien, czy narzędzie jest zawarte w systemie Mac OS X 10.4 lub wcześniejszym.

networksetuppowinien być tym, czego szukasz, a mianowicie sudo networksetup -getwebproxy NAME_OF_NETWORK_DEVICE(np. sudo networksetup -getwebproxy Airport)

Dane wyjściowe są następujące:

Enabled: Yes
Server: SERVER_ADDRESS
Port: 123
Authenticated Proxy Enabled: 0 for false, 1 for true

Musisz więc przekonwertować dane wyjściowe na coś użytecznego.

Bardzo prymitywnym przykładem użycia awk kilka razy (moje umiejętności awk są raczej podstawowe) to:

sudo networksetup -getwebproxy Airport | awk {'print $2'} | awk {'getline l2; getline l3; print "http://"l2":"l3'} | head -n 1

Wynikiem jest wynik http://SERVER_ADDRESS:123

Chealion
źródło
6
Lista wszystkich usług:networksetup -listallnetworkservices
Arjan
2
Podoba mi się ten pomysł, ale dla mnie nie działa. Jeśli to zrobię sudo networksetup -getwebproxy Ethernet, dostanę wydruk, a następnie błąd. Wyobrażam sobie, że segfault powoduje pęknięcie rury, więc awknigdy nie dostaje się do analizy.
James A. Rosen
Czy są jakieś informacje wyjściowe? I czy nadal działa nieprawidłowo bez poleceń awk?
Chealion
Myślę, że raz widziałem ten błąd segmentacji na moich komputerach Mac. Nie mam teraz problemu z wersją 10.5.8 lub 10.6.1 (oba Intel). Może używasz innej wersji?
Arjan
Mam 10.5.8 i to się dzieje bez awk. Dodanie awk powoduje zniknięcie komunikatu segfault. . . wraz z wszystkimi innymi danymi wyjściowymi.
James A. Rosen
4

W odpowiedzi powyżej , jest komentarz od tlrobinson o tym, jak to nie zawiera numer portu.

Możesz to zrobić, wyłączając serwer proxy HTTP z portem proxy HTTP

Widziałem też, jak to zrobiono w następujący sposób:

system_profiler SPNetworkDataType | grep "HTTP Proxy Server" | awk '{print $4}' | head -1
system_profiler SPNetworkDataType | grep "HTTP Proxy Port" | awk '{print $4}' | head -1
Steve
źródło
3

Dodatkowo to polecenie może pomóc w wykryciu innych ustawień proxy: scutil --proxy

Brice
źródło
1

Wydaje się, że działają następujące, ale nie jestem pewien, jak solidne jest:

system_profiler SPNetworkDataType|grep "HTTP Proxy Server"|awk {'sub(/^.*:[ \t]*/, "", $0); print $0;'}

To nie działa, jeśli Twoja lokalizacja używa proxy.paczamiast zakodowanej lokalizacji proxy.

James A. Rosen
źródło
Niestety nie wydaje się, aby zawierał numer portu.
tlrobinson
0

Możesz użyć małego narzędzia , które napisałem, które ustawia często używane zmienne środowiskowe dla serwerów proxy. Użycie jest proste:

  1. Skompiluj go za pomocą xCode.
  2. Dodaj:

    eval `./path/to/export-proxies`

    Aplikacje .profile, .bashrclub .bash_profile.

Po tym można używać zmiennych jak $HTTP_PROXY, $http_proxy, $HttpProxy, itd. Dla wszystkich protokołów (HTTP, FTP, SOCKS) włącznie z $NO_PROXYwyjątkami. Działa to w przypadku większości narzędzi CLI i pobiera ustawienia z panelu sterowania OS X.

jan.vogt
źródło