выполнение 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.