602

I have this proxy address: 125.119.175.48:8909

How can I perform a HTTP request using cURL like curl http://www.example.com, but specifying the proxy address of my network?

0

19 Answers 19

815

From 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.
6
  • curl: (7) couldn't connect to host curl: (7) couldn't connect to host
    – user873286
    Commented Feb 27, 2012 at 22:50
  • I get above error when I run this command: curl -x, --proxy 122.72.2.200:80 mysite.com/test.php?id=1
    – user873286
    Commented Feb 27, 2012 at 22:52
  • 89
    "-x, --proxy" means that either one can be used. The command should be either "curl -x 122.72.2.200:80 mysite.com/test.php?id=1" or "curl --proxy 122.72.2.200:80 mysite.com/test.php?id=1"
    – IBBoard
    Commented Dec 4, 2012 at 11:39
  • 10
    The docs are correctly quoted as above, however, the user and password should be expressed differently: -x user:password@proxyhost:port
    – Ed Chapel
    Commented Sep 7, 2013 at 12:14
  • 1
    if you need to curl and get via proxy do curl -x GET mysite.com --proxy yourproxy:port
    – Ray
    Commented Sep 6, 2017 at 3:48
510

General way:

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

Then you can connect through proxy from (many) application.

And, as per comment below, for https:

export https_proxy=https://your.proxy.server:port/
13
  • 83
    When you need to proxy HTTPS traffic, the environment variable is upper case: HTTPS_PROXY
    – phatblat
    Commented Nov 14, 2012 at 16:38
  • 29
    From the man pages The environment variables can be specified in lower case or upper case. The lower case version has precedence. http_proxy is an exception as it is only available in lower case. Using an environment variable to set the proxy has the same effect as using the --proxy option. Commented Jun 19, 2013 at 14:23
  • @BipinVayalu, what do you want to check? At this way, what I describe above, the client uses the proxy "direct way", not transparently. So, the proxy gives the standard HTTP answers (including HTTP codes). If you export a wrong http_proxy environment variable (eg. bad port...), the client could't connet to that, and it gives an error message: "Warning! Couldn't connect to remote host!", or something similar - just try it :)
    – airween
    Commented May 23, 2014 at 9:18
  • 18
    If you check curl source code, you will see at url.c(line 4337 in verion 7.39) they check for lowercase version and if they can't find it, check for the uppercase.
    – Jose Palma
    Commented Nov 24, 2014 at 14:17
  • 1
    Most users sent me a correction, now I share that. If you want to use HTTPS connection through proxy, then you should do this: export https_proxy=your.proxy.server:port Note, that there is "http" proto in URL schema, not httpS!
    – airween
    Commented Aug 23, 2015 at 18:59
172

The above solutions might not work with some curl versions I tried them for myself(curl 7.22.0). But what worked for me was:

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

Hope it solves the issue better!

2
  • Run into the same issue, the curl shipped by Debian Wheezy still doesn't support the env trick
    – hyperknot
    Commented Aug 19, 2014 at 15:41
  • Got this instead [1] 4812 Commented Feb 19, 2017 at 21:07
115

Beware that if you are using a SOCKS proxy, instead of a HTTP/HTTPS proxy, you will need to use the --socks5 switch instead:

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

You can also use --socks5-hostname instead of --socks5 to resolve DNS on the proxy side.

4
  • 9
    This didn't work for me, but using --socks5-hostname did. Commented Apr 14, 2016 at 19:28
  • 3
    @MichałRybak that will work the same but resolve DNS on the proxy side. See the man page for more details. Commented Apr 15, 2016 at 9:32
  • 4
    curl https://api.ipify.org --proxy socks5://189.100.246.182:37339 seems to work fine for me. Is the --proxy option in some way inferior to --socks5 when using socks5 proxies?
    – user993683
    Commented Jul 5, 2017 at 12:38
  • @user993683 It's version-dependent. --proxy is probably what you want, now, but it wasn't always supported. Also note that socks5:// and socks5h:// perform hostname (DNS) resolution before and after connecting to the proxy, respectively. Commented May 9, 2019 at 16:23
63

as an adition to airween, another good idea is to add this into your .bashrc, so you'll be able to switch from non proxied to proxied environment:

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 is exactly that, your ip and port proxy :-).

