Как я могу игнорировать сообщения MOTD и Banner с моим скриптом Python / Paramiko? - PullRequest
0 голосов
/ 09 июля 2019

У меня есть скрипт, который читает файл host.csv с IP-адресами, подключается к каждому серверу по очереди и выполняет некоторые команды.Я хочу, чтобы вывод шел по имени файла, которое я указываю в raw_input в скрипте.Прямо сейчас я просто печатаю выходные данные, но я хочу сохранить все выходные данные в файл, КРОМЕ для информации о входе в систему (BANNER / MOTD) и временных отметок, которые происходят.Я работал над тем, чтобы заставить его печатать только выходные данные реальных команд, которые я выполняю на каждом блоке, но я не смог заставить его работать.

Я программировал на Pythonуже около 3 месяцев, и у меня был некоторый успех, но иногда я сталкиваюсь с препятствиями, которые я пока не могу преодолеть.

from __future__ import print_function
import threading
import paramiko
import getpass
import time
import os
import sys

os.system('clear')
class ssh(object):

    shell = None
    client = None
    transport = None

    def __init__(self, address, username, password):

        print('Connecting to server on ip', str(address) + '.')
        self.client = paramiko.client.SSHClient()
        self.client.set_missing_host_key_policy(paramiko.client.AutoAddPolicy())
        self.client.connect(address, username=username, password=password, look_for_keys=False)
        self.transport = paramiko.Transport((address, 22))
        self.transport.connect(username=username, password=password)

        thread = threading.Thread(target=self.process)
        thread.daemon = True
        thread.start()

    def close_connection(self):

        if(self.client != None):
            self.client.close()
            self.transport.close()

    def open_shell(self):

        self.shell = self.client.invoke_shell()
        #self.shell.recv(1000)

    def send_shell(self, command):

        if(self.shell):
            self.shell.send(command + '\n')
        else:
            print("Shell not opened.")

    def process(self):

        while True:
            # Print data when available
            if self.shell is not None and self.shell.recv_ready():
                alldata = self.shell.recv(1024)
                while self.shell.recv_ready():
                    alldata += self.shell.recv(1024)
                data = alldata.split(os.linesep)

                for line in data:
                    print(line)

header = "################## WHAT DO YOU WANT TO DO?? ##################"
headlen = len(header) - 2
secondline = "|" + (" " * headlen) + "|"
thirdline = "|" + "  1. Run the daily ATM Script." + (" " * 30) + "|"
fourthline = "|" + "  2. Run a single command on the entire ATM network" + (" " * 9) + "|"

print(header)
print(secondline)
print(secondline)
print(thirdline)
print(fourthline)
print(secondline)
print(secondline)
print("#" * len(header))

choice = raw_input("Choose your destiny: ")


while choice:
    if choice == "1":
            print('  \n##### STARTING PROGRAM #####\n')

            sshUsername = getpass.getpass(prompt='ENTER USERNAME:  ')
            sshPassword = getpass.getpass('ENTER PASSWORD:  ')
            filename = raw_input("What filename dost thou chooseth?")
            writefile = open(filename, 'a')

            def main():

                with open("host.csv", "r") as r:
                    for address in r:
                        print(address)
                        try:
                            connection = ssh(address, sshUsername, sshPassword)
                            try:
                                connection.open_shell()
                                time.sleep(1)
                                connection.send_shell('hardware cecplus timing references show')
                                time.sleep(1)
                                connection.send_shell('power')
                                time.sleep(1)
                                connection.send_shell('hard port show')
                                time.sleep(1)
                                connection.send_shell('sig show')
                                time.sleep(1)
                                connection.send_shell('conn spvcc pp show')
                                time.sleep(1)
                                connection.send_shell('interface sonet path near total')
                                time.sleep(1)
                            except:
                                print('Failed to run commands on:', r)
                        except:
                            print('Failed connection to:', r)
                        time.sleep(5)
                        connection.close_connection()

            main()



    elif choice == "2":

        COMMAND = raw_input("INPUT A SINGLE COMMAND TO RUN ON THE ENTIRE ATM NETWORK:" )

        if __name__ == '__main__':

                print('  \n##### STARTING PROGRAM #####\n')

                sshUsername = getpass.getpass(prompt='ENTER USERNAME:  ')
                sshPassword = getpass.getpass('ENTER PASSWORD:  ')

                def main():

                        with open("host.csv", "r") as r:
                            for address in r:
                                print(address)
                                try:
                                    connection = ssh(address, sshUsername, sshPassword)
                                    try:
                                        connection.open_shell()
                                        time.sleep(1)
                                        connection.send_shell(COMMAND)
                                        time.sleep(1)

                                    except:
                                        print('Failed to run commands on:', r)
                                except:
                                    print('Failed connection to:', r)
                                time.sleep(1)
                                connection.close_connection()

                main()



    else:
        print("If thou dost not Enter 1 or 2 thou willest not proceed")
        choice = input("Choose your destiny: ")

Текущие результаты просто распечатывают все, включая баннер иMOTD.Если я смогу распечатать вывод только из команд, которые я знаю, я могу записать эти выводы в файл.Я в основном хочу игнорировать сообщения MOTD и Banner.

...