Linux Script Telnet Head Request

Scripting an HTTP header request with netcat

You need two lots of "\r\n", and also to tell netcat to wait for a response. printf "HEAD / HTTP/1.0\r\n\r\n" |nc -n -i 1 10.1.1.2 80 or similar should work.

How to send an HTTP request using Telnet

telnet ServerName 80


GET /index.html↵

↵ means 'return', you need to hit return twice

How to get telnet execution result code from shell script?

Telnet is exceptionally difficult to script in this way, there is a high degree of asynchronicity with the time it takes to establish a connection and for your intended actions to complete. expect was created for exactly this kind of purpose. You launch a program, like telnet, then declare a series of expectations - eg, when 'username: ' is emitted from the program, and an action to trigger (eg: typing in the username).

There are also libraries or wrappers for expect in many languages:

  • python expect
  • ruby expect
  • perl expect

Here is an example that drives telnet to make an HTTP HEAD request:

set timeout 20

spawn telnet localhost 80

expect "Connected to "
send "HEAD / HTTP/1.0\r\n\r\n"

expect "HTTP 200 OK"

Given all of this, I feel I must point out that telnet is considered insecure. Ssh is a much better choice and supports better choices for authentication (eg: public/private key auth), restrictions for commands that can be run (via .ssh/authorized_keys). With ssh, and ssh-keys set up, your script reduces to a single shell command:

ssh user@hostname ls

ssh has great support for safe, secure remote command execution.

bash and telnet to test an email

Try doing this :

[[ $4 ]] || {
printf "Usage\n\t$0 <domain> <email> <from_email> <rcpt_email>\n"
exit 1
}
{
sleep 1
echo "helo $2"
sleep 0.5
echo "mail from:<$3>"
sleep 0.5
echo "rcpt to:<$4>"
echo
} | telnet $1 25 |
grep -q "Unknown user" &&
echo "Invalid email" ||
echo "Valid email"

Usage :

./script.sh domain email from_email rcpt_email

Shell script - Force HTTP 1.1 pipelining in curl, nc or telnet

From Wikipedia:

HTTP pipelining is a technique in which multiple HTTP requests are sent on a single TCP (transmission control protocol) connection without waiting for the corresponding responses.

To send multiple GET requests with netcat, something like this should do the trick:

echo -en "GET /index.html HTTP/1.1\r\nHost: example.com\r\n\r\nGET /other.html HTTP/1.1\r\nHost: example.com\r\n\r\n" | nc example.com 80

This will send two HTTP GET requests to example.com, one for http://example.com/index.html and another for http://example.com/other.html.

The -e flag means interpret escape sequences (the carriage returns and line feeds, or \r and \n). The -n means don't print a newline at the end (it would probably work without the -n).

I just ran the above command and got two responses from this, one was a 200 OK, the other was a 404 Not Found.

It might be easier to see the multiple requests and responses if you do a HEAD request instead of a GET request. That way, example.com's server will only respond with the headers.

echo -en "HEAD /index.html HTTP/1.1\r\nHost: example.com\r\n\r\nHEAD /other.html HTTP/1.1\r\nHost: example.com\r\n\r\n" | nc example.com 80

This is the output I get from the above command:

$ echo -en "HEAD /index.html HTTP/1.1\r\nHost: example.com\r\n\r\nHEAD /other.html HTTP/1.1\r\nHost: example.com\r\n\r\n" | nc example.com 80
HTTP/1.1 200 OK
Content-Encoding: gzip
Accept-Ranges: bytes
Age: 355429
Cache-Control: max-age=604800
Content-Type: text/html; charset=UTF-8
Date: Mon, 24 Feb 2020 14:48:39 GMT
Etag: "3147526947"
Expires: Mon, 02 Mar 2020 14:48:39 GMT
Last-Modified: Thu, 17 Oct 2019 07:18:26 GMT
Server: ECS (dna/63B3)
X-Cache: HIT
Content-Length: 648

HTTP/1.1 404 Not Found
Accept-Ranges: bytes
Age: 162256
Cache-Control: max-age=604800
Content-Type: text/html; charset=UTF-8
Date: Mon, 24 Feb 2020 14:48:39 GMT
Expires: Mon, 02 Mar 2020 14:48:39 GMT
Last-Modified: Sat, 22 Feb 2020 17:44:23 GMT
Server: ECS (dna/63AD)
X-Cache: 404-HIT
Content-Length: 1256

If you want to see more details, run one of these commands while wireshark is running. The request is sent in No. 7 (highlighted) and the two responses are received on No. 11 and No. 13. screenshot of wireshark

How to create a HTTP Request in Telnet

I am interested in scripting a HTTP Request to a listening web service I wrote (for testing purposes). I want to do this in Powershell.

then leave telnet alone :)

PowerShell(v3+) has built-in cmdlets:

  • Invoke-WebReques
  • Invoke-RestMethod

Or you can use System.Net.Sockets.TcpClient

  • Replacing Telnet.exe (now removed from Vista)
  • Scripting Network / TCP Connections in PowerShell

Or System.Net.WebClient

  • More advanced HTTP scripting: Facebook Photo Album Downloader

PS:

Lee Holmes in action :D

Content-Length header with HEAD requests?

To me it looks like the HTTP 1.1 RFC is pretty specific:

The Content-Length
entity-header field indicates the size of the entity-body, in decimal
number of OCTETs, sent to the recipient or, in the case of the HEAD
method, the size of the entity-body that would have been sent had
the request been a GET
.



Related Topics



Leave a reply



Submit