wykonywanie żądań HTTP za pomocą cURL (przy użyciu PROXY)


451

Mam ten adres proxy: 125.119.175.48:8909

Jak mogę wykonać żądanie HTTP przy użyciu cURL curl http://www.example.com, ale podając adres proxy mojej sieci?

Odpowiedzi:


411

Ogólny sposób:

export http_proxy=http://your.proxy.server:port/

Następnie możesz połączyć się przez proxy z (wielu) aplikacji.

I, zgodnie z komentarzem poniżej, dla https:

export https_proxy=https://your.proxy.server:port/

76
Kiedy potrzebujesz proxy ruchu HTTPS, zmienna środowiskowa ma duże litery: HTTPS_PROXY
phatblat

18
Ze stron podręcznika Zmienne środowiskowe można określić małymi lub dużymi literami. Wersja z małymi literami ma pierwszeństwo. http_proxy jest wyjątkiem, ponieważ jest dostępny tylko małymi literami. Użycie zmiennej środowiskowej do ustawienia proxy ma taki sam efekt, jak użycie opcji --proxy.
Kapitan Lepton,

@BipinVayalu, co chcesz sprawdzić? W ten sposób, co opisuję powyżej, klient używa proxy „bezpośrednio”, a nie w sposób transparentny. Tak więc serwer proxy podaje standardowe odpowiedzi HTTP (w tym kody HTTP). Jeśli wyeksportujesz niepoprawną zmienną środowiskową http_proxy (np. Zły port ...), klient nie będzie mógł się z nią połączyć i wyświetli komunikat o błędzie: „Ostrzeżenie! Nie można połączyć się ze zdalnym hostem!” Lub coś podobnego - po prostu spróbuj :)
lot między

15
Jeśli sprawdzisz kod źródłowy curl, zobaczysz w url.c (wiersz 4337 w wersji 7.39), że sprawdzają wersję pisaną małymi literami, a jeśli nie mogą jej znaleźć, sprawdzają wielkie litery.
Raistmaj

1
Większość użytkowników przesłała mi poprawkę, teraz ją udostępniam. Jeśli chcesz korzystać z połączenia HTTPS przez serwer proxy, wykonaj następujące czynności: wyeksportuj https_proxy = your.proxy.server: port Uwaga : w schemacie URL jest proto „http”, a nie httpS!
lot między

662

Od man curl:

-x, --proxy <[protocol://][user:password@]proxyhost[:port]>

     Use the specified HTTP proxy. 
     If the port number is not specified, it is assumed at port 1080.

curl: (7) nie można połączyć się z hostem curl: (7) nie można połączyć się z hostem
użytkownik873286

Występuje błąd powyżej po uruchomieniu tego polecenia: curl -x, --proxy 122.72.2.200:80 mysite.com/test.php?id=1
user873286

61
„-x, --proxy” oznacza, że ​​można użyć dowolnego z nich. Poleceniem powinno być „curl -x 122.72.2.200:80 mysite.com/test.php?id=1 ” lub „curl --proxy 122.72.2.200:80 mysite.com/test.php?id=1
IBBoard,

8
Dokumenty są poprawnie cytowane, jak wyżej, jednak użytkownik i hasło powinny być wyrażone inaczej:-x user:password@proxyhost:port
Ed Chapel

Dzięki za najlepszą odpowiedź!
haotang

128

Powyższe rozwiązania mogą nie działać z niektórymi wersjami curl, które sam wypróbowałem (curl 7.22.0). Ale dla mnie zadziałało:

curl -x http://proxy_server:proxy_port --proxy-user username:password -L http://url

Mam nadzieję, że to rozwiązuje problem lepiej!


Jeśli napotkasz ten sam problem, loki wysłane przez Debian Wheezy nadal nie obsługują sztuczki env
hyperknot

Mam to zamiast tego[1] 4812
Aminah Nuraini

80

Uwaga: jeśli używasz proxy SOCKS, zamiast proxy HTTP / HTTPS, musisz użyć --socks5przełącznika:

curl --socks5 125.119.175.48:8909 http://example.com/

Możesz także użyć --socks5-hostnamezamiast --socks5do rozwiązania DNS po stronie proxy.


6
Nie działało to dla mnie, ale używanie działało --socks5-hostname.
Michał Rybak

2
@ Michał Rybak, który będzie działał tak samo, ale rozwiąże DNS po stronie proxy. Zobacz stronę podręcznika, aby uzyskać więcej informacji.
Filipe Correia,

3
curl https://api.ipify.org --proxy socks5://189.100.246.182:37339wydaje mi się, że działa dobrze. Czy --proxyopcja jest w jakiś sposób gorsza niż w --socks5przypadku korzystania z serwerów proxy socks5?

@ user993683 To zależy od wersji. --proxyjest prawdopodobnie tym, czego chcesz teraz, ale nie zawsze było obsługiwane. Należy również pamiętać, że socks5://i socks5h://wykonać rozpoznawanie nazwy hosta (DNS) odpowiednio przed i po połączeniu z serwerem proxy.
Michael - Where's Clay Shirky

51

jako dodatek do airween, innym dobrym pomysłem jest dodanie tego do twojego .bashrc, abyś mógł przełączyć się z środowiska bez proxy na proxy:

alias proxyon="export http_proxy='http://YOURPROXY:YOURPORT';export https_proxy='http://YOURPROXY:YOURPORT'"
alias proxyoff="export http_proxy='';export https_proxy=''"

GDZIE TWOJA PROPORCJA: TWOJE SPRAWOZDANIE to dokładnie to, twój adres IP i port proxy :-).

