Scripting Windows Telnet Client: Alternatives for Automated Command Execution in Batch Files


2 views

The built-in Windows Telnet client (telnet.exe) is fundamentally designed for interactive sessions and lacks native scripting capabilities. Unlike Unix/Linux telnet clients which often support command-line parameters for automation, the Windows version doesn't accept piped input or command files directly.

Common approaches that fail with Windows Telnet:

# This WON'T work:
echo open 192.168.1.1 > commands.txt
echo username >> commands.txt  
echo password >> commands.txt
telnet < commands.txt

The client immediately closes after connection because it doesn't process sequential commands properly.

1. Using Plink (PuTTY Link)

Plink from PuTTY suite handles automation perfectly:

plink -telnet 192.168.1.1 -l username -pw password -m commands.txt

Sample commands.txt:

enable
config t
interface gig0/1
no shutdown
exit
write memory

2. PowerShell Telnet Alternatives

For modern Windows systems, PowerShell's TCP client works well:

$socket = New-Object System.Net.Sockets.TcpClient("192.168.1.1", 23)
$stream = $socket.GetStream()
$writer = New-Object System.IO.StreamWriter($stream)
$writer.WriteLine("username")
$writer.WriteLine("password")
$writer.WriteLine("show version")
Start-Sleep -Seconds 2
$reader = New-Object System.IO.StreamReader($stream)
$reader.ReadToEnd()

3. Python Telnetlib

For cross-platform scripting:

import telnetlib

tn = telnetlib.Telnet("192.168.1.1")
tn.read_until(b"Username: ")
tn.write(b"username\n")
tn.read_until(b"Password: ")
tn.write(b"password\n")
tn.write(b"show run\n")
print(tn.read_all().decode('ascii'))

For environments where third-party tools can't be installed, try:

powershell -Command "$ws = New-Object -ComObject WScript.Shell; $ws.SendKeys('open 192.168.1.1{ENTER}')"

Note this requires carefully timed delays and isn't reliable for production use.

For enterprise environments, Plink offers the best balance of security and reliability. Development teams should prefer Python for cross-platform compatibility. The key factors are:

  • Authentication method (password/certificate)
  • Output capture needs
  • Error handling requirements

The built-in Windows Telnet client (telnet.exe) lacks native scripting capabilities, making automated command execution challenging. While it's useful for manual connections, attempting to script it results in several issues:

  • No direct command-line parameter support for sending commands
  • No built-in way to pipe input or capture output
  • Interactive session requirements prevent simple automation

1. PowerShell Telnet Alternatives

For modern Windows systems, PowerShell provides better alternatives:


# Using Test-NetConnection as basic telnet replacement
Test-NetConnection -ComputerName example.com -Port 23

# Custom TCP client implementation
$client = New-Object System.Net.Sockets.TcpClient("example.com", 23)
$stream = $client.GetStream()
[System.Text.Encoding]::ASCII.GetBytes("usernamern") | ForEach-Object {$stream.Write($_, 0, $_.Length)}

2. Plink (PuTTY Link)

From the PuTTY suite, Plink handles automated telnet sessions:


plink.exe -telnet example.com -batch -m commands.txt

Where commands.txt contains:


username
password
show system
exit

3. Python Telnetlib

For cross-platform scripting, Python's telnetlib is robust:


import telnetlib

tn = telnetlib.Telnet("example.com")
tn.read_until(b"login: ")
tn.write(b"username\n")
tn.read_until(b"Password: ")
tn.write(b"password\n")
tn.write(b"show system\n")
tn.write(b"exit\n")
print(tn.read_all().decode('ascii'))

For sessions requiring more complex interaction patterns:


# Expect-like behavior in Python
import pexpect

child = pexpect.spawn('telnet example.com')
child.expect('login: ')
child.sendline('username')
child.expect('Password: ')
child.sendline('password')
child.expect('> ')
child.sendline('show version')
print(child.before)

Production scripts should include proper error handling:


try:
    with telnetlib.Telnet("example.com", 23, timeout=10) as tn:
        # Session commands here
except ConnectionRefusedError:
    print("Connection refused - check server availability")
except TimeoutError:
    print("Connection timed out - check network connectivity")