ChatGPT解决这个技术问题 Extra ChatGPT

performing HTTP requests with cURL (using PROXY)

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?


B
Ben G

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.

curl: (7) couldn't connect to host curl: (7) couldn't connect to host
I get above error when I run this command: curl -x, --proxy 122.72.2.200:80 mysite.com/test.php?id=1
"-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"
The docs are correctly quoted as above, however, the user and password should be expressed differently: -x user:password@proxyhost:port
if you need to curl and get via proxy do curl -x GET mysite.com --proxy yourproxy:port
a
airween

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/

When you need to proxy HTTPS traffic, the environment variable is upper case: HTTPS_PROXY
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.
@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 :)
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.
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!
A
Amar

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!


Run into the same issue, the curl shipped by Debian Wheezy still doesn't support the env trick
Got this instead [1] 4812
F
Filipe Correia

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.


This didn't work for me, but using --socks5-hostname did.
@MichałRybak that will work the same but resolve DNS on the proxy side. See the man page for more details.
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 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.
A
Alejandro Moreno

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

unset http_prox ;) !
your system will start to use the proxy not completely correct, you will start/stop only in current shell and subshells
C
Community

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.


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.
This is so useful when you're trying different proxies against an url. Thanks.
b
bmetge

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.


k
kenorb

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

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!
On Windows, the "_curlrc" file can (must?) be placed into the "%APPDATA%" directory.
e
evandrix

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


Consider adding explanation to your solution.
M
Morteza Mashayekhi

Just summarizing all great mentioned answers:

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

P
Pedro R. Sánchez A.

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.


o
overthink

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.


e
evandrix

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


I
IbarMario
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/.


M
Matt Legler

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>

J
Jianwu Chen

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


S
S.B
curl -x socks5://username:password@ip:port example.com