Как заставить curl игнорировать прокси?


107

Как заставить curl игнорировать прокси? Установка $ NO_PROXY, похоже, не работает для меня.


1
Если вы предоставите дополнительную информацию, это поможет людям ответить вам. На какой платформе вы находитесь? Откуда curl берет настройки прокси? Какой протокол (HTTP, FTP)? Какой прокси (HTTP, SOCKS)? Это прозрачный прокси? Можете ли вы показать точный набор команд, отражающих вашу проблему, вместе с их выводом?
Брайан Кэмпбелл,

Ответы:


55

Я предполагаю, что curl считывает адрес прокси из переменной среды http_proxyи что переменная должна сохранять свое значение. Затем в оболочке, такой как bash, export http_proxy='';до того, как команда (или в сценарии оболочки) временно изменит свое значение.

(См. Руководство по curl для всех переменных, на которые он смотрит, под ENVIRONMENTзаголовком.)


19
Или простоunset http_proxy
joelittlejohn

Одно замечание: есть и другие переменные env * _proxy, например ftp_proxy. Думаю, вот полный список wiki.archlinux.org/index.php/proxy_settings .
Дмитриусан

Если вы не хотите переопределять http_proxy в каждом конкретном случае, вы можете настроить игнорирование доменов с помощью $ no_proxy, а затем присвоить псевдоним вашему curl: alias curl = 'curl --noproxy $ no_proxy'
Sir4ur0n

1
@jdebon Это не работает, если у вас есть подстановочный знак в этой переменной среды, по причинам, описанным ниже ( stackoverflow.com/a/17710829/2189128 ).
Джефф

@Jeff Это не мой случай, но хорошее место, это может вызвать проблемы у других людей. Спасибо!
Sir4ur0n

248

Если у вас curlхотя бы версия 7.19.4, вы можете просто использовать --noproxyфлаг.

curl --noproxy "*" http://www.stackoverflow.com

Из мануала .


5
curl: option --noproxy: is unknown
Roger Ng

2
@RogerNg, если руководство или использование изменились с тех пор, как я ответил на вопрос, не стесняйтесь обновить ответ или написать свой собственный. Тем не менее, на момент написания этот ответ был точным для заданного вопроса. Если ваша установка не соответствует спецификациям, это совершенно другая проблема.
Скотт Оффен

3
curl --noproxy stackoverflow.com stackoverflow.com Это правильный ответ.
arulraj.net 01

2
Я предполагаю, что эта --noproxyопция недоступна для более старых версий curl (например, тех, которые используются в Centos / RHEL 5.x)
Дмитриусан

2
Согласно документации, единственный способ, с которым это могло когда-либо работать, --noproxy 127.0.0.1- это если stackoverflow.com работал на localhost.
dannysauer

72

Я столкнулся с той же проблемой, потому что установил переменные среды http_proxy и https_proxy. Но иногда я подключаюсь к другой сети, и мне нужно временно обойти прокси. Самый простой способ сделать это (без изменения переменных среды):

curl --noproxy '*' stackoverflow.com

Из руководства: «Единственный подстановочный знак - это один символ *, который соответствует всем хостам и эффективно отключает прокси».

Символ * заключен в кавычки, чтобы оболочка не расширила его по ошибке.


12
примечание для пользователей furture: Bash расширяет локальные файлы, если я не процитирую * socurl --noproxy "*" stackoverflow.com
Адам

Очень полезно и стоит отметить, что при этом игнорируется прокси (SOCKS), который я установил в моем файле
.curlrc

1
Это ответ, который сработал для меня при использовании curl версии 7.22.0
xpereta


12

Добавьте свои настройки прокси в .curlrc

proxy = 1.2.3.4
noproxy = .dev,localhost,127.0.0.1

Это заставляет все домены разработчиков и запросы локального компьютера игнорировать прокси.


1
//, это единственное, что показывает пример со значением, значение DNS которого начинается с ..
Натан Басанезе,

