выполнение HTTP-запросов с помощью cURL (с использованием PROXY)


451

У меня есть этот прокси-адрес: 125.119.175.48:8909

Как я могу выполнить HTTP-запрос, используя cURL как curl http://www.example.com, но указав адрес прокси моей сети?

Ответы:


411

Общий способ:

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

Затем вы можете подключиться через прокси из (многих) приложений.

И, согласно комментарию ниже, для https:

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

76
Когда вам нужен прокси HTTPS-трафик, переменная окружения должна быть в верхнем регистре: HTTPS_PROXY
— phatblat

18
Из справочных страниц Переменные среды могут быть указаны в нижнем или верхнем регистре. Версия в нижнем регистре имеет приоритет. http_proxy является исключением, поскольку он доступен только в нижнем регистре. Использование переменной окружения для установки прокси имеет тот же эффект, что и опция --proxy.
— Капитан Лептон

@BipinVayalu, что вы хотите проверить? Таким образом, как я описал выше, клиент использует прокси «прямой путь», а не прозрачно. Итак, прокси выдает стандартные HTTP-ответы (включая HTTP-коды). Если вы экспортируете неправильную переменную среды http_proxy (например, плохой порт ...), клиент не сможет подключиться к этому, и он выдаст сообщение об ошибке: «Предупреждение! Не удалось подключиться к удаленному хосту!», Или что-то подобное - просто попробовать :)
— airween

15
Если вы проверите исходный код curl, вы увидите в url.c (строка 4337 в версии 7.39), что они проверяют наличие строчной версии, а если они не могут ее найти, проверяют наличие заглавной буквы.
— Raistmaj

1
Большинство пользователей прислали мне исправление, теперь я им поделюсь. Если вы хотите использовать HTTPS-соединение через прокси-сервер, то вам следует сделать следующее: export https_proxy = your.proxy.server: port Обратите внимание, что в схеме URL есть протокол http, а не httpS!
— airween

664

От 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) не удалось подключиться к хосту curl: (7) не удалось подключиться к хосту
— user873286

Я получаю вышеуказанную ошибку при запуске этой команды: curl -x, --proxy 122.72.2.200:80 mysite.com/test.php?id=1
— user873286

61
«-x, --proxy» означает, что можно использовать любой из них. Команда должна быть либо "curl -x 122.72.2.200:80 mysite.com/test.php?id=1 ", либо "curl --proxy 122.72.2.200:80 mysite.com/test.php?id=1 "
— IBBoard

8
Документы указаны правильно, как указано выше, однако имя пользователя и пароль должны быть указаны по-разному:-x user:password@proxyhost:port
— Ed Chapel

Спасибо за лучший ответ!
— haotang

128

Вышеуказанные решения могут не работать с некоторыми версиями curl, которые я пробовал для себя (curl 7.22.0). Но то, что работало для меня, было:

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

Надеюсь, это решит проблему лучше!


Если столкнуться с той же проблемой, локон Debian Wheezy все еще не поддерживает трюк env
— hyperknot

Получил это вместо[1] 4812
— Aminah Nuraini

80

Помните, что если вы используете прокси-сервер SOCKS вместо HTTP / HTTPS-прокси, вам нужно будет использовать --socks5вместо этого переключатель:

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

Вы также можете использовать --socks5-hostnameвместо --socks5разрешения DNS на стороне прокси.


6
Это не сработало для меня, но с помощью --socks5-hostnameсделал.
— Михал Рыбак

2
@ MichałRybak, который будет работать так же, но разрешит DNS на стороне прокси. Смотрите man-страницу для более подробной информации.
— Филипе Коррейя

3
curl https://api.ipify.org --proxy socks5://189.100.246.182:37339кажется, работает нормально для меня. Есть --proxyвариант в некотором роде уступает --socks5при использовании SOCKS5 прокси?

@ user993683 Это зависит от версии. --proxyэто, вероятно, то, что вы хотите, сейчас, но это не всегда поддерживается. Также обратите внимание, что socks5://и socks5h://выполните разрешение имени хоста (DNS) до и после подключения к прокси, соответственно.
— Майкл - Где Клэй Ширки

51

в качестве дополнения к airween, еще одна хорошая идея - добавить это в ваш .bashrc, чтобы вы могли переключаться с непрокси-среды на прокси-среду:

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

WHERE YOURPROXY: YOURPORT это именно то, ваш IP и прокси порта :-).

Затем просто делать

proxyon

ваша система начнет использовать прокси, и наоборот:

proxyoff

34

используйте следующее

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

192.168.X.X:XX поставить свой прокси-сервер ip и порт.

-v В подробном режиме он даст больше деталей, включая заголовки и ответ.


2
Это должно быть ответом. Не каждый хочет указывать глобальную переменную (экспорт) для каждого HTTP-запроса, выполняемого каждым HTTP-клиентом на вашем хосте. Этот вариант дает большую гибкость, ИМХО.
— ivanleoncz

Это так полезно, когда вы пытаетесь использовать разные прокси для URL. Спасибо.
— redAce

29

ты можешь использовать :

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

как объяснил Карл


26
«как объяснил Карл», что означает, что этот ответ не лучше, чем копия этого ответа.
— Raedwald

26

Мне нравится использовать это для того, чтобы получить IP, под которым я вижу

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

Надеюсь, это кому-нибудь поможет.


19

Поскольку curlвы можете настроить прокси в своем ~/.curlrc( _curlrcв Windows) файле, добавив proxyзначение, синтаксис:

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

Это оно! Сконфигурировал настройку прокси несколько лет назад в этом файле и удивился сегодня, почему curl больше не работает, теперь адрес прокси изменился, и все env переменные настроены правильно. Спасибо за это!
— emale

15

Просто суммируя все замечательные упомянутые ответы:

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

8

С прокси с аутентификацией я использую:

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

потому что я не знаю, почему curl не использует / перехватывает переменные окружения http [s] _proxy .



3

Вам не нужно экспортировать http[s]_proxyпеременную оболочки, если вы просто устанавливаете прокси для команды off. например

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

Тем не менее, я бы предпочел, curl -xесли бы я знал, что я всегда буду использовать прокси.


2

В зависимости от вашего рабочего места вам также может потребоваться указать параметр -kили --insecureпараметр curl, чтобы устранить возможные проблемы с сертификатами CA.

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

У меня это отлично сработало, ошибка возникает из-за того, что curl нужно установить прокси

Помните, замените прокси на ваш прокси, мой «пример» был http://10.1.1.50:8080/ .


0

В случае, если прокси использует автоматический прокси с файлом PAC. Мы можем найти фактический прокси из javascript из URL PAC.

И если прокси-сервер нуждается в аутентификации, мы можем сначала использовать обычный веб-браузер для доступа к сайту, который будет продвигать диалог аутентификации. После аутентификации мы можем использовать wireshark для перехвата отправок пакета http на прокси-сервер, из пакета http мы можем получить токен аутентификации из заголовка http: Proxy-Authorization

Затем мы можем установить переменную среды http_proxy, а также включить токен авторизации в заголовок http: Proxy-Authorization

экспорт http_proxy = http: // proxyserver: порт

curl -H "Прокси-авторизация: xxxx" http: // targetURL

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.