[PYTHON] TELNET LIB SCRIPT (텔넷 자동 접속 후 명령어 실행 프로그램)
Programming/Python / 2010/09/15 21:14
PYTHON으로 REMOTE HOST에 접속하여, 명령어를 수행한 후 결과를 출력하는 프로그램이다.
PYTHON 2.4에서 시험하였으며, 3.X대와는 호환되지 않는다.
Telnet 연결시 타임아웃 처리 부분은 다음 사이트의 harookie님의 답글을 참조하였다.
http://python.kr/viewtopic.php?p=61182&sid=6096d8c4bba62ba532ad9bef051cb65b
PYTHON 2.4에서 시험하였으며, 3.X대와는 호환되지 않는다.
Telnet 연결시 타임아웃 처리 부분은 다음 사이트의 harookie님의 답글을 참조하였다.
http://python.kr/viewtopic.php?p=61182&sid=6096d8c4bba62ba532ad9bef051cb65b
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# contact : revoman@naver.com
# version : 1.0
# date : 2010-09-15
#
import sys
import os
import telnetlib
import socket
import getopt
class Telnet(telnetlib.Telnet):
def __init__(self, host=None, port=0, timeout=10):
telnetlib.Telnet.__init__(self)
if host is not None:
self.open(host, port, timeout)
def open(self, host, port=0, timeout=10):
self.eof = 0
if not port:
port = telnetlib.TELNET_PORT
self.host = host
self.port = port
msg = "getaddrinfo returns an empty list"
for res in socket.getaddrinfo(host, port, 0, socket.SOCK_STREAM):
af, socktype, proto, canonname, sa = res
try:
self.sock = socket.socket(af, socktype, proto)
self.sock.settimeout(timeout)
self.sock.connect(sa)
except socket.error, msg:
if self.sock:
self.sock.close()
self.sock = None
continue
break
if not self.sock:
raise socket.error, msg
if __name__ == '__main__':
version = "1.0"
new_line_cnt = 0
login_prompt = "login: "
passwd_prompt = "Password: "
command_prompt = "> "
userid = ""
passwd = ""
cmd = ""
ip = ""
port = 23
timeout = 10
basename = "oa_telnet_script.py"
optlist, arglist = getopt.getopt(sys.argv[1:], 'nhl:o:u:p:c:t:L:P:C:')
usage = """
Version : %s
Usage: %s -l hostip [-o port] -u username -p password -c "command" [-t conn_timeout] [-L login prompt] [-P passwd prompt] [-C command prompt] [-n]
-l host ip address
-p host port number
-u host login id
-p host login pw
-c command for running on the host
-t connection timeout seconds
-h print this usage
-L set login prompt
-P set password prompt
-C set command prompt
-n add newline after command
Example: %s -l "127.0.0.1" -u user -p 1234 -c "ls" -t 10
""" % (version, basename, basename)
if (len(sys.argv) < 9 ):
print usage
sys.exit(1)
cmd_list = [ ]
for o, a in optlist:
if o == '-h':
print usage
sys.exit(0)
elif o == '-l':
ip = a
elif o == '-o':
port = int(a)
elif o == '-u':
userid = a
elif o == '-p':
passwd = a
elif o == '-c':
cmd = a
cmd_list.append(cmd)
elif o == '-t':
timeout = int(a)
elif o == '-L':
login_prompt = a
elif o == '-P':
passwd_prompt = a
elif o == '-C':
command_prompt = a
elif o == '-n':
new_line_cnt = new_line_cnt+1
else:
print usage
sys.exit(1)
# print "info: %s %d %s %s %s %d" % (ip, port, userid, passwd, cmd, timeout)
if (len(ip)==0 or len(userid)==0 or len(passwd)==0):
print usage
sys.exit(1)
# LOGIN ID
tn = Telnet(ip, port, timeout)
response = tn.read_until(login_prompt, timeout)
if login_prompt not in response :
print "Error: get login prompt fail, -L option to change login prompt"
tn.close()
sys.exit(1)
tn.write("%s\n" % userid)
# LOGIN PASSWORD
response = tn.read_until(passwd_prompt, timeout)
if passwd_prompt not in response :
print "Error: get password prompt fail, -P option to change password prompt"
tn.close()
sys.exit(1)
tn.write("%s\n" % passwd)
# GET PROMPT
response = tn.read_until(command_prompt, timeout)
if command_prompt not in response :
print "Error: get command prompt fail, -C option to change command prompt"
tn.close()
sys.exit(1)
# RUN COMMAND
for cmd in cmd_list:
tn.write("%s\n" % cmd)
for x in range(new_line_cnt):
tn.write("\n")
response = tn.read_until(command_prompt, timeout)
if command_prompt not in response :
print "Error: get command prompt fail"
tn.close()
sys.exit(1)
print response
tn.close()
# -*- coding: utf-8 -*-
#
# contact : revoman@naver.com
# version : 1.0
# date : 2010-09-15
#
import sys
import os
import telnetlib
import socket
import getopt
class Telnet(telnetlib.Telnet):
def __init__(self, host=None, port=0, timeout=10):
telnetlib.Telnet.__init__(self)
if host is not None:
self.open(host, port, timeout)
def open(self, host, port=0, timeout=10):
self.eof = 0
if not port:
port = telnetlib.TELNET_PORT
self.host = host
self.port = port
msg = "getaddrinfo returns an empty list"
for res in socket.getaddrinfo(host, port, 0, socket.SOCK_STREAM):
af, socktype, proto, canonname, sa = res
try:
self.sock = socket.socket(af, socktype, proto)
self.sock.settimeout(timeout)
self.sock.connect(sa)
except socket.error, msg:
if self.sock:
self.sock.close()
self.sock = None
continue
break
if not self.sock:
raise socket.error, msg
if __name__ == '__main__':
version = "1.0"
new_line_cnt = 0
login_prompt = "login: "
passwd_prompt = "Password: "
command_prompt = "> "
userid = ""
passwd = ""
cmd = ""
ip = ""
port = 23
timeout = 10
basename = "oa_telnet_script.py"
optlist, arglist = getopt.getopt(sys.argv[1:], 'nhl:o:u:p:c:t:L:P:C:')
usage = """
Version : %s
Usage: %s -l hostip [-o port] -u username -p password -c "command" [-t conn_timeout] [-L login prompt] [-P passwd prompt] [-C command prompt] [-n]
-l host ip address
-p host port number
-u host login id
-p host login pw
-c command for running on the host
-t connection timeout seconds
-h print this usage
-L set login prompt
-P set password prompt
-C set command prompt
-n add newline after command
Example: %s -l "127.0.0.1" -u user -p 1234 -c "ls" -t 10
""" % (version, basename, basename)
if (len(sys.argv) < 9 ):
print usage
sys.exit(1)
cmd_list = [ ]
for o, a in optlist:
if o == '-h':
print usage
sys.exit(0)
elif o == '-l':
ip = a
elif o == '-o':
port = int(a)
elif o == '-u':
userid = a
elif o == '-p':
passwd = a
elif o == '-c':
cmd = a
cmd_list.append(cmd)
elif o == '-t':
timeout = int(a)
elif o == '-L':
login_prompt = a
elif o == '-P':
passwd_prompt = a
elif o == '-C':
command_prompt = a
elif o == '-n':
new_line_cnt = new_line_cnt+1
else:
print usage
sys.exit(1)
# print "info: %s %d %s %s %s %d" % (ip, port, userid, passwd, cmd, timeout)
if (len(ip)==0 or len(userid)==0 or len(passwd)==0):
print usage
sys.exit(1)
# LOGIN ID
tn = Telnet(ip, port, timeout)
response = tn.read_until(login_prompt, timeout)
if login_prompt not in response :
print "Error: get login prompt fail, -L option to change login prompt"
tn.close()
sys.exit(1)
tn.write("%s\n" % userid)
# LOGIN PASSWORD
response = tn.read_until(passwd_prompt, timeout)
if passwd_prompt not in response :
print "Error: get password prompt fail, -P option to change password prompt"
tn.close()
sys.exit(1)
tn.write("%s\n" % passwd)
# GET PROMPT
response = tn.read_until(command_prompt, timeout)
if command_prompt not in response :
print "Error: get command prompt fail, -C option to change command prompt"
tn.close()
sys.exit(1)
# RUN COMMAND
for cmd in cmd_list:
tn.write("%s\n" % cmd)
for x in range(new_line_cnt):
tn.write("\n")
response = tn.read_until(command_prompt, timeout)
if command_prompt not in response :
print "Error: get command prompt fail"
tn.close()
sys.exit(1)
print response
tn.close()



oa_telnet_script.py