Как заставить 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

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

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

Wisbucky
источник
12
примечание для пользователей furture: Bash расширяет локальные файлы, если я не процитирую * socurl --noproxy "*" stackoverflow.com
Адам
Очень полезно и стоит отметить, что при этом игнорируется прокси (SOCKS), который я установил в моем файле
.curlrc
1
Это ответ, который сработал для меня при использовании curl версии 7.22.0
xpereta
23

Это работает нормально, установите строку прокси на ""

curl -x "" http://www.stackoverflow.com
эриккуртин
источник
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файле не установлен прокси (...).

jtlz2
источник
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
BMW
источник
-1

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

user2646026
источник