8

I am having some issues trying to connect through telnet to a mail server.The main problem that I am having is that I need to create a script that logs me to the destination and I can't find a way to echo the password.

What I tried:

telnet host -l username ; echo 'password'

And still it asks for my password.Is there any way to fix this or I am doing something wrong?

5 Answers 5

16

First of all, you can use eval:

eval "{ echo user_name; sleep 1; echo pass; sleep 1; echo '?'; sleep 5; }" | telnet host_address

Make sure to replace user_name, pass, ? which is the command you want to run and host_address where your telnet host is listening; for me it is a local IP.

It’s surprisingly easy to script a set of command and pipe them into the telnet application. All you need to do is something like this:

(echo commandname;echo anothercommand) | telnet host_address

The only problem is the nagging login that you have to get through… it doesn’t show up right away. So if you pipe in an “echo admin” and then “echo password,” it will happen too quickly and won’t be sent to the server. The solution? Use the sleep command!

Adding in a couple of sleep 3 commands, to wait three seconds, solves the problem. First we’ll echo the username and password, and then we’ll echo the reboot command, and each time we’ll wait three seconds between. The final command will reboot the server immediately:

(sleep 3;echo admin;sleep 3;echo mypassword;sleep 3;echo system reboot;sleep 3;) | telnet host_address

You can put this into a shell script and run it whenever you want. Or you can add it to your cron like this (on OS X or Linux):

crontab -e

Add this line somewhere:

1 7 * * * (sleep 3;echo admin;sleep 3;echo mypassword;sleep 3;echo system reboot;sleep 3;) | telnet host_address

This will reboot your router at 7:01 AM each morning.

4

Thanks to Harvix answer, I got knew that there is also expect alternative native for shell, called sexpect. Get it from here. Then create this script (I call it telnetpass):

#!/bin/bash
# This script is used for automatically pass authentication by username and password in telnet prompt
# Its goal is similar as sshpass, but for telnet, so I call it telnetpass

. ~/.private/cisco_pw # should contain PASSWORD variable

export SEXPECT_SOCKFILE=/tmp/sexpect-telnetpass-$$.sock
sexpect spawn telnet $1
sexpect expect -cstring 'Username:'
sexpect send -enter $USER 
sexpect expect -cstring 'Password:'
sexpect send -enter $PASSWORD
sexpect interact

Then you can run: telnetpass Host125 and got pass the authentication automatically

Trying 198.51.100.78 ...
Connected to Host125.
Escape character is '^]'.


User Access Verification

Username: ashark
Password: 

host-125>

I like this solution more than using sleep commands as suggested in another answers, because sleep solutions sometimes fail.

3

AFAIK, you won't be able to automate telnet that way. But it is still possible - even if it is a very bad idea (I'll elaborate on that later).

First why does your try fail :

  • you launched a telnet command reading from stdin (I suppose terminal) and writing to stdout and stderr (I suppose also a terminal)
  • if your telnet is reasonably recent, it tries to protect your authentication and asks your password from /dev/tty (for security reasons)
  • when that command has ended you write password on your own terminal

What should you do instead :

  • launch telnet with automatic authentication disable (on mine it is telnet -X SRA)
  • feed its input with the commands you want to pass
  • wait some delay before entering input, at least for login and password, because if you don't telnet clear input before reading and discards your inputs

Here is an example that allowed me to telnet to my own machine :

sh << EOF | telnet -X SRA localhost
sleep 2
echo my_user_name
sleep 1
echo my_password
# sleep 1 # looks like it can be removed
echo echo foo and bar
sleep 1
EOF

It correctly logs me into my box, executes echo foo and bar (essential command :-) ) and disconnects


Now why you should never do that :

  • you write a password in clear text in a script file which is poor security practice
  • you use telnet to do batch processing when it is not intended to be used that way : the script may not be portable to another telnet version

If you really want to pass command in a batch way to a remote server, you should instead try to use ssh which :

  • has options to process authentication securely (no password in script, nothing in clear text)
  • is intended to be used in batch mode as well as interactively

If you cannot use ssh (some sysadmin do not like to have uncontrolled input ssh connections) you could also try to use rsh. It is older, far less secure, but at least was designed for batch usage.

1
2

Have you tried using the expect command ?? You will have to create a script where you identify the 'expected' response from the server e.g. 'Password:' and then supply the password in the script. The following will explain: https://en.wikipedia.org/wiki/Expect - A good example is also shown here: http://en.kioskea.net/faq/4736-shell-script-for-telnet-and-run-commands

0
0

Try eval:

eval "{ echo; 
        sleep 3;
        echo $user; 
        sleep 1; 
        echo $pass; 
        sleep 1; 
        echo '?'; 
        sleep 1; }" | telnet your_host

In this example, my remote command is '?' (help).

The sleeps (maybe not all of them nor these times; trial-error...) are needed to avoid telnet misses some inputs.

The user and password are passed as variables ($user and $pass). Take into account security recommendations to store the password if you are scripting.

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