Не путать с переменной env no_proxy (с подчеркиванием)
Симон Перепелица

7

Длинный выстрел, но попробуйте установить прокси-сервер на "" (пустая строка), который должен переопределить любые настройки прокси в соответствии со страницей руководства.


2
Это не «дальний план» - это правильный способ сделать это. Согласно моей странице руководства curl (7.15.5, которая не показывает параметр '--noproxy'), -x / - proxy <proxyhost [: port]> ... Эта опция переопределяет существующие переменные среды, которые устанавливают прокси в использовать. Если есть переменная среды, задающая прокси, вы можете установить прокси на "", чтобы переопределить его.
Роб Крэнфилл

5
В 2009 году все было под угрозой.
Луи

5
+1, -x "" делает это. --noproxy с подстановочными знаками не работает с моим bash, даже если я цитирую «*»
Евгений

@Eugene: Он работает в bash 4.3.11, и его нужно цитировать.
karatedog

7

Вы должны использовать $no_proxyпеременную env (в нижнем регистре). Пожалуйста, обратитесь к https://wiki.archlinux.org/index.php/proxy_settings для примеров.

Кроме того, давным-давно была ошибка в curl http://sourceforge.net/p/curl/bugs/185/ , возможно, вы используете старую версию curl, которая включает эту ошибку.


6

Во-первых, я перечислил текущие настройки прокси с помощью

env | sort | less

(должно быть что-то вроде http_proxy=http://wpad.local.machine.location:port number)

Затем я попытался установить

export http_proxy=";" 

который дал это сообщение об ошибке:

curl: (5) Couldn't resolve proxy ';'

Пытался

export http_proxy="" && curl http://servername:portnumber/destinationpath/ -d 55

и это сработало!

PS! Не забудьте вернуть http-прокси к исходным настройкам с помощью

export http_proxy=http://wpad.local.machine.location:port number

6

У меня есть http_proxyи https_proxyопределены. Я не хочу сбрасывать и снова устанавливать эти среды, но --noproxy '*' для меня это отлично работает.

curl --noproxy '*' -XGET 172.17.0.2:9200
{
  "status" : 200,
  "name" : "Medusa",
  "cluster_name" : "elasticsearch",
  "version" : {
    "number" : "1.5.0",
    "build_hash" : "544816042d40151d3ce4ba4f95399d7860dc2e92",
    "build_timestamp" : "2015-03-23T14:30:58Z",
    "build_snapshot" : false,
    "lucene_version" : "4.10.4"
  },
  "tagline" : "You Know, for Search"
}

1

Неудачный ответ, но: не забудьте убедиться, что в ~/.curlrcфайле не установлен прокси (...).


1
Спасибо. Я ломал голову, почему curl не соблюдает местные условия. А потом я просмотрел .curlrc и там было несколько дополнительных конфигураций. Добавил туда no_proxy и все заработало!
n3o

1

В моем случае (macos, curl 7.54.0) у меня установлен прокси ниже с~/.bash_profile

$ env |grep -i proxy |cut -d = -f1|sort
FTP_PROXY
HTTPS_PROXY
HTTP_PROXY
NO_PROXY
PROXY
ftp_proxy
http_proxy
https_proxy
no_proxy

По неизвестной причине эта версия curlне может работать с переменными среды NO_PRXYи no_proxyдолжным образом, затем я сбрасываю переменные среды прокси одну за другой, пока оба HTTPS_PROXYи https_proxy.

unset HTTPS_PROXY
unset https_proxy

он начинает работать и может подключаться к внутренним URL-адресам

Поэтому я бы рекомендовал отключить все переменные прокси, если в вашей среде есть временное решение.

unset http_proxy https_proxy HTTP_PROXY HTTPS_PROXY

-1

Мой curl не игнорировал прокси в Ubuntu 12.04, пока я не установил переменную среды «no_proxy» (нижний регистр). Параметр --noproxy был недоступен.

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