溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Python telnet實(shí)現(xiàn)登陸功能的方法

發(fā)布時(shí)間:2020-08-03 11:36:31 來源:億速云 閱讀:266 作者:小豬 欄目:開發(fā)技術(shù)

這篇文章主要講解了Python telnet實(shí)現(xiàn)登陸功能的方法,內(nèi)容清晰明了,對此有興趣的小伙伴可以學(xué)習(xí)一下,相信大家閱讀完之后會有幫助。

閱讀目錄

  主要使用TelnetClient類,封裝了登錄和執(zhí)行命令的基本操作。

  源碼如下,或請查看:scripts/telnet/telnet.py

telnet協(xié)議是TCP/IP協(xié)議族中的一員,是Internet遠(yuǎn)程登陸服務(wù)的標(biāo)準(zhǔn)協(xié)議和主要方式。它為用戶提供了在本地計(jì)算機(jī)上完成遠(yuǎn)程主機(jī)工作的能力。在終端使用者的電腦上使用telnet程序,用它連接到服務(wù)器。

終端使用者可以在telnet程序中輸入命令,這些命令會在服務(wù)器上運(yùn)行,就像直接在服務(wù)器的控制臺上輸入一樣,可以在本地就能控制服務(wù)器。要開始一個telnet會話,必須輸入用戶名和密碼來登錄服務(wù)器,Telnet是常用的遠(yuǎn)程控制Web服務(wù)器的方法。

代碼如下

#!/usr/bin/env python
# -*- coding:utf-8 -*-

import logging
import telnetlib
import time


# telnet登錄認(rèn)證相關(guān)
auth = {
 "user_prompt": b'Username:',      # 輸入用戶名提示
 "password_prompt": b'Password:',    # 輸入密碼提示
 "enter": b'\r',            # 回車
 "remote_enter": b'\n\r',
}


class TelnetClient(object):
  def __init__(self):
    self.tn = telnetlib.Telnet()    # Telnet client

  def login(self, ip, port, tel_dict):
    """
    telnet 登錄
    :param ip: 目標(biāo)ip
    :param port: 目標(biāo)端口
    :param tel_dict: 密碼字典
    :return: 登錄成功(True) or 登錄失敗(False)
    """
    msg = 'trying to login {}:{} telnet service'.format(ip, port)
    print(msg)

    # telnet登錄
    for username, password in tel_dict.items():

      # 創(chuàng)建一個telnet連接
      try:
        self.tn.open(ip, port)
      except:
        logging.warning('%s網(wǎng)絡(luò)連接失敗' % ip)
        return False, ''

      msg = 'try user:[{}], password:[{}]'.format(username, password)
      print(msg)

      # 登錄嘗試
      try:
        # 等待輸入用戶名提示user_prompt出現(xiàn)后,輸入用戶名
        self.tn.read_until(auth['user_prompt'], timeout=3)
        self.tn.write(username.encode('ascii') + auth['enter'])

        # 等待輸入密碼提示password_prompt出現(xiàn)后,輸入密碼
        self.tn.read_until(auth['password_prompt'], timeout=3)
        self.tn.write(password.encode('ascii') + auth['enter'])

        # 延時(shí)兩秒再收取返回結(jié)果,給服務(wù)端足夠響應(yīng)時(shí)間
        time.sleep(2)

        # 獲取登錄結(jié)果, read_very_eager()獲取到的是的是上次獲取之后本次獲取之前的所有輸出
        command_result = self.tn.read_very_eager().decode('ascii')
        # print('===>', command_result)
        prompt, _ = command_result.split('->')
        # print('===>', prompt.strip())

        # 如果返回的結(jié)果中沒有提示輸入用戶名,表示登錄成功
        if auth['user_prompt'] not in command_result.encode('ascii'):
          print('登錄成功')
          return True
        else:
          continue
      except:
        pass
    return False

  def execute_command(self, command):
    """
    執(zhí)行一些命令
    :param command: 要執(zhí)行的命令
    :return: None
    """
    try:
      self.tn.write(command.encode('ascii') + auth['enter'])
      time.sleep(2)
      # 獲取命令結(jié)果
      command_result = self.tn.read_very_eager().decode('ascii')
      print('==>', command_result)
    except:
      print('something went wrong...')
      pass

  # 退出telnet,保留
  def logout_host(self):
    self.tn.write(b"bye\r")

if __name__ == '__main__':

  # 參數(shù)
  ip = '172.16.176.120'
  port = '2570'
  tel_dict = {'admin': 'admin', 'aaa': 'bbb', '': ''}

  # 登陸
  tn = TelnetClient()
  tn.login(ip, port, tel_dict)

  # 執(zhí)行命令
  command = 'ver'
  tn.execute_command(command)

  # 退出
  tn.logout_host()

執(zhí)行輸出如下:

# python3 telnet_brute.py
trying to login 172.16.176.120:2570 telnet service
try user:[admin], password:[admin]
try user:[aaa], password:[bbb]
try user:[], password:[]
登錄成功
==> ver
 Version :PAS_SIPPROXY_6.0.0.3.0.190831, Compile Time: 16:18:41, Feb 25 2020
Return value: 1
SipPrxoy->

看完上述內(nèi)容,是不是對Python telnet實(shí)現(xiàn)登陸功能的方法有進(jìn)一步的了解,如果還想學(xué)習(xí)更多內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI