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

451

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

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

user873286
источник

Ответы:

411

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

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

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

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

export https_proxy=https://your.proxy.server:port/
airween
источник
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 В подробном режиме он даст больше деталей, включая заголовки и ответ.

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

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

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

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

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

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

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

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

bmetge
источник
19

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

proxy = http://username:password@proxy-host:port
kenorb
источник
Это оно! Сконфигурировал настройку прокси несколько лет назад в этом файле и удивился сегодня, почему 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 .

Педро Р. Санчес А.
источник
6
C:\Desktop>curl --head https://www.google.com/ --proxy 1.1.1.1:8080
Debashish Saha
источник
6
Попробуйте добавить объяснение к вашему решению.
Почмурник
3

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

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

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

overthink
источник
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/ .

IbarMario
источник
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

Цзяну Чен
источник