Potem po prostu robię

proxyon

Twój system zacznie używać proxy, i odwrotnie:

proxyoff

34

użyj następujących

curl -I -x 192.168.X.X:XX http://google.com

192.168.X.X:XX podaj adres IP i port serwera proxy.

-v tryb pełny poda więcej szczegółów, w tym nagłówki i odpowiedź.


2
To powinna być odpowiedź. Nie każdy chce określić zmienną globalną (eksport) dla każdego żądania HTTP wykonanego przez każdego klienta HTTP na twoim hoście. Ta opcja daje większą elastyczność, IMHO.
ivanleoncz

Jest to bardzo przydatne, gdy próbujesz różnych serwerów proxy przeciwko adresowi URL. Dzięki.
redAce

30

możesz użyć :

curl http://www.example.com --proxy http://125.119.175.48:8909

jak wyjaśnił Karl


25
„zgodnie z wyjaśnieniem Karla”, co oznacza, że ​​ta odpowiedź nie jest lepsza niż kopia tej odpowiedzi.
Raedwald

26

Lubię to używać, aby uzyskać adres IP, pod którym jestem widziany

curl -x http://proxy_server:proxy_port https://api.ipify.org?format=json && echo

Mam nadzieję, że to komuś pomoże.


19

Aby curlskonfigurować proxy w pliku ~/.curlrc( _curlrcw systemie Windows), dodając proxywartość, składnia jest następująca:

proxy = http://username:password@proxy-host:port

Otóż ​​to! Skonfigurowałem ustawienia proxy kilka lat temu w tym pliku i zastanawiałem się dzisiaj, dlaczego curl już nie działa, teraz zmienił się adres proxy, a zmienne env są ustawione poprawnie. Dziękuję za to!
emale

15

Podsumowując wszystkie świetne wspomniane odpowiedzi:

curl -x http://<user>:<pass>@<proxyhost>:<port>/ -o <filename> -L <link>

8

Z proxy z uwierzytelnianiem korzystam:

curl -x <protocol>://<user>:<password>@<host>:<port> --proxy-anyauth <url>

ponieważ nie wiem, dlaczego curl nie używa zmiennych środowiskowych / catch http [s] _proxy .



3

Nie musisz eksportować http[s]_proxyzmiennej powłoki, jeśli tylko ustawiasz proxy dla jednorazowej komendy. na przykład

http_proxy=http://your.proxy.server:port curl http://www.example.com

Powiedziałbym, że wolałbym, curl -xgdybym wiedział, że zawsze będę korzystać z serwera proxy.


2

W zależności od miejsca pracy może być konieczne określenie opcji -klub --insecureopcji zwijania, aby uniknąć potencjalnych problemów z certyfikatami urzędu certyfikacji.

curl -x <myCompanyProxy>:<port> -k -O -L <link to file to download>

1
sudo curl -x http://10.1.1.50:8080/ -fsSL https://download.docker.com/linux/ubuntu/gpg

To działało idealnie dla mnie, pojawia się błąd, ponieważ curl musi ustawić proxy

Pamiętaj, aby zastąpić serwer proxy swoim serwerem, mój, „przykładem” był http://10.1.1.50:8080/ .


0

W przypadku, gdy serwer proxy używa automatycznego serwera proxy z plikiem PAC. Rzeczywiste proxy możemy znaleźć w javascript z adresu URL PAC.

A jeśli serwer proxy wymaga uwierzytelnienia, możemy najpierw użyć zwykłej przeglądarki internetowej, aby uzyskać dostęp do strony internetowej, która promuje dialog uwierzytelniania. Po uwierzytelnieniu możemy użyć wireshark do przechwycenia wysyłanych pakietów HTTP do serwera proxy, z pakietu http możemy uzyskać token uwierzytelnienia z nagłówka http: Autoryzacja proxy

Następnie możemy ustawić zmienną środowiskową http_proxy, a także dołączyć token autoryzacji do nagłówka http: Autoryzacja proxy

eksport http_proxy = http: // serwer proxy: port

curl -H "Autoryzacja serwera proxy: xxxx" http: // targetURL

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.