I understood that you want just to log in to the computer C, not really tunnel anything from A to C. So, this should do the trick:
ssh -t computer-b "ssh computer-c"
You might have to enter passwords twice, first for computer B and then for computer C, but this can be avoided by using ssh's key-pair authentication.
It seems the difference has to do with the Content-Length
header and how it is treated by both commands.
But before going into that, curl -X HEAD
does not give any output because, by default, curl
does not print headers if switch -i
is not provided (not needed on -I
though).
In any case, curl -I
is the proper way to fetch the headers. It just ask for the header and close the connection.
On the other hand curl -X HEAD -i
will wait for the transmission of the number of bytes stated by Content-Length
. In the case no Content-Length
is not specified, I guess it will wait for some data or for that particular header.
Some examples that shows this behaviour:
$ curl -X HEAD -i http://www.elpais.es
HTTP/1.1 301 Moved Permanently
Server: AkamaiGHost
Content-Length: 0
Location: http://www.elpais.com/
Date: Wed, 12 May 2010 06:35:57 GMT
Connection: keep-alive
Because Content-Length
is 0, in this case both commands behave the same. And the connection is closed afterwards.
$ curl -X HEAD -i http://slashdot.org
HTTP/1.1 200 OK
Server: Apache/1.3.41 (Unix) mod_perl/1.31-rc4
SLASH_LOG_DATA: shtml
X-Powered-By: Slash 2.005001296
X-Bender: Since I love you all so much, I'd like to give everyone hugs.
X-XRDS-Location: http://slashdot.org/slashdot.xrds
Cache-Control: no-cache
Pragma: no-cache
Content-Type: text/html; charset=iso-8859-1
Content-Length: 115224
Date: Wed, 12 May 2010 06:37:20 GMT
X-Varnish: 1649060825 1649060810
Age: 1
Connection: keep-alive
curl: (18) transfer closed with 115224 bytes remaining to read
In this case, there seems to be a timeout (probably by Varnish), so curl
protests that the connection was closed before having received the Content-Length
number of bytes.
By the way, look at the funny X-Bender (shown in the example) and X-Fry (try it for yourself) headers :).
Best Answer
Curl doesn't have this functionality, and in any case it would have to be a server option. In the case of HTTP, this means configuring a proxy of some kind. If you can't modify the server configuration or install a proxy, but you can SSH, then SSH is your only option.
To tunnel port 80 to your local machine via server1:
Then
curl localhost:8080
will send a request to port 80 on server2.Note; some server configurations will deny port forwarding to some or all users.