Then, simply doing

proxyon

your system will start to use the proxy, and just the opposite with:

proxyoff
2
  • 3
    unset http_prox ;) !
    – cedrik
    Commented Nov 17, 2020 at 14:41
  • 3
    your system will start to use the proxy not completely correct, you will start/stop only in current shell and subshells Commented Jan 27, 2022 at 15:04
42

use the following

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

192.168.X.X:XX put your proxy server ip and port.

-v verbose mode it will give more details including headers and response.

2
  • 2
    This should be the answer. Not everyone wants to specify a global variable (export) for every HTTP request performed by every HTTP client on your host. This option gives more flexibility, IMHO.
    – ivanleoncz
    Commented Aug 22, 2017 at 15:44
  • This is so useful when you're trying different proxies against an url. Thanks.
    – redAce
    Commented Oct 2, 2018 at 13:51
31

I like using this in order to get the IP under which I am seen

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

Hope this helps someone.

27

For curl you can configure proxy in your ~/.curlrc (_curlrc on Windows) file by adding proxy value, the syntax is:

proxy = http://username:password@proxy-host:port
2
  • That's it! Configured the proxy setting some years ago in that file and wondered today, why curl doesn't work anymore now the proxy adress changed and the env vars are all set correct. Thanks for that!
    – emale
    Commented Mar 19, 2019 at 9:29
  • On Windows, the "_curlrc" file can (must?) be placed into the "%APPDATA%" directory.
    – Fred Danna
    Commented Oct 1, 2021 at 16:03
25

curl -I "https://www.google.com" -x 1.1.1.1:8080

1
  • 17
    Consider adding explanation to your solution.
    – Pochmurnik
    Commented Sep 6, 2019 at 9:58
16

Just summarizing all great mentioned answers:

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

With a proxy with authentication I use:

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

because, I don't know why curl doesn't use/catch http[s]_proxy environment variables.

5

You don't need to export the http[s]_proxy shell variable if you're just setting the proxy for a one off command. e.g.

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

That said, I'd prefer curl -x if I knew I was always going to use a proxy.

4
sudo curl -x http://10.1.1.50:8080/ -fsSL https://download.docker.com/linux/ubuntu/gpg

This worked perfectly for me, the error comes because curl need to set the proxy

Remmember replace the proxy with your proxy, mine, "example" was http://10.1.1.50:8080/.

4

curl -vv -ksL "https://example.com" -x "http://<proxy>:<port>"

2

Depending on your workplace, you may also need to specify the -k or the --insecure option for curl in order to get past potential issues with CA certificates.

curl -x <myCompanyProxy>:<port> -k -O -L <link to file to download>
1
curl -x socks5://username:password@ip:port example.com
1

For http proxy tunnels (needed for the TLS protocol), you need to specify -p (aka --proxytunnel) instead of -x.

curl post about proxies

tl;dr the proxy tunnel uses a newer "CONNECT" keyword instead of a modified "GET"

This was needed for the node http-proxy-middleware library.

Only got a clue once I used wget which worked out of the box.

0

In case the proxy is using automatic proxy with PAC file. We can find the actual proxy from the javascript from the PAC URL.

And if the proxy needs authentication, we can first use a normal web-browser to access the website which will promote authentication dialog. After authentication, we can use wireshark to capture the http package sends to the proxy server, from the http package, we can get the auth token from http header: Proxy-Authorization

Then we can set the http_proxy environment variable and also include auth token in the http header: Proxy-Authorization

export http_proxy=http://proxyserver:port

curl -H "Proxy-Authorization: xxxx" http://targetURL
0

If there are any proxy related environment variables set then they can interfere with curl's behaviour - notably no_proxy = '*' (or NO_PROXY) will disable the use of proxies by curl.

To ensure curl's behaviour is not affected by any environment variables - you should run the command prefixed with env -i which will clear the environment for the invocation of curl:

env -i curl -x your_proxy your_url

Note: If you run curl with the verbose option (-v) it will log if it is using the no_proxy (or NO_PROXY) variable. For example, if it was set (e.g. export no_proxy='*') you would see:

curl -v -x your_proxy your_url

* Uses proxy env variable no_proxy == '*'
...

Not the answer you're looking for? Browse other questions tagged or ask your own question.