Este programa es para iniciar sesión en mi conmutador y copia la salida a un archivo; y la segunda parte es para encontrar una palabra clave e imprimir la línea completa. Cuando ejecuto el código, la primera parte funciona bien, pero la segunda parte del código no imprime la línea que contiene la palabra clave que estoy buscando. Sin embargo, cuando ejecuto la segunda parte del código por separado, puedo imprimir la línea que contiene la palabra clave. ¿Que esta mal aquí? ¿Por favor, ayúdame?

import paramiko
import sys
import re

host = "15.112.34.36"
port = 22
username = "admin"
password = "ssmssm99"

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(host, port, username, password)

commands = ["switchshow"]
for command in commands:
    print(command)
    sys.stdout = open('zones_list.txt', 'w')
    stdin, stdout, stderr = ssh.exec_command(command)
    lines = stdout.readlines()
    lines = "".join(lines)

    print(lines)
    ssh.close()

#SECOND PART
#open the zone_list file and search for a keyword
#search for wwn and print the entire line --> doesnt print why?
wwn = "10:00:00:90:fa:73:df:c9"
with open('zones_list.txt', 'r') as f:
    lines = f.readlines()
    for line in lines:
        if re.search(r'10:00:00:90:fa:73:df:c9', line):
            print (line)
            break
-1
redpy 2 mar. 2021 a las 21:04

3 respuestas

La mejor respuesta

Está redirigiendo stdout a un archivo en la línea 17:

    sys.stdout = open('zones_list.txt', 'w')

Todas las declaraciones de impresión posteriores no se escriben en la consola, sino en el archivo.

En segundo lugar, abre el mismo archivo dos veces, una para escribir y otra para leer, pero en el segundo caso, f.readlines () devuelve una lista vacía.


Ejemplo para mostrar por qué es problemático abrir el archivo dos veces.

import sys

# 1. Opening the file without closing it => will be closed at the end of the program
# 2. stdout now writes into the file
sys.stdout = open('text3', 'w')

# Will be writen into the file when the program finishes
print ('line1')
print ('line2')

# We open the file a second time
with open('text3', 'r') as f:
    # lines will always be an empty list, no matter if there was something in the file before
    lines = f.readlines()
    # Writing to stderr so we see the output in  the console (stdout still points at the file)
    sys.stderr.write('length: {}'.format(len(lines)))
    for line in lines:
        # We should never be here
        sys.stderr.write (line)

# write some more stuff the the file
for i in range(1, 6):
    print ('i + {}'.format(i))
print('line3')
0
DerMaddi 4 mar. 2021 a las 13:55

Entendí el código correctamente. Y un par de preguntas para molestarte a ti y a Maddi.

Este código le pide al usuario que ingrese el "wwn" para buscar en el host e imprima la línea que contiene el número "wwn".

Pregunta 1: Ejecutaría este código varias veces cada vez que quisiera buscar "wwn" ... Y aquí me gustaría tener un archivo claro "zones_list.txt" cada vez que empiezo. Así que abrí el archivo en modo 'w', así que esto se borra cada vez, ¿verdad? ¿Alguna otra sugerencia?

Pregunta 2: ¿Existe alguna otra forma de almacenar la salida y buscar una cadena e imprimir la salida? Supongo que almacenar los datos en un archivo y buscarlos es lo mejor.

Pregunta 3: Me gustaría agregar una GUI donde se le pide al usuario que ingrese "wwn" e imprima la salida. ¿Cualquier sugerencia?

Gracias de nuevo :)

import paramiko
import sys
import re

#host details to fetch data - nodefind
host = "15.112.34.36"
port = 22
username = "admin"
password = "ssmssm99"

#shell into the client host
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(host, port, username, password)

#asking user to enter the wwn to search in the host
wwn = input('Enter the wwn to be searched >')
#for example command is: nodefind 20:34:00:02:ac:07:e9:d5
commands = ["nodefind " + wwn, "switchshow"]
f =open('zones_list.txt', 'w')
for command in commands:
    print(command)
    stdin, stdout, stderr = ssh.exec_command(command)
    lines = stdout.readlines()
    lines = "".join(lines)
    print(lines, file=open('zones_list.txt', 'a'))
ssh.close()

#print a particular line in console to the user
f =open('zones_list.txt', 'r')
for line in f:
    if wwn in line:
        print(line)
        break
0
redpy 4 mar. 2021 a las 13:55

La primera parte del script redirigió stdout al archivo. Entonces print(line) en la segunda parte también está escribiendo en el archivo en lugar de mostrar la línea correspondiente. Además, nunca cerró el archivo en la primera parte, por lo que la salida almacenada en búfer no se escribirá en el archivo.

No use sys.stdout en la primera parte, use una variable ordinaria.

Otro problema es que está sobrescribiendo el archivo para cada comando en commands. Debe abrir el archivo una vez antes del bucle, no cada vez a través del bucle.

wwn no es una expresión regular, no es necesario utilizar re.search(). Solo usa if wwn in line:. Y no necesita usar f.readlines(), simplemente recorrer el archivo en sí.

import paramiko
import sys

host = "15.112.34.36"
port = 22
username = "admin"
password = "ssmssm99"

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(host, port, username, password)

commands = ["switchshow"]
with open('zones_list.txt', 'w') as f:
    for command in commands:
        print(command)
        stdin, stdout, stderr = ssh.exec_command(command)
        lines = stdout.readlines()
        lines = "".join(lines)

        print(lines, file=f)
        ssh.close()

#SECOND PART
#open the zone_list file and search for a keyword
#search for wwn and print the entire line --> doesnt print why?
wwn = "10:00:00:90:fa:73:df:c9"
with open('zones_list.txt', 'r') as f:
    for line in f:
        if wwn in line:
            print (line)
            break
0
Barmar 2 mar. 2021 a las 18:31